2011-07-20 16 views
7

मैं एक 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 एपीआई को बंडल करता है।

प्रश्न: क्या कोई इस स्थिति के लिए सबसे साफ दृष्टिकोण सुझा सकता है?

उत्तर

2

यहां मैंने अंत में इसे कैसे किया है।

SomeType उदाहरणों के संग्रह को पारित करने के बजाय, मैं एक नक्शा पास कर रहा हूं। नक्शा कुंजी एक ही SomeType एस हैं और मान नियंत्रक-विशिष्ट आंतरिक वर्ग के उदाहरण हैं, चलो इसे SomeTypeSupplement पर कॉल करें।

SomeTypeSupplement आवश्यक नो-एग गेटर्स जोड़ता है और सब कुछ एक साथ तार करता है। जेएसपी अब मानचित्र प्रविष्टियों पर फिर से शुरू होता है और जेएसटीएल के माध्यम से डेटा को पुनः प्राप्त करने में सक्षम है।

इस तरह से मैं Proxy जादू, अनावश्यक टीएलडी से बचता हूं, जेएसपी को साफ और उचित रूप से टाइप-सुरक्षित रखता हूं।

1

यदि आप स्क्रिप्टलेट (आपका विकल्प 1) का पालन नहीं कर सकते हैं, तो मैं इसके लिए एक कस्टम टैग (आपका विकल्प 2) या एक कस्टम ईएल फ़ंक्शन बनाउंगा। मैं इस बात से सहमत नहीं हूं कि यह "ओवर-इंजीनियरिंग" है, यह उपलब्ध उद्देश्यों के लिए उपलब्ध टूल का उपयोग कर रहा है।

आपका विकल्प 3, हालांकि, मुझे पसंद नहीं है। यदि कुछ भी हो, तो यह अधिक इंजीनियरिंग के साथ-साथ यह आपके सिस्टम को अन्य लोगों के अनुसरण के लिए अनावश्यक रूप से जटिल और कठिन बना देगा। उन विनिर्देशों और मानकों के इरादे का पालन करें जिनके भीतर आप काम कर रहे हैं। चीजों को इसके लिए कठिन या अधिक जटिल न बनाएं।

+3

यदि प्रत्येक एकल विधि कॉल के लिए जेएसपी टैग लिखना ओवर-इंजीनियरिंग नहीं है, तो मुझे नहीं पता कि ओवर-इंजीनियरिंग क्या है। मैं नहीं कह रहा हूं विकल्प # 3 अच्छा/पसंदीदा है, लेकिन न तो # 2 है। – mindas

+0

ठीक है, अगर आपके पास बहुत से उदाहरण हैं जहां आपको अपने जेएसपी में स्पष्ट रूप से विधियों का आह्वान करना है, तो मेरा सुझाव है कि आप अपने एमवीसी पैटर्न में सुधार करें और एक क्लीनर मॉडल परत बनाने की कोशिश करें जो केवल डेटा रखे। फिर किसी भी तर्क को अपने कंट्रोलर परत में ले जाएं। – pap

+0

MyVar ऑब्जेक्ट मॉडल का एक सटीक उदाहरण है (ऑब्जेक्ट जो केवल डेटा रखता है - इस मामले में दृढ़ता डेटा)। हालांकि मुझे डेटा को देखने की ज़रूरत है पूरी तरह से अलग स्रोत ("' anotherObject' ") से आ रहा है और इस मॉडल वर्ग की आवश्यकता है। नियंत्रक परत पर तर्क को स्थानांतरित करने के आपके सुझाव विकल्प # 3 के करीब है जो मैंने सुझाया और आपने कहा कि यह एक बुरा विचार था। – mindas

1

क्यों न केवल अपनी बैकएंड जावा कोड में अपनी ऑब्जेक्ट सूची लिखें और फिर इसे प्रदर्शित करने के लिए बस जेएसपी का उपयोग करें?

+0

मुझे नहीं लगता कि आपको जिस समस्या का सामना करना पड़ रहा है उसे समझ लिया है। '$ {myVars} 'पहले से ही वस्तुओं की एक सूची को संदर्भित करता है। – mindas

0

एक और विकल्प Velocity का उपयोग करना है। यह जेएसटीएल से काफी अच्छा है।

+1

एक रचनात्मक विकल्प के लिए वोट दें (और मेरे लिए व्यक्तिगत रूप से पसंदीदा) लेकिन फिर हम हमेशा यह नहीं चुन सकते कि हमें विचारों को कैसे पेश करने की अनुमति है – darkpbj

7

एक साधारण जावा केवल "चाल ठीक" वह भी बड़े JSTL संस्करण में काम करता है, और बिना किसी अतिरिक्त taglibs/config/निर्भरता/चौखटे की आवश्यकता है, आदि कार्य करने के लिए आप चाहते हैं "रैप" करने के लिए है Map कक्षा से विस्तारित कक्षा में जेएसटीएल से कॉल करें, और इसकी get() विधि को ओवरराइड करें।

एक न्यूनतम उदाहरण के रूप में, यदि आप उदा। JSTL, से Math.sin() समारोह कॉल करने के लिए आप एक वर्ग को परिभाषित करेगा हैं: (अपनी कार्रवाई में फिर

public class Sine extends HashMap<Double, Double> { 
    private static final long serialVersionUID = 1L; // Avoids compiler-warning 

    @Override 
    public Double get(Object arg) { 
     Double x = (Double) arg; 
     return Math.sin(x); 
    } 
} 

निष्पादित) विधि, है न:

... 
request.setAttribute("sine", new Sine()); 
... 

फिर jsp में आप कह सकते हैं:

${sine[0.75]} 

मूल्य की गणना करने Math.sin(0.75)

जेएसटीएल वैरिएबल साइन को Map के रूप में पेश करेगा, लेकिन आप get() विधि से अपनी पसंद की कुछ भी गणना और वापसी कर सकते हैं।

मैं इसे अगर आप अपने समारोह, लिए एक से अधिक तर्क है, लेकिन उसके लिए समाधान होना चाहिए, बहुत :)

+1

दिलचस्प दृष्टिकोण, साझा करने के लिए धन्यवाद! – mindas

+1

बहुत अच्छा और मुश्किल, बहुत बहुत धन्यवाद। उन लोगों के लिए जो इन सामानों में नए हैं मॉडल &View.addObject ("साइन", नया साइन()); request.setAttribute ("साइन", नई साइन()) के बराबर वसंत एमवीसी संस्करण है; – HaMi

1

पिछले करने के लिए एक टिप्पणी जोड़ने के वांटेड (समय से थोड़ा अधिक शामिल हो जाता है लगता है) रोप का जवाब, लेकिन "प्रतिष्ठा" गायब है, इसलिए यहां मैं एक उत्तर के साथ हूं।

मुझे जल्द ही इस तरह के मानचित्र के साथ एक ही विचार था, लेकिन इसे "डायनामिक मैप", डायनामिक मैपकलक्यूलेटर इंटरफ़ेस रखने और इसे किसी भी विधि में किसी भी विधि कॉल को लपेटने की अनुमति देने के बिना इसे अधिक आम तौर पर प्रयोग करने की कोशिश की गई (बिना किसी आवश्यकता के अज्ञात वर्ग तात्कालिकता का उपयोग करते हुए, हर बार नया नक्शा कार्यान्वयन)।

यह विषय हो सकता है, अगर आप रुचि रखते हैं: A qu. of style: dynamic map JSTL hack to work around missing parameter function calls

और मैं वहाँ राय में रुचि होगी: यह कुछ आप एक बुरा विवेक के बिना नहीं हो सकता है?

संबंधित मुद्दे