我有一个在.tld
文件中注册的自定义JSF组件。当我在下面声明它时,它在JSP中工作正常:
<%@taglib uri="http://example.com/ui" prefix="ex"%>
但是,当我尝试声明如下时,它在Facelets中不起作用:
<html xmlns:ex="http://example.com/ui">
如何在Facelets中使用我的自定义JSF组件?
答案 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(
)