मैं एक JSP जो कुछ पाठ जो पाश इटरेटर ले रहे हैं और (वसंत सेम), की तरह कुछ अन्य वस्तु के लिए इसे खिला द्वारा निर्मित है मुद्रित करने के लिए की जरूरत है:JSTL पाश अंदर पैरामीटर के साथ एक विधि कॉलिंग
<c:forEach var="myVar" items="${myVars}">
<c:out value="anotherObject.getFoo(myVar)"/>
</c:forEach>
जाहिर है उपरोक्त कोड जेएसटीएल .
ऑपरेटर के रूप में मान्य नहीं है केवल पैरामीटर-कम आमंत्रण की अनुमति देता है। मैं इस समस्या के लिए निम्न समाधान देख सकते हैं:
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>
scriptlets स्पष्ट चोर यहां JSP कोड प्रदूषण और सामान्य कुरूपता है।
2) एक टैग लिखना जो स्क्रिप्टलेट के अंदर जो भी किया जाता है। ओवर-इंजीनियरिंग, यक का विशिष्ट उदाहरण!
3) myVars
का एक संग्रह घुलना और एक dynamic proxy, जिनमें से InvocationHandler
जोड़ना होगा अतिरिक्त पैरामीटर कम विधि anotherObject
के माध्यम से सभी getFoo()
कॉल करने के लिए के साथ प्रत्येक myVar
बदलें। यह सब नियंत्रक में किया जाएगा ताकि जेएसपी साफ रहे और myVar
वही रहता है। लेकिन किस कीमत पर?
मैं myVar
पर विधि नहीं जोड़ सकता क्योंकि यह वहां फिट नहीं होता है और चिंताओं को अलग करने में टूट जाएगा।
ऐसा लगता है कि जेएसपी/ईएल 2.2 में गुजरने वाले पैरामीटर संभव होंगे, लेकिन मैं टॉमकैट 6.0.2 9 का उपयोग कर रहा हूं जो केवल ईएल 2.1 एपीआई को बंडल करता है।
प्रश्न: क्या कोई इस स्थिति के लिए सबसे साफ दृष्टिकोण सुझा सकता है?
यदि प्रत्येक एकल विधि कॉल के लिए जेएसपी टैग लिखना ओवर-इंजीनियरिंग नहीं है, तो मुझे नहीं पता कि ओवर-इंजीनियरिंग क्या है। मैं नहीं कह रहा हूं विकल्प # 3 अच्छा/पसंदीदा है, लेकिन न तो # 2 है। – mindas
ठीक है, अगर आपके पास बहुत से उदाहरण हैं जहां आपको अपने जेएसपी में स्पष्ट रूप से विधियों का आह्वान करना है, तो मेरा सुझाव है कि आप अपने एमवीसी पैटर्न में सुधार करें और एक क्लीनर मॉडल परत बनाने की कोशिश करें जो केवल डेटा रखे। फिर किसी भी तर्क को अपने कंट्रोलर परत में ले जाएं। – pap
MyVar ऑब्जेक्ट मॉडल का एक सटीक उदाहरण है (ऑब्जेक्ट जो केवल डेटा रखता है - इस मामले में दृढ़ता डेटा)। हालांकि मुझे डेटा को देखने की ज़रूरत है पूरी तरह से अलग स्रोत ("' anotherObject' ") से आ रहा है और इस मॉडल वर्ग की आवश्यकता है। नियंत्रक परत पर तर्क को स्थानांतरित करने के आपके सुझाव विकल्प # 3 के करीब है जो मैंने सुझाया और आपने कहा कि यह एक बुरा विचार था। – mindas