【问题标题】:How to specify the target DOCTYPE in JSF 2.2?如何在 JSF 2.2 中指定目标 DOCTYPE?
【发布时间】:2015-07-22 07:43:33
【问题描述】:

是否可以告诉 Mojarra 2.2 在生成的 html 页面中呈现哪个 DocType?

它似乎总是呈现以下 HTML5 Doctype:

<!DOCTYPE html>

在我们的 facelet 模板中,我们使用以下 DocType 声明,我们希望将其保留在生成的 HTML 中:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

模板:

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

<h:body>
  <ui:insert name="content">Will be replaced</ui:insert>
</h:body>
</html>

内容:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                template="/templates/standalone.xhtml">

    <ui:define name="content">
      <h:panelGroup>
        Foo
      </h:panelGroup>
    </ui:define>
</ui:composition>

结果:

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

我在 Mojarra 2.2.7 和 2.2.12 中使用 GlassFish 4.1 进行了尝试。

【问题讨论】:

  • 这不是默认行为。因此,如果您告诉确切的 Mojarra 版本,在问题中包含一个单文件 MVCE(即存在相当多的歧义,因为您在那里说“模板”),和/或同时尝试当前的最新版本( 2.2.12).
  • 我添加了一个示例并使用 Mojarra 2.2.12 进行了尝试,结果相同。
  • 我复制了它。这确实不是故意的行为。

标签: jsf-2.2 doctype mojarra


【解决方案1】:

我在将 JSF 生成的内容后处理为 PDF 格式时遇到了这个错误。我还注意到使用&lt;h:doctype&gt; 会生成两个文档类型。

幸运的是,我是一个后处理问题,我可以使用String.replace("&lt;!DOCTYPE html&gt;", XHTML_DOCTYPE) 来解决这个问题。在 servlet 环境中,您可能必须使用过滤器或包装 HttpServletResponse 来动态修改文档类型。或者您可以修复 JSF 实现。这将是最有意义的。

【讨论】:

    【解决方案2】:

    JIRA issue for this 看到这个链接:https://github.com/javaserverfaces/mojarra/issues/2824 并且它已被关闭,因为这是预期的行为。

    “复合页面是您实际使用模板的地方。因此它是您指定文档类型的最外层文件。因此它定义了将呈现的文档类型。”

    只需在模板中指定 DOCTYPE 即可

    【讨论】:

    • 我在模板和复合视图中使用相同的 DocType 声明。当 DocType 声明从复合视图中移除时,结果仍然是 &lt;!DOCTYPE html&gt;
    • 感谢您的链接。问题java.net/jira/browse/…的最后一条评论似乎和这个问题有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多