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



我已经将我的应用程序从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.xmlweb.xmlbeans.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.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中的名称空间,那么您就永远不会遇到问题

相关内容

  • 没有找到相关文章

最新更新