与 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.xml
、web.xml
、beans.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.jar
或 primefaces-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 中的命名空间,那么您将永远不会遇到问题。
【讨论】:
以上是关于与 JSF 2.2 及更高版本一起使用的 XML 命名空间的主要内容,如果未能解决你的问题,请参考以下文章
在 Apache Tomcat 7.0.42 及更高版本上部署 Mojarra 2.1.x 和 2.2 会导致 java.lang.UnsupportedOperationException
QuartzCore 框架与 Xcode 5 及更高版本中的 UIKit 框架捆绑在一起? [复制]
在 Android APK 2.2 及更高版本中保存和加载 Object[] 信息