哪个 XML 名称空间用于 JSF 2.2 及更高版本

Which XML namespace to use with JSF 2.2 and up

我已将我的应用程序从 JSF 1.2 迁移到 2.2。

它在 java.sun.com 域上使用了 XML 个名称空间,例如 xmlns:f="http://java.sun.com/jsf/core"。但是,Oracle's Java EE 7 tutorialxmlns.jcp.org 域上使用 XML 命名空间,例如 xmlns:f="http://xmlns.jcp.org/jsf/core".

推荐哪一个,为什么要更改?

Which one is recommended?

继续 xmlns.jcp.org 域上的 XML 个命名空间。这是自 2013 年 Java EE 7 以来新引入的(涵盖 a.o.JSF 2.2、Servlet 3.1、CDI 1.1 等)。请注意,这不仅会影响 Facelets 文件,还会影响 XML 配置文件,例如 faces-config.xml, web.xml, beans.xml

为了向后兼容,java.sun.com 上的旧 XML 命名空间仍然存在,但支持最终会在未来的 Java EE 版本中消失。您应该尽快迁移您的代码库。使用平均 IDE.

提供的 "find and replace in all files" 设施应该是一项微不足道的任务

只有较旧的 Mojarra 2.2.0 / 2.2.1 版本存在与 XML 命名空间更改相关的错误,但这些错误不应出现在较新的版本中。另见 a.o.

  • Using new xmlns.jcp.org namespace on composites causes java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.putIfAbsent
  • f:viewParam doesn't pass required parameter when new xmlns.jcp.org namespace is used
  • The metadata component needs to be nested within a f:metadata tag. Suggestion: enclose the necessary components within <f:metadata>

and why was this changed?

因为自 2010 年以来 Java 不再来自 Sun。请注意,他们很聪明没有做到 java.oracle.com 或与当前拥有的公司紧密耦合。它现在很好地独立地绑定到 JCP (Java Community Process),JCP 是真正负责管理 Java (EE) 规范的人。

对于具有命名空间 confusion/issue 的未来访问者:

我想强调找出要使用哪个命名空间的一般方法:

  • 如果您想使用来自 JSF HTML 标记库或 JSF 核心标记库的标记,请打开 JSF 实现 JAR(如 Oracle Mojarra、Apache MyFaces- myfaces-impl-2.3.1.jar)并找到标记库的.tld.xml 文件(您可以在 META-INF 目录下找到它)并使用那里提到的命名空间。
  • 如果您想使用 RichFaces 或 PrimeFaces,请打开它们的实现 JAR(如 richfaces-components-ui-4.0.0.Final.jarprimefaces-6.2.jar)并执行与上述相同的操作。

如果实现有 .tld(如 rich.tld),那么您可以使用 <uri> 元素的值,例如 <uri>http://richfaces.org/rich</uri>。如果实现有 .xml(如 rich.taglib.xml),那么您可以使用 <namespace> 元素的值,例如 <namespace>http://richfaces.org/rich</namespace>

我上面提到的内容与 JSF 严格相关,但通常也适用。关键是,如果您使用实现 JAR 中的名称空间,那么您永远不会 运行 出现问题。

我对所有新的官方oracle命名空间做了一个简单的总结:

<!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:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
    xmlns:p="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:cc="http://xmlns.jcp.org/jsf/composite"
    xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"      
    xmlns:jsf="http://xmlns.jcp.org/jsf">

    <!-- Content here -->
</html>

我将其用作所有 .xhtml 文件的模板。详情可查看官方facelet标签库:JavaServer Faces 2.2 Facelets Tag Library Documentation

希望这对您有所帮助:)