在.tld文件中声明的自定义JSF组件在JSP中工作,但在Facelets中不工作

时间:2015-04-15 04:43:54

标签: jsp jsf migration facelets taglib

我有一个在.tld文件中注册的自定义JSF组件。当我在下面声明它时,它在JSP中工作正常:

<%@taglib uri="http://example.com/ui" prefix="ex"%>

但是,当我尝试声明如下时,它在Facelets中不起作用:

<html xmlns:ex="http://example.com/ui">

如何在Facelets中使用我的自定义JSF组件?

1 个答案:

答案 0 :(得分:5)

JSP和Facelets是完全不同的视图技术。 JSP是基于Servlet的,而Facelets是基于XML的。您不能重复使用另一个的标签/标签库。 JSP的*.tld个文件是Facelets的*.taglib.xml个文件。

以下是关于JSF 2.0的Facelets taglib文件的启动示例:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">

    <namespace>http://example.com/ui</namespace>

    <tag>
        <tag-name>foo</tag-name>
        <component>
            <component-type>com.example.Foo</component-type>
        </component>
    </tag>
</facelet-taglib>

如果您有一个JAR文件风格的组件库,只需将其放在/META-INF文件夹中即可。它会被自动发现。如果你有这些自定义组件耦合在WAR本身,那么将它放在/WEB-INF文件夹中,并通过下面的上下文参数在web.xml中注册:

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/example-ui.taglib.xml</param-value>
</context-param>

如果您选择JSF 2.2作为最低要求,请更新taglib的根声明,如下所示:

<facelet-taglib
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd"
    version="2.2">

另见:

值得注意的是,自2009年以来,JSP被弃用为JSF的视图技术。因此,如果您打算构建一个新的自定义组件库,那么使它与JSP兼容将完全浪费精力,因为没有一个理智的JSF开发人员会使用它。而且,几乎所有JSF 2.x组件库都不支持JSP(