2010-04-03 5 views
4

Je souhaite échanger des informations entre deux artefacts JSP tagx imbriqués. Pour donner un exemple:Variables d'accès entre balises JSP imbriquées

list.jspx

<myNs:table data="${myTableData}"> 
    <myNs:column property="firstName" label="First Name"/> 
    <myNs:column property="lastName" label="Last Name"/> 
</myNs:table> 

Maintenant, le table.tagx est censé afficher les colonnes de données telles que définies dans les balises de colonnes imbriquées. La question est comment puis-je accéder aux valeurs de la propriété et des attributs d'étiquette des balises de colonnes imbriquées à partir de la balise de table. J'ai essayé jsp: directive.variable mais cela ne semble fonctionner que pour échanger des informations entre un jsp et un tag, mais pas entre des balises imbriquées.

Remarque, je voudrais éviter d'utiliser des objets de sauvegarde java pour la table et les balises de colonne du tout. Je voudrais aussi savoir comment je peux accéder à un attribut défini par une balise parent (dans cet exemple, je voudrais accéder au contenu de l'attribut data dans table.tagx de column.tagx).

Donc, cela se résume à comment puis-je accéder à des variables entre des balises JSP imbriquées qui sont purement implémentées par les définitions de balises elles-mêmes (aucune implémentation Java TagHandler souhaitée)?

+1

Je ne pense pas que vous pouvez le faire sans utiliser des balises java personnalisées. – skaffman

Répondre

2

L'idée est de partager les données de portée de la demande:

  1. Dans monen: table créer une requête scope variable d'espace réservé pour contenir les données (dans votre cas, vous aurez besoin de deux d'entre eux: l'un pour les propriétés et un autre pour les étiquettes):

    <c:set var="properties" scope="request" /> 
    <c:set var="labels" scope="request" /> 
    
  2. invoquez ensuite vos balises de colonne via <jsp:doBody /> afin que les colonnes puissent remplir les espaces réservés.
  3. Dans monen colonne remplir les espaces réservés, souvenez-vous de les garder à portée de la demande:

    <c:choose> 
        <c:when test="${empty properties}" scope="request"> 
        <c:set var="properties" value="${property}" scope="request" /> 
        </c:when> 
        <c:otherwise> 
        <c:set var="properties" value="${properties},${property}" scope="request" /> 
        </c:otherwise> 
    </c:choose> 
    
  4. Maintenant, après que vous invoquez <jsp:doBody /> dans votre monen table que vous avez été les valeurs peuplées, tout ce que vous avez besoin est de diviser la chaîne en utilisant la virgule comme séparateur, puis faire tout ce que vous voulez:

    <table> 
        <thead> 
        <tr> 
         <c:forTokens items="${labels}" delims="," var="label"> 
         <th><c:out value="${label}" /></th> 
         </c:forTokens> 
        </thead> 
    </table> 
    

PS: T il crédite les gars de Spring Roo, jetez un oeil à leurs table.tagx et column.tagx.

+3

Si vous mettez la variable dans la portée de la demande, ne va-t-elle pas gâcher s'il y a plusieurs balises sur la page? Je pense qu'il devrait être mis dans la portée de la page, ce qui, dans une balise JSP, signifie qu'elle est limitée à cette balise JSP et qu'elle contient des appels, et qu'elle ne fuit pas vers la page JSP appelant. –

+0

@DeanMoses Oui, ça va. Crédits vont les gars du printemps roo :-) – peterh

Questions connexes