我已经将我的应用程序从JSF 1.2迁移到了2.2。
它在java.sun.com
域上使用了类似于xmlns:f="http://java.sun.com/jsf/core"
的XML命名空间。然而,Oracle的JavaEE7教程在xmlns.jcp.org
域上使用了类似于xmlns:f="http://xmlns.jcp.org/jsf/core"
。
推荐哪一个?为什么要更改?
推荐哪一个
对于JavaEE7和8,继续使用xmlns.jcp.org
域上的XML名称空间。这是自2013年Java EE 7(包括a.o.JSF 2.2、Servlet 3.1、CDI 1.1等)以来新引入的。请注意,这不仅会影响Facelets文件,还会影响faces-config.xml
、web.xml
、beans.xml
等XML配置文件。
java.sun.com
上的旧XML名称空间仍然存在,以实现向后兼容性,但这种支持最终将在未来的JavaEE版本中消失。您应该尽快迁移您的代码库。使用";在所有文件中查找并替换";一般IDE提供的设施。
只有较旧的Mojarra 2.2.0/2.2.1版本存在与XML命名空间更改有关的错误,但这些错误不应在较新版本中显现。另请参见a.o.
- 在复合物上使用新的xmlns.jcp.org命名空间会导致java.util.concurrent.ConcurrentHashMap.putIfAbsent处出现java.lang.NullPointerException
- f: viewParam没有';当使用新的xmlns.jcp.org命名空间时,t传递必需的参数
- 元数据组件需要嵌套在f:metadata标记中。建议:在<f: 元数据>
为什么会改变
因为Java自2010年以来就不再来自Sun。请注意,他们很聪明,没有让它成为java.oracle.com
或与当前拥有的公司紧密结合的东西。它现在很好地独立地与JCP(Java Community Process)绑定,JCP是真正负责管理Java(EE)规范的人。
几年后
由于Java EE被Eclipse接管并重新命名为Jakarta EE,因此XML命名空间域从xmlns.jcp.org
更改为jakarta.ee
以使其进一步独立。此外,规范过程也不再由JCP所有。
Jakarta EE 10中的Faces 4根据规范问题1553也进一步不再使用URL作为XML命名空间URI,而是使用URN:xmlns:f="jakarta.faces.core"
。使用URN而不是URL的原因是,这些标签库URI首先不能作为返回某种XSD文件的物理web资源使用,因此只会引起初学者的困惑。
另请参阅:
- "的名称空间是什么;h"f〃。。。在雅加达EE 9的JSF页面中
- URI在识别JSTL标记库中扮演的角色是什么
我简要总结了所有新的官方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标签库中找到:JavaServerFaces2.Facelets标签库文档
希望这有帮助:)
对于未来有命名空间混淆/问题的访问者:
我想强调一下找出要使用哪个命名空间的一般方法:
- 如果您想使用JSF HTML标记库或JSF核心标记库中的标记,那么打开JSF实现JAR(如OracleMojarra、ApacheMyFaces-
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中的名称空间,那么您就永远不会遇到问题