2010-06-25 7 views
3

J'essaie de créer une balise personnalisée avec Facelets mais elle n'est pas rendue (c'est-à-dire que la balise apparaît non remplacée dans la réponse).Balise personnalisée Facelets non restituée

La balise (/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> 

Mon web.xml contient:

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

Voici comment la balise est appelée:

<!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> 

Merci beaucoup d'avance!

+0

Quelqu'un? Cela ne fonctionne toujours pas. –

Répondre

7

J'ai trouvé ma réponse ici: https://community.oracle.com/thread/1719525

Je pense avoir trouvé le problème et la solution (qui n'est pas 100% correct). Le paramètre de contexte doit être facelets.LIBRARIES et non javax.faces.FACELETS_LIBRARIES.

Le paramètre de contexte javax.faces.FACELETS_LIBRARIES est supposé remplacer le paramètre de contexte obsolète (obsolète selon la spécification JSF) facelets.LIBRARIES. Lorsque ce dernier est utilisé, il y a un avertissement dans les journaux au démarrage du serveur indiquant que facelets.LIBRARIES est obsolète et que javax.faces.FACELETS_LIBRARIES doit être utilisé à la place. Mais je pense que ceci n'est utilisé que pour enregistrer un avertissement, c'est-à-dire que le nom facelets.LIBRARIES est toujours utilisé pour construire des composants taglib personnalisés. Je dis que ce n'est pas 100% correct car il devrait fonctionner avec le nouveau nom de paramètre. Il y a d'autres paramètres qui ont de nouveaux noms, mais je ne les ai pas encore testés.

+1

@Panyiotis Karabassis: Merci, cela a sauvé ma journée. Mon problème était d'utiliser facelet au lieu de facelets – bertie

+0

Vous êtes les bienvenus! Est-ce que c'est toujours un problème, alors? Je n'ai pas programmé JSF depuis un moment, mais je viens d'acheter le livre "Core JavaServer Faces" (très prometteur) qui traite de JSF2.0 avec des facelets comme couche de vue par défaut. Ne devrait-il pas fonctionner «out of the box» maintenant? –

+0

m'a sauvé quand j'étais sur le point d'abandonner ..... –

0

Je recommande de faire vos balises comme ceci:

<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> 

mais tout semble ok, puisque vous utilisez une mise en page, avez-vous l'étiquette enveloppez personnalisé dans une interface: définir comme celui-ci?

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

Oui je l'ai enveloppé dans un ui: define. Je vous remercie! –