javax.faces.view.facelets.FaceletException:错误解析/template.xhtml:引用了实体"nbsp",但未声明

Ton*_*ony 5 jsf doctype html-entities jsf-2

在我的Facelets模板中,我使用了XHTML doctype:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

我想根据一般建议将其更改为HTML5 doctype:

<!DOCTYPE html>
Run Code Online (Sandbox Code Playgroud)

但是,JSF抛出了一个解析错误:

javax.faces.view.facelets.FaceletException:Error Parsing /template.xhtml:Error Traced [line:42]实体"nbsp"被引用,但未声明.

&nbsp;然后不解析HTML 实体.该实体使用如下:

<p:menuitem value="&nbsp;My menuitem">
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

Bal*_*usC 8

HTML5 doctype没有预定义的实体.它假定整个文档已经知道UTF-8.换句话说,您可以"安全地"在HTML5文档中放置真正的非破坏空格字符.然而,由于使用普通的美式键盘以可见的方式输入它并非易事,因此许多开发人员更喜欢使用实体来理解它是可以理解的.

反过来Facelets的支持作为一个基于XML的视图技术只有五个预定义的XML实体 &lt;,&gt;,&amp;,&quot;&apos;.在&nbsp;不在其中.

您有2个选项(除了第3个选项,只是在文档中直接打印字符):

  1. &nbsp;在doctype中自己声明实体:

    <!DOCTYPE html [
        <!ENTITY nbsp "&#xA0;"> 
    ]>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 或者,使用(hexa)十进制表示法:

    &#xA0; or &#160;
    
    Run Code Online (Sandbox Code Playgroud)