2010-11-23 22 views
5

Estoy trabajando en la interfaz de un proyecto que me da etiquetas de Java Expression Language para trabajar. En una instancia, necesito ver si devuelve una matriz o solo un bit de datos y no sé cómo trabajar con ella.Tratando con Java Expression Language en una página

Ejemplo:

La página tiene

<p>${WebAppContext.buildings[0].location.name}</p> 

la que sería algo así como:

<p>Acme</p> 

El problema es que necesito de salida más si hay más en que los edificios de bits:

Algo así como (en pseudocódigo):

if isArray(${WebAppContext.buildings}){ 
foreach(${WebAppContext.buildings} as foo){ 
    //iterate over whatever is in the array 
} 
} 

por lo que puede dar salida a algo como: "Dunnokindofbusyrightnowbuhbye"

<p>${WebAppContext.buildings[0].location.name}</p> 
<p>${WebAppContext.buildings[1].location.name}</p> 

le pregunté a la gente de Java responsables de generar el código y me dijeron así que espero que ustedes tengan alguna idea.

Más allá de pegar el código en la página, no tengo ni idea de cómo trabajar con este lenguaje de expresiones de Java (incluso tuve que buscarlo para ver cómo diablos se llama). Entonces, cualquier consejo/recurso sería útil.


EDIT:

He intentado lo siguiente y no estoy recibiendo ningún resultado:

<c:forEach var='building' items='${WebAppContext.buildings}'> 
    <p>${building.location.name}</p> 
</c:forEach> 

En la fuente de la página sólo muestra:

<c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'> 
    <p></p> 
</c:forEach> 

Admitiré que, sin saber nada sobre Java Expression Language, no entiendo por qué los elementos = '' se traduce como lo hace, pero puedo ver que sigue una ruta en la configuración que usamos. Ahora Cuando uso:

<p>${WebAppContext.buildings[0].location.name}</p> 
<p>${WebAppContext.buildings[1].location.name}</p> 

me sale:

<p>Krustylu Studios</p> 
<p>Springfield Nuclear Power Plant</p> 
+0

http://download.oracle.com/javaee/5/tutorial/doc/bnake.html – McDowell

+0

¿Puede usted realmente no utilizar ¿Taglibs como JSTL? Estás trabajando con JSP, ¿verdad? – BalusC

+0

@BalusC: Acabo de actualizar mi pregunta para mostrar lo que obtengo cuando pruebo la sugerencia de ForEach que se ofrece a continuación. – Stuart

Respuesta

4

No creo que ese tipo de funcionalidad avanzada con el apoyo de EL; puede intentar usar la etiqueta JSTL c: forEach para iterar sobre su lista.

+0

Ugh. OK, parece que no será utilizable ... Insistiré en obtener los datos en un formato con el que pueda trabajar, como JSON. – Stuart

+1

@ gaoshan88 si puede usar JSTL/EL en la página, definitivamente puede usar la construcción ''. – Pointy

2

Esto debería ser posible:

<c:forEach var='building' items='${WebAppContext.buildings}'> 
    <p>${building.location.name}</p> 
</c:forEach> 

Ahora, ¿cómo va a comprobar para ver si WebAppContext.buildings es en realidad una matriz? No hay una forma directa y sencilla de hacerlo con JSTL a menos que tenga la capacidad y la capacidad para ampliar un conjunto personalizado local de funciones EL para utilizar desde JSTL.

+0

Actualizo mi pregunta para mostrar lo que obtengo cuando pruebo esto. – Stuart

+0

Mire la respuesta de @Stephen P: su página no está extrayendo la biblioteca de etiquetas estándar – Pointy

3

Si está viendo <c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'> cuando ve el origen de la página desde su navegador, eso implica que la etiqueta <c:forEach> no se está procesando.

Asegúrese de que ha declarado la biblioteca de etiquetas en la página JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

El prefix="c" es donde se obtiene la parte c: de <c:forEach> ... si tuviera que decir prefix="foo" sería entonces la etiqueta <foo:forEach>

1

Si realmente necesita saber si un objeto es una matriz, podría crear una función JSP personalizada.

public static boolean isArray(final Object o) { 
    return o instanceof Object[]; 
} 

A continuación, sólo mapear en un dominio de nivel superior, tales como:

<function> 
    <description> 
     Checks if the supplied object is an array. 
    </description> 
    <name>isArray</name> 
    <function-class>com.example.JspFunctions</function-class> 
    <function-signature>boolean isArray(java.lang.Object)</function-signature> 
    <example> 
     ${f:isArray(someVar)} 
    </example> 
</function> 
Cuestiones relacionadas