.tld 文件中声明的自定义 JSF 组件在 JSP 中有效,但在 Facelets 中无效
Custom JSF component declared in .tld file works in JSP but not in Facelets
我有一个在 .tld
文件中注册的自定义 JSF 组件。当我如下声明它时,它在 JSP 中工作正常:
<%@taglib uri="http://example.com/ui" prefix="ex"%>
但是,当我尝试如下声明时,它在 Facelets 中不起作用:
<html xmlns:ex="http://example.com/ui">
如何在 Facelets 中也使用我的自定义 JSF 组件?
JSP 和 Facelets 是完全不同的视图技术。 JSP 基于 Servlet,而 Facelets 基于 XML。您不能在另一个上重复使用 tags/taglibs。 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">
另请参阅:
- Migrating from JSF 1.2 to JSF 2.0
- Mojarra's JSP to Facelets migration guide
- Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards?
请注意,自 2009 年起,JSP 已被弃用为 JSF 的视图技术。因此,如果您打算构建一个新的自定义组件库,使其 JSP 兼容将完全是浪费精力,因为没有任何理智的 JSF 开发人员会使用它。此外,几乎所有 JSF 2.x 组件库不再支持 JSP。
我有一个在 .tld
文件中注册的自定义 JSF 组件。当我如下声明它时,它在 JSP 中工作正常:
<%@taglib uri="http://example.com/ui" prefix="ex"%>
但是,当我尝试如下声明时,它在 Facelets 中不起作用:
<html xmlns:ex="http://example.com/ui">
如何在 Facelets 中也使用我的自定义 JSF 组件?
JSP 和 Facelets 是完全不同的视图技术。 JSP 基于 Servlet,而 Facelets 基于 XML。您不能在另一个上重复使用 tags/taglibs。 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">
另请参阅:
- Migrating from JSF 1.2 to JSF 2.0
- Mojarra's JSP to Facelets migration guide
- Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards?
请注意,自 2009 年起,JSP 已被弃用为 JSF 的视图技术。因此,如果您打算构建一个新的自定义组件库,使其 JSP 兼容将完全是浪费精力,因为没有任何理智的 JSF 开发人员会使用它。此外,几乎所有 JSF 2.x 组件库不再支持 JSP。