2010-11-22 31 views
4

Je développe une application web avec JSF 2.0 (mojarra) + primefaces. Dans le passé, j'ai utilisé avec succès la balise [c: set] de la bibliothèque jstl pour stocker des données temporaires ou des sorties d'autres balises.JSF 2.0 et JSTL utilisent la balise c: set pour stocker des données temporaires

Dans mon cas actuel, je veux l'utiliser à nouveau, mais cela ne fonctionne pas correctement et je ne sais pas pourquoi. Dans l'exemple suivant, cela fonctionne mais particulièrement. Pourquoi l'affaire 2 ne fonctionne pas correctement?

<h:form id="userAdministration"> 
    <p:messages id="messages" showDetail="true" /> 
    <p:dataTable id="userTable" selectionMode="single" var="user" value="#{users}"> 
    <p:column> 
     <f:facet name="header"> 
     <h:outputText value="#{message.user_table_header_id_column}" /> 
     </f:facet> 
     <h:outputText value="#{user.id}" /> 
    </p:column> 

    <p:column> 
     <f:facet name="header"> 
     <h:outputText value="#{message.global_table_header_action_column}" /> 
     </f:facet> 
     <p:commandButton type="push" onclick="#{user.loginname}DeleteConfirmation.show()" value="#{message.global_table_action_delete}" image="ui-icon-trash"> 
     <f:setPropertyActionListener value="#{user}" target="#{userAdministrationController.selectedUser}" /> 
     </p:commandButton> 
     <!-- 1. WORKS FINE, STORED VALUE IS "loginname" --> 
     <c:set var="deleteConfirmationMessage" value="#{user.loginname}"></c:set> 
     <!-- 2. VALUE IS "!!!" AND NOT "loginname !!!" --> 
     <c:set var="deleteConfirmationMessage2"> 
     <h:outputText value="#{user.loginname}" />!!! 
     </c:set> 
     <!-- 3. WORKS FINE (OUTPUT "loginname") --> 
     <h:outputText value="#{user.loginname}" /> 
     <p:confirmDialog message="#{deleteConfirmationMessage}" header="#{message.user_dialog_delete_confirmation_title}" severity="alert" widgetVar="#{user.loginname}DeleteConfirmation"> 
     <p:commandButton value="#{message.user_dialog_delete_confirmation_no}" onclick="#{user.loginname}DeleteConfirmation.hide()" update="@form" type="button" /> 
     </p:confirmDialog> 
    </p:column> 

Répondre

1

Juste faire une supposition, parce que je ne l'ai pas essayé de combiner JSF et JSTL, mais je crois que c: ensemble serait traitée avant l'h: outputText est rendu, il ne verrait que le texte statique dans son corps. Je ne suis pas sûr que les gestionnaires d'étiquette d'ordre sont appelés en relation avec le cycle de vie JSF, mais en mettant un peu de journalisation permettrait d'éclaircir cela.

-3
xmlns:c="http://java.sun.com/jstl/core" 

juste ajouter cela comme taglib pour jstl

+0

Merci, mais je l'ai fait déjà :(Ceci est mon en-tête. eglobetrotter

+3

Ceci contredit le fait que # 1 et # 3 fonctionnent correctement. – BalusC

6

Pourquoi le cas 2 fonctionne pas correctement?

<!-- 2. VALUE IS "!!!" AND NOT "loginname !!!" --> 
<c:set var="deleteConfirmationMessage2"> 
    <h:outputText value="#{user.loginname}" />!!! 
</c:set> 

C'est parce que taghandlers et des composants de l'interface utilisateur ne fonctionne pas en même temps. Les balises JSTL sont des balises de balises qui s'exécutent lors de la création de la vue (lorsque le fichier XHTML est converti en arborescence de composants JSF). Les balises JSF <h:xxx> sont des composants d'interface utilisateur qui s'exécutent lors du rendu de la vue (lorsque l'arborescence des composants JSF est convertie/rendue en code HTML). Voir aussi JSTL in JSF2 Facelets... makes sense?

Ainsi, lorsque les <c:set> fonctionne, le <h:outputText> n'a pas couru du tout.

Mais dans cette construction particulière vous n'avez en fait pas besoin du <h:outputText>. En plus de la définir comme value de <c:set>, vous pouvez également ajouter l'expression EL brute dans le texte du modèle (notez que cela fonctionne lorsque vous utilisez JSF avec Facelets, pas lorsque vous utilisez JSF avec JSP, étant donné que vous utilisez PrimeFaces, vous utilisez certainement Facelets comme PrimeFaces n'a pas de taglib JSP du tout).

<c:set var="deleteConfirmationMessage2"> 
    #{user.loginname}!!! 
</c:set> 

ou peut-être vous ne saviez pas que vous pouvez mélanger EL et des chaînes simples dans un attribut comme

<c:set var="deleteConfirmationMessage2" value="#{user.loginname}!!!" /> 

ou

<p:confirmDialog message="#{user.loginname}!!!"> 

En fonction de l'exigence fonctionnelle du béton, qui ISN 't clairement clair de la question, une alternative différente peut être d'utiliser le composant <o:cache> de OmniFaces. Cela peut être plus utile si vous avez l'intention de mettre en cache la valeur pour une portée plus large que la portée page/requête, comme dans vos exemples <c:set>.