【发布时间】:2011-07-20 10:37:48
【问题描述】:
我有一个 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) 编写一个标签,它可以在 scriptlet 中执行任何操作。过度工程的典型例子,糟糕!
3) 分解myVars 的集合并将每个myVar 替换为dynamic proxy、InvocationHandler,其中将添加额外的无参数方法以使所有getFoo() 调用都通过anotherObject。所有这些都将在控制器中完成,因此 JSP 将保持干净并且myVar 保持不变。但价格是多少?
我无法将.getFoo() 方法添加到myVar,因为它不适合那里并且会破坏关注点的分离。
看起来在 JSP/EL 2.2 中可以传递参数,但我使用的是只捆绑 EL 2.1 API 的 Tomcat 6.0.29。
问题:任何人都可以针对这种情况提出最干净的方法吗?
【问题讨论】: