2011-01-13 16 views
5

जैसा कि मैं इसे समझता हूं, स्ट्रूट 2 एक्शन क्लास उदाहरण (स्ट्रूट 1 के विपरीत) स्टेटफुल हो सकते हैं, क्योंकि प्रत्येक कार्य या किसी पोस्ट में पोस्ट बैकिंग एक्शन क्लास का एक नया उदाहरण बनाता है।स्ट्रेट्स 2, सत्यापन और राज्य संबंधी कार्रवाइयों को बेहतर ढंग से समझने में मेरी सहायता करें

मैं यह भी देखना एक मानक मुहावरा (पैटर्न?) इनपुट रूपों प्रदान करने के लिए है कि (?): एक ही .jsp इस तरह, दो अलग अलग कार्यों के घटक दृश्य के रूप में प्रयोग किया जाता है:

<action name="showForm" class="defaultActionThatDoesNothingExceptReturnSuccess"> 
    <result name="success">inputForm.jsp</result> 
</action> 

<action name="validateAndProcessForm" class="realAction"> 
    <result name="input">inputForm.jsp</result> 
    <result name="success">formProcessed.jsp</result> 
</action> 

पहली क्रिया इनपुट को प्रमाणित किए बिना या प्रसंस्करण के बिना फॉर्म को प्रदर्शित करती है। दूसरा कार्रवाई करने के लिए .jsp पदों में प्रपत्र:

<s:form action="validateAndProcessForm" method="post"> 

और है कि दूसरी कार्रवाई तैनात क्षेत्रों/मानकों की पुष्टि करता है, "इनपुट" लौटने यदि प्रपत्र के आदानों अपूर्ण या अमान्य है, या वास्तव में कार्रवाई बुला कक्षा execute यदि इनपुट पूर्ण और मान्य हैं, इस प्रकार फॉर्म को प्रोसेस करना और (उदाहरण) formProcessed.jsp लौटा रहा है जो "आपके इनपुट के लिए धन्यवाद" जैसा कुछ प्रदर्शित करता है।

तो हम "पिकेट बाड़" मुहावरा की इस तरह है:

defaultAction-   -> realAction- 
      |   |  |  | 
      -> input.jsp- <---  -> success.jsp 

यह किया जाता है ताकि पहली बार input.jsp प्रदर्शित किया जाता है, सत्यापन बुलाया नहीं कर रहे हैं (और इसलिए सत्यापन त्रुटियों नहीं दिखाए जाते हैं), लेकिन उस जेएसपी पर सबमिट बटन के बाद क्लिक किया गया है, "वास्तविक" क्रिया इनपुट को मान्य करेगी, संभवत: input.jsp प्रदर्शित होने वाले अमान्य इनपुट को कॉल करने वाली त्रुटियों को पारित करने के लिए।

जो हमें वापस राज्यव्यापी, गैर-सिंगलटन कार्यों में लाता है; क्योंकि कार्रवाई राज्यव्यापी है और इस प्रकार जीईटी या पीओएसटी में साझा नहीं की जाती है, और प्रत्येक इंस्टेंस को उस जीईटी या पोस्ट के लिए तुरंत चालू किया जाता है, कार्रवाई के बारे में जानने का कोई तरीका नहीं है कि किसी विशेष सत्र ने एक ही पृष्ठ को कई बार "प्राप्त किया" है। तो showForm.action होगा कभी नहीं सत्यापित हो रही है, और होगा हमेशा का सत्यापन (और इस शो त्रुटियों अगर पैरामीटर अमान्य हैं) geting, भले ही कि प्राप्त पहली बार एक विशेष सत्र "getted" उस URL नहीं है।

यही कारण है कि हमें "बाड़ पोस्ट" की आवश्यकता है: इनपुट को कैप्चर करने के लिए दूसरा फॉर्म केवल फॉर्म प्रदर्शित करने के लिए पहली क्रिया है।

