如何在JSF中使用EL内部的HTML字符实体?

Eli*_*les 5 facelets jsf-2

我想在组件的value属性中使用em dashh:link.

这是我的尝试(当前不起作用):

<h:link value="#{somethingHere} &mdash; #{anotherHere}">
    <f:param name="identifier" value="#{somethingHere.identifier}" />
</h:link>
Run Code Online (Sandbox Code Playgroud)

这导致FaceletsException:

FaceletException: Error Parsing /index.xhtml: Error Traced[line: 13]
                The entity "mdash" was referenced, but not declared.
at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:394)
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用HTML锚点,但是有没有办法在EL表达式中执行它?这样做的正确方法是什么?

Bal*_*usC 8

Facelets是基于XML的,由XML解析器处理.这&mdash;是一个HTML实体,无法在XML中识别.只有在列出的五个此维基百科页面,&quot;,&amp;,&apos;,&lt;&gt;,在XML的认可.

默认情况下,Facelets/XML使用UTF-8,因此您可以将实际字符显式/未编码放入模板中(前提是编辑器能够将文件另存为UTF-8).

<h:link value="#{somethingHere} — #{anotherHere}">
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因这不是一个选项,那么您可以改为使用格式中的数字字符引用&#nnnn;,就像&#160;用来表示&nbsp;XML 格式一样.您可以在fileformat.info中找到数字字符引用:Unicode Character'EM DASH'(U + 2014)

编码

HTML实体(十进制) &#8212;

所以,这应该适合你:

<h:link value="#{somethingHere} &#8212; #{anotherHere}">
Run Code Online (Sandbox Code Playgroud)

另一种应该更准确地满足确切错误消息的替代方法是在doctype中明确地声明实体引用.

<!DOCTYPE html [
    <!ENTITY mdash "&#8212;"> 
]>
Run Code Online (Sandbox Code Playgroud)

但这不是一般的建议/方法,因为您需要在使用该字符的每个XML文件上重复此操作.

  • 它显然需要使用此字符放在每个XML模板中,您不能只将它放在主模板中.我个人只是将`-`字符显式/未编码放在模板中.如果它失败了(Mojibake等),也许您需要重新配置编辑器以将文件保存为UTF-8.Facelets本身已经默认使用UTF-8来解析/提供XML文件. (2认同)