Я пытаюсь создать пользовательский тег с 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 / теги / 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>
Большое спасибо заранее!
Я нашел свой ответ здесь: 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% правильно, потому что это должно работать с новым именем параметра.Есть другие параметры, которые получили новые имена, но я их еще не тестировал.
Мне кажется, я нашел проблему и решение (что не на 100% правильно). Параметр контекста должен быть facelets.LIBRARIES, а не javax.faces.FACELETS_LIBRARIES.
facelets.LIBRARIES
javax.faces.FACELETS_LIBRARIES
Параметр контекста javax.faces.FACELETS_LIBRARIES должен заменить устаревший (устарел согласно спецификации JSF) контекстный параметр facelets.LIBRARIES.Когда последний используется, во время запуска сервера в журналах появляется предупреждение о том, что facelets.LIBRARIES устарело и вместо него следует использовать javax.faces.FACELETS_LIBRARIES.Но я думаю, что это используется только для регистрации предупреждения, то есть имя facelets.LIBRARIES используется для создания пользовательских компонентов taglib.Я говорю, что это не на 100% правильно, потому что это должно работать с новым именем параметра.Есть другие параметры, которые получили новые имена, но я их еще не тестировал.
Убедитесь, что ваш * .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
Я рекомендую делать ваши теги так:
<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>