我有一個JSP這需要打印是通過採取循環迭代,並將其輸送到另一個對象(春豆),像產生了一些文字:調用JSTL循環中使用參數的方法
<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>
明顯CON這裏是JSP代碼污染和一般的醜陋。
2)寫一個標籤,它在scriptlet內部完成任何操作。過度工程的典型例子,yuck!
3)分解的myVars
的集合和一個dynamic proxy,其中InvocationHandler
會增加額外的參數少的方法來通過anotherObject
使所有getFoo()
調用替換每個myVar
。所有這些都將在控制器中完成,因此JSP將保持乾淨並且myVar
保持不變。但在什麼價格?
我不能將.getFoo()
方法添加到myVar
,因爲它不適合那裏,並會打破關注的分離。
它看起來像在JSP/EL 2.2中可以傳遞參數,但是我使用的是隻包含EL 2.1 API的Tomcat 6.0.29。
問題:任何人都可以提出這種情況最清潔的方法?
如果爲每個單獨的方法調用寫一個JSP標記不是過度工程,那麼我不知道過度工程是什麼。我並不是說選項#3是好的/首選的,但都不是#2。 – mindas
好吧,如果你有很多實例需要明確調用JSP中的方法,那麼我建議你改進你的MVC模式,並且努力創建一個只保存數據的清潔模型層。然後將任何邏輯移入Controller層。 – pap
myVar對象就是您稱之爲Model的一個確切示例(僅保存數據的對象 - 在這種情況下爲持久性數據)。然而,我需要可視化的數據來自完全不同的來源(「anotherObject」),並且需要這個模型類。將邏輯移動到Controller層的建議接近我建議的選項#3,並且您說這是一個糟糕的主意。 – mindas