XML prolog /指令未从XHTML输出中删除

时间:2012-05-22 08:53:15

标签: xml jsf-2 facelets

我开始学习JavaServer Faces(JSF)。我正在使用GlassFish 3+。我刚刚在NetBeans中创建了一个新的JSF项目并运行该项目。它工作正常,但在检查XHTML输出时,我注意到XML声明留在了。这弄乱了DOCTYPE声明(它总是应该是文档中的第一个)。

enter image description here

JSF应该删除XML声明,还是我做错了什么?

2 个答案:

答案 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文件的处理。因此,这个设置   仅适用于那些到达Facelets ViewDeclarationLanguage实现的请求,如指定的那样   javax.faces.FACELETS_VIEW_MAPPINGSjavax.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部分本身。 “逃脱”意味着   响应中的敏感内容会自动转义:例如&变为&amp;。 “未逃脱”意味着   这样的内容不会被转义。

换句话说,当您创作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>    

希望这有帮助