13

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

在此处输入图像描述

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

4

2 回答 2

12

默认情况下,Facelets 只会将其从组合(包括文件和组合组件)和标记文件中删除。它不会将其从主模板中删除。只需自己删除即可。编写 HTML 时根本不应该使用 XML 序言。

是否从主模板中删除 XML 序言在JSF 2.2 规范<facelets-processing>的附录1.1.1.1中指定,该规范描述了faces-config.xml. XML prolog 被描述为“处理指令”。在表中,您将看到仅当模板作为 XML 或 JSPX 视图处理时才被删除(使用)。

1.1.1.1facelets-processing元素

<facelets-processing>元素用于影响 Facelets VDL 文件的处理。因此,此设置仅适用于到达 Facelets 实现的那些请求,正如通过和条目ViewDeclarationLanguage指定给运行时的那样。该规范为 Facelets 文件定义了三种处理模式:Facelets XHTML 语法、XML View 语法和 Facelets JSPX 语法。最后一种语法旨在简化已经使用 JSP 文档语法(也称为 JSPX 语法)的应用程序向 Facelets 的迁移。这三种模式对文件处理的影响如下表所示。javax.faces.FACELETS_VIEW_MAPPINGSjavax.faces.DEFAULT_SUFFIX <context-param>

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 

在上表中,“通过”是指内容未经修改地传递给用户代理。“消费”意味着内容在服务器上被静默消费。请注意,对于 CDATA 部分,即使应该使用开始和结束标记,也会传递 CDATA 部分本身的内容。“转义”意味着响应中的敏感内容会自动转义:例如,&变为。&amp;“未转义”表示此类内容未转义。

换句话说,当您创作 HTML5/XHTML 时,您必须自己删除它。更好的措辞实际上是:您不应该在 HTML5 和 XHTML 页面中自己包含 XML 序言,因为这不是必需的;它仅在 XML 和 JSPX 页面中需要(因此 Facelets 会自动删除它)

也可以看看:


与具体问题无关,您应该使用<h:outputStylesheet>而不是<link rel="stylesheet">独立于请求 URL。

<h:outputStylesheet name="css/default.css" />
<h:outputStylesheet name="css/cssLayout.css" />

也可以看看:

于 2012-05-22T16:28:17.777 回答
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>    

希望这可以帮助

于 2012-12-12T16:37:12.893 回答