我正在使用JSF 2.0。我创建了带有标记文件的自定义JSTL标记,并且在JSP中运行良好。但是我也想在Facelets中使用自定义JSTL标签。是否可以在Facelets中创建标记文件?

最佳答案

老实说,“自定义JSTL标记”毫无意义。这个术语完全没有意义。 JSTL本身已经是一个标记库。请仔细阅读our JSTL wiki page的介绍性段落,以了解JSTL的真正含义。您可能实际上是指“Custom JSP tags”。当然,它们将无法在Facelets中使用,因为与JSP完全不同的 View 技术,实际上是已弃用的JSP的后继技术。

好吧,“Custom JSP标记”的类比是“Custom Facelets标记”,或更常见的是“Facelets标记文件”。这很简单,您可以遵循与包含文件相同的语法。
/WEB-INF/tags/some.xhtml:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets">
    Hello World
    ...
    <ui:insert /> <!-- This inserts tag body, if necessary. -->
</ui:composition>

并按以下方式在/WEB-INF/example.taglib.xml中注册:
<?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/jsf/facelets</namespace>
    <tag>
        <tag-name>some</tag-name>
        <source>tags/some.xhtml</source>
    </tag>
</facelet-taglib>

依次在/WEB-INF/web.xml中注册,如下所示:
<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/example.taglib.xml</param-value>
</context-param>

(请注意,当web.xml文件位于*.taglib.xml中的JAR的/META-INF文件夹中时,无需在/WEB-INF/lib中注册)

并最终在模板中使用它,如下所示:
<html ... xmlns:my="http://example.com/jsf/facelets">
...
<my:some />

也可以看看:
  • When to use <ui:include>, tag files, composite components and/or custom components?
  • Structure for multiple JSF projects with shared code
  • 关于jsf - 如何创建自定义Facelets标签?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14751624/

    10-11 20:32