2010-09-14 7 views
22

Je cherche un moyen de rendre soutenu une section de code dans JSF, je l'habitude d'utiliser cette approche:Alternative à ui: fragment dans JSF

<ui:fragment rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</ui:fragment> 

Depuis ui: fragment ne supporte pas rendu la plupart des IDE (comme NetBeans marquer comme erreur, mais cela fonctionne parce que dans les paramètres JSF sont hérités.

Une façon de résoudre ce problème est d'utiliser une autre structure (par exemple si vous utilisez SEAM), vous pouvez utiliser

<s:div rendered="#{condition}"> 
    .... 
</s:div> 

Une autre façon consiste à définir le rendu dans l'ensemble du contenu intérieur comme celui-ci:

<h:outputText value="text 1" rendered="#{condition}"/> 
<h:outputText value="text 2" rendered="#{condition}"/> 
<h:outputText value="text 3" rendered="#{condition}"/> 

Mais je n'aime pas de cette façon parce que vous devez ajouter le rendu à chaque élément.

Une autre façon serait d'utiliser <c:if test="#{condtion}"> MAIS c: si vous supprimez les éléments de l'arbre JSF et que ce n'est pas ce que vous voulez toujours faire surtout si vous utilisez AJAX.

Alors vous avez d'autres solutions?

Répondre

46

Depuis ui:fragment ne prend pas en charge la plupart des IDE rendus (comme Netbeans marquer comme erreur, mais cela fonctionne parce que dans les paramètres JSF sont hérités)

Ceci est en fait un bug dans JSF 2.0 Facelets déclaration de fichier d'étiquette (dans Mojarra, c'est le fichier com/sun/faces/metadata/taglib/ui.taglib.xml). L'attribut rendered est négligé et manquant dans la déclaration de fichier de balise (ainsi que dans le JSF 2.0 <ui:fragment> tag documentation), alors que est réellement présent dans le UIComponent. La validation de l'EDI est basée sur les déclarations du fichier d'étiquettes et, par conséquent, donne une erreur de validation trompeuse. Ce problème est résolu dans JSF 2.1, l'attribut manquant est ajouté à la déclaration du fichier de balise (et également dans le JSF 2.1 <ui:fragment> tag documentation).

Si soit juste en ignorant les avertissements IDE ou la mise à niveau vers JSF 2.1 n'est pas une option, vous pouvez envisager d'utiliser the <h:panelGroup> component à la place:

<h:panelGroup rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</h:panelGroup> 

Il produit rien de toute façon si vous ne spécifiez pas le id, style , styleClass et attributs similaires, sinon un simple <span> sera rendu. Si tout ce que vous avez est HTML pur vanille (c'est-à-dire pas de composants JSF), vous pouvez également envisager d'utiliser <f:verbatim>.

<f:verbatim rendered="#{condition}"> 
    text 1 
    text 2 
    text 3 
</f:verbatim> 

Cependant, le <f:verbatim> est dépréciée dans JSF 2.0 (ce qui a aussi un bug documentaire en passant, le JSF 2.0 <f:verbatim> tag documentation ne mentionne pas deprecation, mais le fait JSF 2.1 <f:verbatim> tag documentation).