2011-10-21 12 views
8

मैं जेएसएफ में विकसित परियोजना पर काम कर रहा हूं। जब भी हम जेएसएफ पेज को रीफ्रेश कर रहे हैं, तो अंतिम क्रिया ईवेंट फिर से निष्पादित किया जाता है। उदाहरण के लिए, जब मैं किसी सूची की प्रविष्टि को हटाने और परिणाम पृष्ठ को रीफ्रेश करने के लिए फॉर्म सबमिट करता हूं, तो उसी स्थिति में सूची से दूसरी प्रविष्टि भी हटा दी जाती है। यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?अंतिम फॉर्म के पुन: निष्पादन से कैसे बचें पृष्ठ को रीफ्रेश होने पर कार्रवाई सबमिट करें?

मैं चेहरे-config.xml में की कोशिश की है, लेकिन है कि मेरी समस्या का समाधान नहीं होता है,

समस्या पर मैं का सामना करना पड़ रहा और अधिक स्पष्ट प्राप्त करने के लिए है कि मैं कर रहा हूँ commandLink datatable से एक संसाधन दूर करने के लिए, मैं ActionListener उपयोग कर रहा हूँ विशेषता जो मेरे बैकिंगबीन में एक विधि को कॉल करती है, इसलिए समस्या तब होती है जब मैं कभी भी पेज एक्शन इवेंट को रीफ्रेश कर रहा हूं और विधि निष्पादित की जाती है जो तालिका से दूसरे संसाधन को हटा देती है। अग्रिम धन्यवाद

उत्तर

18

लक्षण बताते हैं कि पृष्ठ को POST अनुरोध द्वारा अनुरोध किया गया था और आप वेबब्रोसर की चेतावनी को अनदेखा कर रहे हैं कि अनुरोध को रीफ्रेश करते समय डेटा नाराज होगा। एक POST अनुरोध को ताज़ा करने के परिणामस्वरूप इसे फिर से निष्पादित किया जाएगा। यह एक जेएसएफ विशिष्ट समस्या नहीं है।

इसका सामान्य समाधान POST अनुरोध निष्पादित करने के बाद एक जीईटी अनुरोध पर रीडायरेक्ट भेजना है। इस तरह क्लाइंट ब्राउज़र दृश्य में GET अनुरोध प्राप्त कर देगा। इसे रीफ्रेश करने से फिर जीईटी अनुरोध को फिर से निष्पादित किया जाएगा जो कुछ भी संशोधित नहीं करता है (जब तक कि आप इसे देखने के अनुरोध से जुड़े अनुरोध के निर्माता के रूप में नहीं कर रहे हैं)। इसे POST-Redirect-GET पैटर्न के रूप में भी जाना जाता है।

जेएसएफ 2.0 के साथ, आप इसे बीन एक्शन के परिणाम में faces-redirect=true पैरामीटर जोड़कर प्राप्त कर सकते हैं।

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

आप अभी भी faces-config.xml में पुराने जमाने <navigation-case> रों उपयोग कर रहे हैं, तो एक ही प्रभाव के मामले में <redirect/> जोड़कर प्राप्त किया जा सकता।

एकमात्र नुकसान यह है कि अनुरोध स्कॉप्ड बीन्स इस तरह से खराब हो जाते हैं (एक रीडायरेक्ट मूल रूप से एक नया अनुरोध बनाने के लिए वेबब्रोसर को निर्देशित करता है) और इस प्रकार आप रीडायरेक्ट पेज में इसे फिर से चलाने के लिए अनुरोध स्कोप में डेटा पास नहीं कर सकते हैं। उदाहरण के लिए, एक सफल संदेश प्रदर्शित करना। जेएसएफ 2.0 में आप इसके बजाय फ्लैश स्कोप का उपयोग कर सकते हैं या पोस्ट को सामान्य पोस्ट के बजाय <f:ajax> सबमिट करके दे सकते हैं।

+0

हर बार जब मुझे ऐसा कोई जवाब दिखाई देता है तो मुझे लगता है कि "मैनुअल" का कुछ बड़ा खंड है जिसे मैंने पढ़ना चाहिए था लेकिन नहीं किया। @ बालससी क्या आपके पास ** नियम ** विधि के वापसी मूल्य पर लागू होने वाले सभी नियमों का एक लिंक है? यह पहला है जो मैंने ** चेहरे-रीडायरेक्ट ** पैरामीटर के बारे में सुना है। वहां अन्य पैरामीटर क्या संभव हैं? मुझे संदेह है कि ऐसा कुछ ऐसा उपयोगी होगा जो मुझे नहीं पता था। – AlanObject

+4

@Alan: यह विशेष एक (पीआरजी पैटर्न) सामान्य वेब विकास ज्ञान और HTTP और वेबब्रोसर कैसे काम करता है इसकी समझ है। समर्थित विशेष क्रिया पैरामीटर के रूप में, दूसरा एक'ViewParams = true' शामिल है। इसमें परिणाम लक्ष्य के अनुरोध पैरामीटर के रूप में वर्तमान दृश्य के सभी घोषित '' शामिल हैं। मैंने इसे ब्लॉग/दस्तावेज/संसाधन पढ़ने से सीखा। जावा ईई 6 ट्यूटोरियल में इसका भी उल्लेख है। इसका उल्लेख थोड़ा सभ्य जेएसएफ 2.0 पुस्तक, जैसे [जेएसएफ 2.0: द कंप्लीट रेफरेंस] (http://jsfcompref.com/) और [कोर जेएसएफ] (http://horstmann.com/corejsf/) में भी किया जाना चाहिए। – BalusC

+0

@ बालससी मेरे पास एक ही समस्या है, केवल मेरे पास एक डाटाटेबल है जहां मैं पंक्तियों पर सीआरयूडी कर सकता हूं। जब मैं पृष्ठ रीफ्रेश करता हूं, तो अंतिम क्रिया दोबारा सबमिट की जाती है। मैं इसे कैसे हल कर सकता हूं? मेरे पास सबमिट बटन नहीं है? – giorgimode

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