2010-06-28 19 views
12

que quiero hacer algo como esto:La combinación de una cadena con el valor de una variable a ser el nombre de otra variable en El

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

Pero no funciona tiros excepción: "$ {Resumen $ { selChrm}} "contiene expresiones inválidas. Me gustaría que el usuario use una lista desplegable para elegir una selección y poner el índice de la variable. Luego, la tabla mostrará la lista correspondiente de objetos Javabean, es decir. named summary01, summary02, etc. ¿Cómo puedo hacer eso? Gracias por adelantado.


Actualizar: Gracias chicos. El problema es con el EL anidado. He intentado utilizar

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

Pero no aparece nada en la mesa desde summary01 es el nombre de la variable. Si codigo el nombre de la variable, funcionará:

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

Por lo tanto, ¿cómo puedo hacer EL anidado? Si no es posible en JSTL, ¿cómo puedo lograr el comportamiento que el usuario puede usar en una lista desplegable para determinar qué contenido se mostrará en la tabla? Gracias de nuevo.

+0

No confunda JSTL con EL. JSTL es [este taglib] (http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/). EL son esas cosas '$ {}': [Expression Language] (http://download.oracle.com/docs/cd/E17477_01/javaee/1.4/tutorial/doc/JSPIntro7.html) – BalusC

Respuesta

17

No se pueden anidar expresiones EL. Sin embargo, puedes simplemente concatenarlos.

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

O, si ${summary} no es en realidad un objeto en cualquiera de los ámbitos, hacen

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

actualización: OK, en realidad se necesita para acceder a ${summary01}. Si conoce el alcance de antemano, puede acceder a él utilizando la notación ortopédica. Imagínese que es un ámbito de petición, se puede acceder a ella "normal" de la siguiente manera:

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

Pero en realidad se puede también utilizar otra variable EL en los tirantes (solo fin de la cita): I

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

Por lo tanto, nos gustaría establecerlo en alguna parte La etiqueta JSTL c:set es perfectamente adecuado para esto:

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

Esto es una cosa que realmente chupa sobre JSTL: no hay forma directa de hacerlo si desea hacerlo indide una expresión JSTL. No hay operador de concatenación de cadenas, en otras palabras.

Siempre se puede hacer

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

pero eso no siempre es útil.

En mi mundo, he aplicado mi propia función "concat", por lo que se puede decir

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

Primer paso:

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

Paso dos:

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

Simple como eso :)

ACTUALIZACIÓN como BalusC menciona en los comentarios, debe Servlets 3.0 para utilizar este.

+0

Tenga en cuenta que esto requiere EL 2.2 (Servlet 3.0) que era relativamente nuevo en el momento en que se hizo esta pregunta. En versiones EL más antiguas, no puede llamar a métodos como ese. – BalusC

0

Me funcionó.

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