与 JSF 2.2 及更高版本一起使用的 XML 命名空间

Posted

技术标签:

【中文标题】与 JSF 2.2 及更高版本一起使用的 XML 命名空间【英文标题】:Which XML namespace to use with JSF 2.2 and up 【发布时间】:2015-09-13 03:24:26 【问题描述】:

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

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

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

【问题讨论】:

如果您使用的是 JSF 2.2.x,请使用 http://xmlns.jcp.org/...。这是一个新的 JSF 2.2 东西(JSF 2.4 不存在,顺便说一句,你应该错误地输入了。它应该是 JSF 2.2.4)。 Jsf 2.4?最新的稳定版是 2.2,而 2.3 正在开发中。我认为你把事情搞混了。 2.2 已经有了jcp命名空间 是的,它是 2.2.4。是我打字的时候打错了。 【参考方案1】:

推荐哪一个?

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

java.sun.com 上的旧 XML 命名空间仍然存在以实现向后兼容性,但在未来的 Java EE 版本中最终将不再支持。您应该尽快迁移您的代码库。使用普通 IDE 提供的“在所有文件中查找和替换”功能应该是一项微不足道的任务。

只有较旧的 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>

为什么会改变?

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

【讨论】:

faces-config.xml、web.xml、beans.xml等需要做哪些改变?我做了快速检查,它似乎只是通过更改命名空间来工作。如果您可以分享任何合适的链接,将会很有帮助。【参考方案2】:

我对所有新的官方 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

希望这会有所帮助:)

【讨论】:

【参考方案3】:

对于未来有命名空间混淆/问题的访问者:

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

如果您想使用 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),那么您可以使用&lt;uri&gt; 元素的值,例如&lt;uri&gt;http://richfaces.org/rich&lt;/uri&gt;。如果实现有.xml(如rich.taglib.xml),那么您可以使用&lt;namespace&gt;元素的值,例如&lt;namespace&gt;http://richfaces.org/rich&lt;/namespace&gt;

我上面提到的内容与 JSF 密切相关,但总体上也适用。关键是,如果您使用实现 JAR 中的命名空间,那么您将永远不会遇到问题。

【讨论】:

以上是关于与 JSF 2.2 及更高版本一起使用的 XML 命名空间的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException

QuartzCore 框架与 Xcode 5 及更高版本中的 UIKit 框架捆绑在一起? [复制]

Mojarra 2.2 版本不同

在 Android APK 2.2 及更高版本中保存和加载 Object[] 信息

xml url在iis7x及更高版本上将http重写为https重定向

Linq 查询在 ASP.NET-Core 3.0 及更高版本中对数字等字符串进行排序