4

错误的html输出:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
...

主模板:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:t="http://myfaces.apache.org/tomahawk"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">

  <h:head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title><h:outputText value="dmw #{title}"/></title>
    <h:outputStylesheet library="#{uiSkin}" name="css/layout.css" />
    <h:outputStylesheet library="standard" name="css/developer.css"
                        rendered="#{developMode}" />

    ...
  </h:head>
  <h:body>

包含页面的示例:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:t="http://myfaces.apache.org/tomahawk"
  xmlns:a4j="http://richfaces.org/a4j"
  xmlns:rich="http://richfaces.org/rich">
  <ui:composition>
  ...
</ui:composition>
</html>

使用版本:

<jsf-api.version>2.1</jsf-api.version>
<jsf-impl.version>2.1.21</jsf-impl.version>
<richfaces.version>4.3.2.Final</richfaces.version> 
<prettyfaces.version>3.3.3</prettyfaces.version>
<tomahawk.version>1.1.14</tomahawk.version>

当我删除所有 ui:include 和 ui:insert 标签时,一切都很好。我建立了一个较小的测试项目,它也像怀疑的那样工作。加载包含的页面时似乎会发生错误。无法解析的 ui:insert 标签不会导致错误。我认为这与渲染配置有关。

我在 faces-config 中尝试了一些条目,但没有成功。以下条目删除了不需要的声明,但也删除了 doctype。

<faces-config-extension>
 <facelets-processing>
  <file-extension>.xhtml</file-extension>
  <process-as>xml</process-as>
 </facelets-processing>
</faces-config-extension>

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

我不知道它来自哪里?有人有线索吗?

4

1 回答 1

2

如果对 facelet 文件使用 'xml' 处理方法,则在处理过程中会使用 doctype 以及处理指令。请参阅此答案中的表格:https ://stackoverflow.com/a/10706157/801153 。

要重新应用 DOCTYPE 标签,您可以h:doctypehtml. 为此,您需要将标签括在标签中ui:composition,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets">

  <h:doctype rootElement="html" xmlns:h="http://java.sun.com/jsf/html" />

  <html lang="nl">

  ... page content ...

  </html>
</ui:composition>

此片段中的处理指令和 DOCTYPE 适用于 .xhtml 文件源内容,而不是生成的输出。如果您有 xhtml 格式的源文件,这些必须保留。

或者,您可以尝试使用 'html5' 类型,如上面链接答案中的表格中所指定的那样。如果您拥有或将源文件创建为 html5 文件,这将非常有用。当未指定任何内容时,这是默认处理方法。这将文档类型保留在简化版本中。但是,这也会将任何<?xml .. ?>处理指令传递给 html 输出(您的原始问题)。因此,您应该从源文件中删除这些处理指令。

于 2019-09-27T13:02:17.187 回答