Tôi có một JSP mà cần phải in một số văn bản được sản xuất bằng cách lấy vòng lặp và nuôi nó đến một đối tượng khác (Spring đậu), một cái gì đó như:Gọi một phương thức với tham số bên trong vòng lặp JSTL
<c:forEach var="myVar" items="${myVars}">
<c:out value="anotherObject.getFoo(myVar)"/>
</c:forEach>
Rõ ràng mã trên không hợp lệ vì nhà khai thác JSTL .
chỉ cho phép các yêu cầu ít tham số. Tôi có thể thấy các giải pháp sau đây để các vấn đề:
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>
Các con rõ ràng ở đây là JSP đang ô nhiễm và xấu xa nói chung.
2) Viết thẻ thực hiện bất kỳ điều gì được thực hiện bên trong tập lệnh. Ví dụ điển hình về kỹ thuật quá mức, yuck!
3) Phân hủy một bộ sưu tập của myVars
và thay thế mỗi myVar
với một dynamic proxy, InvocationHandler
trong số đó sẽ bổ sung thêm phương pháp tham số-ít hơn để làm cho tất cả các cuộc gọi qua getFoo()
anotherObject
. Tất cả điều đó sẽ được thực hiện trong bộ điều khiển để JSP luôn sạch sẽ và myVar
vẫn giữ nguyên. Nhưng ở mức giá nào?
Tôi không thể thêm phương thức .getFoo()
vào myVar
vì phương thức này không phù hợp và sẽ phá vỡ sự phân tách mối quan tâm.
Dường như các tham số truyền sẽ có thể có trong JSP/EL 2.2, nhưng tôi đang sử dụng Tomcat 6.0.29 chỉ bao gồm API EL 2.1.
Câu hỏi: ai có thể đề xuất cách tiếp cận sạch nhất cho tình huống này?
Nếu viết một thẻ JSP cho mỗi cuộc gọi phương thức đơn lẻ không quá kỹ thuật, thì tôi không biết kỹ thuật quá mức là gì. Tôi không nói tùy chọn # 3 là tốt/ưa thích, nhưng không phải là # 2. – mindas
Vâng, nếu bạn đang có rất nhiều trường hợp bạn phải gọi một cách rõ ràng các phương thức trong JSP: s, thì tôi đề nghị bạn cải thiện mẫu MVC của bạn và nỗ lực tạo ra một lớp Mô hình sạch hơn chỉ chứa dữ liệu. Sau đó di chuyển bất kỳ logic vào lớp điều khiển của bạn. – pap
Đối tượng myVar là một ví dụ chính xác về những gì bạn gọi là Mô hình (đối tượng chỉ chứa dữ liệu lưu giữ dữ liệu trong trường hợp này). Tuy nhiên dữ liệu tôi cần để hình dung là đến từ nguồn hoàn toàn khác nhau ("' anotherObject' ") và yêu cầu lớp mô hình này. Đề nghị của bạn để di chuyển logic đến lớp điều khiển là gần với tùy chọn # 3 mà tôi đề nghị và bạn nói đó là một ý tưởng tồi. – mindas