2010-06-25 3 views
3

Я пытаюсь создать собственный тег с 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> 

Большое спасибо заранее!

+0

Кто-нибудь? Это все еще не работает. –

ответ

7

Я нашел мой ответ здесь: 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. Но я думаю, что это используется только для регистрации предупреждения, т. Е. Для создания пользовательских компонентов taglib используется имя facelets.LIBRARIES. Я говорю, что это не 100% правильно, потому что он должен работать с новым именем параметра. Существуют и другие параметры, которые получили новые имена, но я их еще не тестировал.

+1

@Panyiotis Karabassis: Спасибо, это спасло мой день. Моя проблема заключалась в использовании facelet вместо facelets – bertie

+0

Добро пожаловать! Это все еще проблема? Я не программировал JSF через некоторое время, но я только что купил книгу «Core JavaServer Faces» (очень многообещающую), которая относится к JSF2.0 с facelets в качестве уровня представления по умолчанию. Разве он не работает «из коробки» сейчас? –

+0

спас меня, когда я собирался сдаться ..... –

0

Я рекомендую делать свои метки, как это:

<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: определить, как это?

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

Да, я завернул его в ui: define. Спасибо! –

Смежные вопросы