tengo un JSP que necesita para imprimir algún texto que se produce tomando iterador bucle y dársela a otro objeto (frijol de primavera), algo así como:Llamar a un método con el parámetro de rizo interior JSTL
<c:forEach var="myVar" items="${myVars}">
<c:out value="anotherObject.getFoo(myVar)"/>
</c:forEach>
Obviamente el código anterior no es válido ya que el operador JSTL .
solo permite invocaciones sin parámetros. Veo siguientes soluciones al problema:
1) Scriptlets
<c:forEach var="myVar" items="${myVars}">
<%
SomeType myVar = (SomeType) pageContext.getAttribute("myVar");
SomeOtherType anotherObject = (SomeOtherType) pageContext.getAttribute("anotherObject");
YetAnotherType result = anotherObject.getFoo(myVar);
pageContext.setAttribute("result", result);
%>
<c:out value="${result}"/>
</c:forEach>
El aire aquí es obvia JSP código de la contaminación y la fealdad general.
2) Escribiendo una etiqueta que hace lo que sea que se haga dentro de scriptlets. Ejemplo típico de sobre-ingeniería, ¡puaj!
3) descomponer una colección de myVars
y reemplazar cada myVar
con un dynamic proxy, InvocationHandler
de lo que añadiría método sin parámetros extra para hacer que todas las llamadas a través getFoo()
anotherObject
. Todo eso se haría en el controlador para que JSP permanezca limpio y myVar
se mantenga igual. ¿Pero a qué precio?
No puedo agregar .getFoo()
método al myVar
porque no encaja allí y rompería la separación de las preocupaciones.
Parece que los parámetros de aprobación serán posibles en JSP/EL 2.2, pero estoy usando Tomcat 6.0.29, que solo incluye el EL 2.1 API.
Pregunta: ¿Alguien puede sugerir el enfoque más limpio para esta situación?
Si escribir una etiqueta JSP para cada método no es una sobreingeniería, entonces no sé qué es la sobreingeniería. No estoy diciendo que la opción n. ° 3 sea buena/preferida, pero tampoco la n. ° 2. – mindas
Bueno, si tiene muchas instancias en las que tiene que invocar explícitamente métodos en su JSP: s, entonces le sugiero que mejore su patrón MVC y se esfuerce por crear una capa de Modelo más limpia que solo contenga datos. Luego mueve cualquier lógica a tu capa de Controlador. – pap
El objeto myVar es un ejemplo exacto de lo que usted llama Modelo (objeto que solo contiene datos - datos de persistencia en este caso). Sin embargo, los datos que necesito visualizar provienen de fuentes completamente diferentes ("' anotherObject' ") y requieren esta clase de modelo. Su sugerencia de mover la lógica a la capa de controlador está cerca de la opción n. ° 3, que sugerí y dijo que era una mala idea. – mindas