Как создать собственный тег Facelets?

Я использую JSF 2.0. Я создал пользовательские теги JSTL с файлами тегов, и они отлично работали в JSP. Но я хочу использовать собственные теги JSTL и в Facelets. Можно ли создавать файлы тегов в Facelets или нет?

1 ответ

Решение

"Пользовательские теги JSTL" не имеют смысла. Этот термин совершенно бессмысленный. JSTL уже сам по себе является taglib. Пожалуйста, внимательно прочитайте вводные абзацы нашей вики-страницы JSTL, чтобы узнать, что такое JSTL. Возможно, вы на самом деле имели в виду " Пользовательские теги JSP ". Конечно, они не будут работать в Facelets, поскольку это совершенно другая технология представления, чем JSP, и фактически преемница устаревшей JSP.

Ну, аналогия "Пользовательского тега JSP" - это "Пользовательский тег 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 файл находится в /META-INF папка JAR в /WEB-INF/lib )

и, наконец, используйте его в своих шаблонах следующим образом:

<html ... xmlns:my="http://example.com/jsf/facelets">
...
<my:some />

Смотрите также:

Другие вопросы по тегам