web-dev-qa-db-fra.com

Combinaison d'une chaîne avec la valeur d'une variable pour être le nom d'une autre variable dans EL

Je veux faire quelque chose comme ça:

<display:table name="${summary${index}}">

Mais cela ne fonctionne pas exception: "$ {summary $ {selChrm}}" contient une ou plusieurs expressions non valides. J'aimerais que l'utilisateur utilise une liste déroulante pour choisir une sélection et la mettre dans l'index de variable. Ensuite, la table affichera la liste correspondante d’objets jababéens, c.-à-d. nommé summary01, summary02, etc. Comment puis-je faire cela? Merci d'avance.


Mise à jour : Merci les gars. Le problème est avec l'EL imbriqué. J'ai essayé d'utiliser

<display:table name="summary${index}">

Mais rien ne s'affiche dans la table puisque summary01 est le nom de la variable. Si je code le nom de la variable, cela fonctionnera:

<display:table name="${summary01}">

Par conséquent, comment puis-je créer un EL imbriqué? Si ce n'est pas possible dans JSTL, comment puis-je obtenir le comportement voulant qu'un utilisateur puisse utiliser une liste déroulante pour déterminer le contenu à afficher dans la table? Merci encore.

12
Ken

Vous ne pouvez pas imbriquer des expressions EL. Vous pouvez cependant simplement les concaténer.

<display:table name="${summary}${index}">

Ou, si ${summary} n'est en réalité un objet dans aucune des portées,

<display:table name="summary${index}">

Mise à jour : OK, vous devez accéder à ${summary01}. Si vous connaissez la portée à l'avance, vous pouvez y accéder en utilisant la notation d'accolade. Imaginez que la demande soit étendue, vous pouvez y accéder "en clair" comme suit:

<display:table name="${requestScope['summary01']}">

Mais vous pouvez également utiliser une autre variable EL entre les accolades (cochez simplement):

<display:table name="${requestScope[summary]}">

Nous aimerions donc le placer quelque part. La balise JSTL c:set convient parfaitement à cela:

<c:set var="summary" value="summary${index}" />
18
BalusC

La première étape:

<c:set var="summary" value="${requestScope['summary'.concat(index)]}" />

Deuxième étape:

<display:table name="${summary}">

Aussi simple que cela :)

UPDATEComme BalusC l'a mentionné dans des commentaires, vous avez besoin de 3.0 Servlets pour l'utiliser.

3
Minutis

C'est une chose qui craint vraiment à propos de JSTL: il n'y a pas de moyen direct de le faire si vous voulez le faire induire une expression JSTL. Il n'y a pas d'opérateur de concaténation de chaînes, en d'autres termes.

Tu peux toujours faire

 <something foo='${something} ${something_else}'/>

mais ce n'est pas toujours utile.

Dans mon monde, j'ai implémenté ma propre fonction "concat", donc je peux dire

$(foo:bar(mystuff:concat("something", something.else))}
1
Pointy

Cela a fonctionné pour moi.

${not empty marginLeft ? 'margin-left:'.concat(marginLeft) : ''}
0
SateeshKasaboina