क्या मेरी समझ सही है? क्या शुरुआती जीईटी पर इनपुट मान्य करने के लिए ऐसा करने के लिए कम वर्बोज़ तरीका है, लेकिन पोस्ट पर मान्य करने के लिए, प्रत्येक फॉर्म के लिए दो कार्य किए बिना?

+0

प्रपत्र प्रसंस्करण फ़ॉर्म को देखने के लिए अलग-अलग कार्रवाइयों का उपयोग न करें। –

उत्तर

9

पिक्चर बाड़ के बिना जो भी आप चाहते हैं उसे करने का एक और तरीका है। डिफ़ॉल्ट रूप से सत्यापन इंटरसेप्टर इनपुट विधि के लिए आग नहीं करता है। इसलिए आप अपने struts.xml को निम्न में अपडेट कर सकते हैं:

<action name="*MyForm" method="{1}" class="realAction"> 
    <result name="input">inputForm.jsp</result> 
    <result name="success">formProcessed.jsp</result> 
</action> 

इस सेटअप के साथ, आपको खाली कार्रवाई की आवश्यकता नहीं है। जब आप पहली बार फॉर्म पर जाते हैं, तो आप "inputMyForm" यूआरएल पर जाते हैं, और आपके फॉर्म एक्शन को सिर्फ "माईफॉर्म" पर इंगित करते हैं। विधि ब्लॉक में {1} का अर्थ केवल यह है कि फ्रेमवर्क कार्रवाई नाम से * जो भी विधि मेल करता है उसे कॉल करेगा। यदि * मैच खाली है, तो यह निष्पादन विधि के लिए डिफ़ॉल्ट है।

  • MyForm अपनी कार्रवाई वर्ग की विधि पर अमल() के लिए जाना जाएगा

    • inputMyForm अपनी कार्रवाई वर्ग की विधि इनपुट() के लिए जाना जाएगा
    • executeMyForm जाना होगा: तो आप कार्यों में निम्न प्रकार के मिल अपनी कार्रवाई वर्ग की विधि पर अमल() के लिए
    • customMethodNameMyForm अपनी कार्रवाई वर्ग

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

    इसके अलावा, यदि आप एक्शनस्पोर्ट क्लास को विस्तारित कर रहे हैं, तो वह वर्ग पहले ही इनपुट() विधि को परिभाषित करता है, इसलिए आपको इसे पूरा करने के लिए अपनी एक्शन क्लास को बदलने की भी आवश्यकता नहीं होगी।

  • 0

    चीजों को अलग-अलग करना संभव है लेकिन कहें कि आप स्ट्रेट्स 2 को सभी अनुरोधों को संभालने दें। स्ट्रेट्स 2 हैंडल की हर चीज एक "एक्शन" है।

    जीईटी या पोस्ट के बारे में चिंता न करें, यदि वे पैरामीटर हैं (भले ही वे प्राप्त हों या सेट हों) तो डेटा को भेजने के दो अलग-अलग तरीके हैं, तो struts2 उस डेटा को क्रिया वर्ग पर रखने का प्रयास करेगा (मानते हैं कि एक है)। यदि कोई सत्यापन विधि (या एक उचित नामित सत्यापन xml फ़ाइल) है तो वर्ग गुण सेट होने के बाद सत्यापन चलाया जाएगा। फिर वर्ग के लिए निष्पादन() विधि कहा जाता है (माना जाता है कि एक वर्ग है)। इसके बाद एक जेएसपी आम तौर पर प्रस्तुत किया जाता है जो इसके निपटारे में कार्रवाई के तरीके में सभी सार्वजनिक डेटा है।

    अपनी "शोफॉर्म" कार्रवाई करें ...आप xml को कम कर सकते हैं:

    <action name="showForm"> 
        <result>inputForm.jsp</result> 
    </action> 
    

    आप देख सकते हैं कि आपको कक्षा को परिभाषित करने की आवश्यकता नहीं है। इसके अलावा डिफ़ॉल्ट परिणाम सफलता है इसलिए हमें इसका उल्लेख करने की आवश्यकता नहीं है।

    तो जब एचएमटीएल की सोच हम पृष्ठों के संदर्भ में सोचेंगे। स्ट्रेट्स में सोचते समय हम कार्यों के संदर्भ में सोचते हैं, उन्हें केवल आवश्यकतानुसार जटिल होना चाहिए। यदि आपको कोई फॉर्म दिखाना है तो आपको शो फॉर्म एक्शन की आवश्यकता है, यदि आप एक डिस्प्ले पेज चाहते हैं जो फॉर्म डेटा का उपयोग करता है तो आपको "डिस्प्ले पेज" एक्शन की आवश्यकता होती है जो फॉर्म डेटा के साथ कुछ करता है।

    तो प्रत्येक क्रिया को यूआरएल से शुरू करने के बारे में सोचें> -----------> लौटने की तारीख (आम तौर पर एक जेएसपी प्रस्तुत करना) के साथ समाप्त होता है। डैश वैकल्पिक भाग हैं जिन्हें आप परिभाषित कर सकते हैं, लेकिन यदि आप नहीं करते हैं तो वे आपके लिए समझदारी से डिफ़ॉल्ट होंगे। यह देखने के लिए कि आपको कौन सी सुविधाएं प्रदान की गई हैं, आपको struts2-core-x.x.x.x.jar में देखना होगा और struts-default.xml की सामग्री को देखना होगा, जहां "डिफ़ॉल्ट स्टैक" परिभाषित किया गया है। बदले में प्रत्येक इंटरसेप्टर को बुलाया जाता है, यह जानने के लिए कि वे क्या पेशकश करते हैं (और अन्य इंटरसेप्टर ऑफर करते हैं) आपको यह बताते हैं कि आप बॉक्स से क्या बाहर निकलते हैं (मैं उन्हें बहुत गहराई से नहीं देखता हूं, सिर्फ यह पता है कि वे वहां हैं ताकि आप उदाहरण के लिए जान सकें अगर आपको फ़ाइल को अपलोड करने की आवश्यकता है तो साधारण तथ्य यह है कि "फाइल अपलोड" इंटरसेप्टर डिफ़ॉल्ट स्टैक में है, यह संकेत होना चाहिए कि फ़ाइल अपलोड करने की क्षमताओं में बनाया जाना चाहिए।

    तो कोई भी "झूठी कार्रवाई" नहीं है इनपुट फॉर्म में। यह एक वास्तविक क्रिया है जो एक सरल है। आप सीखने के बाद पैकेज, क्रियाओं, पैकेज के लिए डिफ़ॉल्ट कार्रवाइयां और शायद वैश्विक स्तर पर परिभाषित करने और इंटरसेप्टर को परिभाषित करने का तरीका सीखने के बाद आपको कॉन्फ़ेंशन प्लग इन को देखना चाहिए। यह जीवन को बहुत आसान बनाता है!

    0

    आपका प्रश्न समझ में आता है। वाई हमारा पैटर्न सही है, हालांकि:

    • क्वाटरनियन ने बताया कि वहां बहुत कम या कोई "क्रियात्मकता" नहीं है। आपका पहला "शोफॉर्म" एक डमी "एक्शन मैपिंग" है, इसकी "कुछ भी नहीं" कक्षा को किसी विशेष श्रेणी परिभाषा की आवश्यकता नहीं है (डिफ़ॉल्ट एक्शनस्पोर्ट पर्याप्त है)।

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

    Btw, struts2 कार्रवाई "स्टेटफुल" बुला सही केवल यदि आप समझने के (आप ऐसा करेंगे, जाहिरा तौर पर) है कि 'राज्य' अनुरोधों के बीच जीवित रहने नहीं है कि है।

    +0

    हाँ, राज्यव्यापी, लगातार नहीं। – tpdi

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