JavaServer Faces 2.2 复合组件使用封闭<html>的 ... </html> 标记呈现



在将项目从 JavaServer Faces 2.1/Java EE 5 迁移到 GlassFish 4 上的 JavaServer Faces 2.2/Java EE 7 Web 配置文件时,我遇到了无效的 HTML 代码,因为 JSF 代码中复合组件的每个实例都有额外的<html> ... </html>标记。

环境: Mojarra 2.2.0 (GlassFish 4.0), NetBeans 7.3.1, JDK 7

重现步骤:

  • 使用 JavaServer Faces 创建一个新的"Java EE 7 Web"项目,然后选择 JSF 2.2 服务器库
  • 在 index.html 中,选择 HTML 正文文本("来自 Facelets 的 Hello ")并重构为复合组件

示例源代码:

索引.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">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ez="http://xmlns.jcp.org/jsf/composite/ezcomp">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <ez:test/>
    </h:body>
</html>

测试.xhtml

<?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:cc="http://xmlns.jcp.org/jsf/composite">
    <!-- INTERFACE -->
    <cc:interface>
    </cc:interface>
    <!-- IMPLEMENTATION -->
    <cc:implementation>
        Hello from Facelets
    </cc:implementation>
</html>

实际的 HTML 输出:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head id="j_idt2">
        <title>Facelet Title</title></head><body><html xmlns="http://www.w3.org/1999/xhtml">
    <!-- INTERFACE -->
    <!-- IMPLEMENTATION -->
        Hello from Facelets
</html></body>
</html>

这不是有效的 HTML,因为复合组件存在另一个<html> ... </html>。我的 JSF 代码中是否有错误?

尝试使用

<ui:component
    xmlns="http://www.w3.org/1999/xhtml"
.....
>

请参阅此处的示例:http://balusc.blogspot.co.uk/2013/01/composite-component-with-multiple-input.html

最新更新