Пользовательский тег Facelets не отображается

Я пытаюсь создать пользовательский тег с помощью Facelets, но он не отображается (т. Е. Тег отображается в ответе без замены).

Тег (/WEB-INF/facelets/tags/inputThumbnailSelector.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

<ui:composition>
 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

</html>

/WEB-INF/facelets/tags/panayk.taglib.xml:

<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
 <namespace>http://panayk.endofinternet.org/jsf</namespace>
 <tag>
  <tag-name>inputThumbnailSelector</tag-name>
  <source>inputThumbnailSelector.xhtml</source>
 </tag>
</facelet-taglib>

Мой web.xml содержит:

<context-param>
 <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
 <param-value>/WEB-INF/facelets/tags/panayk.taglib.xml</param-value>
</context-param>

Вот как называется тег:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk"
   xmlns:my="http://panayk.endofinternet.org/jsf">

<ui:composition template="/layout/layout.xhtml">
...  
   <my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
...
</ui:composition>

</html>

Спасибо заранее!

3 ответа

Решение

Я нашел свой ответ здесь: https://community.oracle.com/thread/1719525

Я думаю, что я нашел проблему и решение (что не на 100% правильно). Контекстный параметр должен быть facelets.LIBRARIES не javax.faces.FACELETS_LIBRARIES,

Контекстный параметр javax.faces.FACELETS_LIBRARIES должен заменить устаревший (устаревший согласно спецификации JSF) контекстный параметр facelets.LIBRARIES, Когда последний используется, во время запуска сервера появляется предупреждение в журналах facelets.LIBRARIES устарела и javax.faces.FACELETS_LIBRARIES следует использовать вместо Но я думаю, что это используется только для регистрации предупреждения, т.е. все же имя facelets.LIBRARIES используется для создания пользовательских компонентов taglib. Я говорю, что это не на 100% правильно, потому что это должно работать с новым именем параметра. Есть другие параметры, которые получили новые имена, но я их еще не тестировал.

Я рекомендую делать ваши теги так:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

но все кажется нормальным, так как вы используете макет, вы обернули пользовательский тег в пользовательский интерфейс: определить, как это?

<ui:define name="body">
<my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
</ui:define>

Убедитесь, что ваш *.taglib.xml правильно настроен. Случилось так, что у меня неправильное пространство имен, и оно не сработало сразу же, как я изменил его, он работал, у меня было автоматическое завершение (ака. завершение кода)

<facelet-taglib version="2.2"
            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">
</facelet-taglib>

Ссылки по теме:

JSF 2.2: новые пространства имен

Упаковка файлов Facelets (шаблоны, включает в себя, композиты) в JAR

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