如何在JSF 2.2中指定目标DOCTYPE?

时间:2015-07-22 07:43:34

标签: jsf-2.2 doctype mojarra

是否有可能告诉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>

我使用GlassFish 4.1在Mojarra 2.2.7和2.2.12中尝试过它。

2 个答案:

答案 0 :(得分:1)

我在将JSF生成的内容后处理成PDF格式时遇到了这个错误。另外我注意到使用<h:doctype>会导致生成两个doctypes。

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

答案 1 :(得分:0)

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

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

只需在模板中指定DOCTYPE即可