2010-06-28 11 views
12

voglio fare qualcosa di simile:La combinazione di una stringa con il valore di una variabile per essere il nome di un'altra variabile in EL

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

Ma non funziona tiri eccezione: "$ {sintesi $ { selChrm}} "contiene espressioni non valide. Vorrei che l'utente usasse un elenco a discesa per scegliere una selezione e inserire l'indice delle variabili. Quindi la tabella mostrerà la lista corrispondente di oggetti javabean, es. named summary01, summary02, ecc. Come posso farlo? Grazie in anticipo.


Aggiornamento: Grazie ragazzi. Il problema è con l'EL annidato. Ho provato a utilizzare

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

Ma nulla viene visualizzato nella tabella poiché summary01 è il nome della variabile. Se codice il nome della variabile, funzionerà:

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

Pertanto, come posso fare EL nidificato? Se non è possibile in JSTL, come posso ottenere il comportamento che l'utente può utilizzare un elenco a discesa per determinare quali contenuti visualizzare nella tabella? Grazie ancora.

+0

Si prega di non confondere JSTL con EL. JSTL è [questo taglib] (http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/). EL sono le cose '$ {}': [Expression Language] (http://download.oracle.com/docs/cd/E17477_01/javaee/1.4/tutorial/doc/JSPIntro7.html) – BalusC

risposta

17

Non è possibile annidare le espressioni EL. Puoi comunque concatenarli.

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

O, se ${summary} non è in realtà un oggetto in una qualsiasi delle scope, fanno

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

Aggiornamento: OK, hai veramente bisogno di accedere ${summary01}. Se conosci in anticipo l'ambito, puoi accedervi utilizzando la notazione delle controventi. Immaginate che di essa la richiesta di ambito, si potrebbe accedervi "plain" come segue:

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

Ma si può effettivamente utilizzare anche un'altra variabile EL nelle parentesi (solo unquote esso):

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

Quindi, ci piacerebbe ambientarlo da qualche parte. Il tag JSTL c:set è perfettamente adatto a questo:

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

Questa è una cosa che fa davvero schifo su JSTL: non c'è modo diretto per farlo se si vuole farlo indide un'espressione JSTL. Non c'è operatore di concatenazione di stringhe, in altre parole.

si può sempre fare

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

ma che non è sempre utile.

Nel mio mondo, ho implementato il mio funzione "concat", quindi posso dire

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

Fase uno:

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

Fase due:

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

Semplice come quello :)

UPDATE come BalusC menzionato nei commenti, è necessario 3.0 Servlet per utilizzare questo.

+0

Si noti che ciò richiede EL 2.2 (Servlet 3.0) che era relativamente nuovo al momento della domanda. Nelle versioni precedenti di EL non è possibile chiamare metodi del genere. – BalusC

0

Ha funzionato per me.

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