我开始学习JavaServer Faces(JSF)。我正在使用GlassFish 3+。我刚刚在NetBeans中创建了一个新的JSF项目并运行该项目。它工作正常,但在检查XHTML输出时,我注意到XML声明留在了。这弄乱了DOCTYPE声明(它总是应该是文档中的第一个)。
JSF应该删除XML声明,还是我做错了什么?
答案 0 :(得分:11)
默认情况下,Facelets只会从合成(包含文件和复合组件)和标记文件中删除它。它不会从主模板中删除它。只需自己删除它。在编写HTML时,您根本不应该使用XML prolog。
是否将从主模板中删除XML序言在JSF 2.2 specification的附录1.1.1.1中指定,该附录描述了<facelets-processing>
中faces-config.xml
元素的配置。 XML prolog被描述为“处理指令”。在表中,您将看到仅在将模板作为XML或JSPX视图处理时才删除(使用)。
1.1.1.1
facelets-processing
元素
<facelets-processing>
元素用于影响Facelets VDL文件的处理。因此,这个设置 仅适用于那些到达FaceletsViewDeclarationLanguage
实现的请求,如指定的那样javax.faces.FACELETS_VIEW_MAPPINGS
和javax.faces.DEFAULT_SUFFIX
的运行时<context-param>
条目。该规范为Facelets文件定义了三种处理模式:Facelets XHTML 语法,XML视图语法和Facelets JSPX语法。最后一种语法旨在简化向Facelets的迁移 已经使用JSP文档语法的应用程序(也称为JSPX语法)。对文件处理的影响 在下表中指定了这三种模式中的每一种。Valid <process-as> values and their implications on the processing of Facelets. ----------------------------------------------------------------------------------------- <process-as> <process-as> <process-as> <process-as> html5</process-as> xhtml</process-as> xml</process-as> jspx</process-as> HTML 5 (default) Facelets XHTML XML View Facelets JSPX ----------------------------------------------------------------------------------------- XML Doctype Simplified to passed through consumed consumed <!DOCTYPE html> XML passed through passed through consumed consumed declaration Processing passed through passed through consumed consumed instructions CDATA passed through passed through consumed consumed section Escaping of escaped escaped escaped not escaped inline text XML passed through passed through consumed consumed Comments
在上表中,“传递”表示内容通过未修改传递给用户代理。 “consume”表示内容在服务器上以静默方式使用。请注意,对于CDATA部分,其内容 即使应该使用开始和结束标记,也会传递CDATA部分本身。 “逃脱”意味着 响应中的敏感内容会自动转义:例如
&
变为&
。 “未逃脱”意味着 这样的内容不会被转义。
换句话说,当您创作HTML5 / XHTML时,您必须自己删除它。实际上更好的措辞是:你不应该在HTML5和XHTML页面中包含XML prolog,因为这不是必需的;它只在XML和JSPX页面中需要(因此Facelets会自动删除它)。
无关,您应该使用<h:outputStylesheet>
而不是<link rel="stylesheet">
来独立于请求网址。
<h:outputStylesheet name="css/default.css" />
<h:outputStylesheet name="css/cssLayout.css" />
答案 1 :(得分:3)
为了让XML声明不出现在我呈现的页面上,我发现我可以配置JSF来处理我的.xhtml文件为XML。在XML模式下处理时,xml声明不会从源文件传递到输出。我还没有注意到做出这种改变的任何其他副作用。 (但如果我找到了,我会在这里跟进。)
为了更改配置,我在faces-config.xml中添加了以下内容:
<faces-config-extension>
<facelets-processing>
<file-extension>.xhtml</file-extension>
<process-as>xml</process-as>
</facelets-processing>
</faces-config-extension>
希望这有帮助