У меня есть JSP, который должен напечатать некоторый текст, который получается путем взятия итератора цикла и передачи его другому объекту (Spring bean), что-то вроде:
<c:forEach var="myVar" items="${myVars}">
<c:out value="anotherObject.getFoo(myVar)"/>
</c:forEach>
Очевидно, что приведенный выше код недопустим, так как оператор JSTL .
допускает только вызовы без параметров. Я вижу следующие решения проблемы:
1) Скриптлеты
<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>
Очевидным минусом здесь является загрязнение кода JSP и общее уродство.
2) Написание тега, который делает все, что делается внутри скриптлетов. Типичный пример сверхинжиниринга, чёрт!
3) Разобрать коллекцию myVars
и заменить каждый myVar
динамическим прокси , InvocationHandler
которого добавит дополнительный метод без параметров, чтобы все getFoo()
вызовы через anotherObject
. Все это будет сделано в контроллере, поэтому JSP останется чистым, а myVar
останется прежним. Но по какой цене?
Я не могу добавить .getFoo()
метод к myVar
, потому что он там не помещается и нарушил бы разделение задач.
Похоже, что передача параметров будет возможна в JSP / EL 2.2, но я использую Tomcat 6.0.29, который включает только API EL 2.1.
Вопрос: Кто-нибудь может предложить самый чистый подход для этой ситуации?