दिलचस्प पोस्ट
Google मानचित्र एपीआई v2 में मैपफ्रैग्मेंट पर कई मार्कर कैसे दिखाएं? पायथन में जावास्क्रिप्ट पार्सर बाएं, दाएं, बाहरी और इनर जुड़ने में क्या अंतर है? जावा का बिगडिस्कीबल। पॉवर (बिगडीकेमिल एक्सपोनेंट): क्या जावा लाइब्रेरी है जो यह करता है? कैसे सी में एक मेमोरी पता printf विशेष सदस्यों के खाका विशेषज्ञता? फ्लास्क एप "स्टेट के साथ पुनः आरंभ" इन्वेलीज आईडीईए द्वारा मेवेन होम (एम 2_होम) को नहीं लिया जा रहा है जावा प्रक्रिया के आवासीय स्मृति उपयोग (आरएसएस) बढ़ते हुए स्मृति में कहां रिक्त प्रकार जमा हो? कई स्थानों वाले तर्क पर रनटाइम। एक्सएसी जावा में एक सूची के सभी तत्वों को कैसे मुद्रित करें? SQL सर्वर: 5 कॉलम से अधिक गतिशील पिवट ओपनसीवी 2.3 सी – छवि के अंदर ऑब्जेक्ट अलग कैसे करें एसक्यूएल सर्वर में स्ट्रिंग से सभी गैर-वर्णमाला अक्षरों को कैसे पट्टी करना है?

कार्रवाई और कार्रवाई के बीच मतभेद

action और action बीच में अंतर क्या है, और मैं action बनाम action कब का उपयोग करना चाहिए?

Solutions Collecting From Web of "कार्रवाई और कार्रवाई के बीच मतभेद"

ActionListener

actionListener उपयोग करें यदि आप वास्तविक व्यवसाय क्रिया निष्पादित होने से पहले एक हुक चाहते हैं, उदाहरण के लिए लॉग इन करें, और / या एक अतिरिक्त संपत्ति सेट करके ( <f:setPropertyActionListener> ), और / या उस घटक तक पहुंच प्राप्त करें जिसने कार्रवाई (जो ActionEvent तर्क द्वारा उपलब्ध है) इसलिए, असली व्यवसाय की कार्रवाई शुरू होने से पहले प्रयोजनों को तैयार करने के लिए विशुद्ध रूप से।

actionListener विधि डिफ़ॉल्ट रूप से निम्न हस्ताक्षर है:

 import javax.faces.event.ActionEvent; // ... public void actionListener(ActionEvent event) { // ... } 

और इसे बिना किसी विधि के कोष्ठक के रूप में घोषित किया जाना चाहिए:

 <h:commandXxx ... actionListener="#{bean.actionListener}" /> 

ध्यान दें कि आप EL 2.2 द्वारा अतिरिक्त तर्क नहीं दे सकते। हालांकि आप कस्टम ActionEvent (एस) को पास कर और निर्दिष्ट करके ActionEvent पूरी तरह ओवरराइड कर सकते हैं निम्नलिखित उदाहरण मान्य हैं:

 <h:commandXxx ... actionListener="#{bean.methodWithoutArguments()}" /> <h:commandXxx ... actionListener="#{bean.methodWithOneArgument(arg1)}" /> <h:commandXxx ... actionListener="#{bean.methodWithTwoArguments(arg1, arg2)}" /> 
 public void methodWithoutArguments() {} public void methodWithOneArgument(Object arg1) {} public void methodWithTwoArguments(Object arg1, Object arg2) {} 

तर्कहीन पद्धति अभिव्यक्ति में कोष्ठक के महत्व को ध्यान दें यदि वे अनुपस्थित थे, तो जेएसएफ अभी भी ActionEvent तर्क के साथ एक विधि की अपेक्षा करेगा

यदि आप ईएल 2.2+ पर हैं, तो आप <f:actionListener binding> माध्यम से एक से अधिक क्रिया श्रोता तरीकों की घोषणा कर सकते हैं।

 <h:commandXxx ... actionListener="#{bean.actionListener1}"> <f:actionListener binding="#{bean.actionListener2()}" /> <f:actionListener binding="#{bean.actionListener3()}" /> </h:commandXxx> 
 public void actionListener1(ActionEvent event) {} public void actionListener2() {} public void actionListener3() {} 

binding विशेषता में कोष्ठकों के महत्व को ध्यान दें। यदि वे अनुपस्थित थे, तो ईएल भ्रामक रूप से एक javax.el.PropertyNotFoundException: Property 'actionListener1' not found on type com.example.Bean फेंक javax.el.PropertyNotFoundException: Property 'actionListener1' not found on type com.example.Bean , क्योंकि binding विशेषता डिफ़ॉल्ट रूप से एक मूल्य अभिव्यक्ति के रूप में व्याख्या की जाती है, विधि अभिव्यक्ति के रूप में नहीं। EL 2.2+ शैली कोष्ठक को जोड़ना पारदर्शी तरीके से एक अभिव्यक्ति में एक अभिव्यक्ति बदल जाता है एओ भी देखें मैं बाइंड करने में सक्षम क्यों हूँ <f: actionListener> एक मनमाना पद्धति से अगर यह JSF द्वारा समर्थित नहीं है?


कार्य

यदि आप व्यावसायिक क्रिया निष्पादित करना चाहते हैं तो action उपयोग करें और यदि आवश्यक है तो नेविगेशन को नियंत्रित करें। action विधि (इस प्रकार, नहीं चाहिए) एक String वापस आती है जो कि नेविगेशन केस परिणाम (लक्ष्य दृश्य) के रूप में उपयोग किया जाएगा null या void का एक रिटर्न वैल्यू इसे एक ही पृष्ठ पर वापस लौटाएगा और वर्तमान दृश्य स्कोप को जीवित रखेगा। रिक्त स्ट्रिंग या समान दृश्य आईडी का रिटर्न वैल्यू भी एक ही पृष्ठ पर लौट जाएगा, लेकिन दृश्य क्षेत्र को पुनः बनाएं और इस प्रकार वर्तमान में सक्रिय व्यू स्कॉड सेम को नष्ट कर दें और यदि लागू हो, तो उन्हें पुन: बनाएँ।

action विधि किसी भी वैध विधि MethodExpression हो सकती है, जो कि नीचे दिए गए जैसे EL 2.2 तर्कों का उपयोग करता है:

 <h:commandXxx value="submit" action="#{bean.edit(item)}" /> 

इस पद्धति के साथ:

 public void edit(Item item) { // ... } 

ध्यान दें कि जब आपकी क्रिया विधि पूरी तरह से एक स्ट्रिंग लौटाती है, तो आप यह भी ठीक उसी स्ट्रिंग को action विशेषता में निर्दिष्ट कर सकते हैं। इस प्रकार, यह पूरी तरह अनाड़ी है:

 <h:commandLink value="Go to next page" action="#{bean.goToNextpage}" /> 

एक कठोर कठोर स्ट्रिंग लौट जाने वाली इस मूर्खतापूर्ण विधि के साथ:

 public String goToNextpage() { return "nextpage"; } 

इसके बजाय, केवल उस हार्डकोड स्ट्रिंग को सीधे विशेषता में डाल दें:

 <h:commandLink value="Go to next page" action="nextpage" /> 

कृपया ध्यान दें कि यह बदले में एक खराब डिजाइन इंगित करता है: पोस्ट द्वारा नेविगेट करना। यह उपयोगकर्ता नहीं है और एसईओ दोस्ताना नहीं है यह सब समझाया गया है जब मैं एच का प्रयोग करना चाहिए: outputLink h: commandLink के बजाय? और इसे हल करना माना जाता है

 <h:link value="Go to next page" outcome="nextpage" /> 

यह भी देखें कि कैसे JSF में नेविगेट करें? यूआरएल कैसे करें वर्तमान पेज को प्रतिबिंबित करें (और पिछला नहीं)


च: अजेक्स श्रोता

JSF 2.x के बाद से एक तीसरा रास्ता है, <f:ajax listener>

 <h:commandXxx ...> <f:ajax listener="#{bean.ajaxListener}" /> </h:commandXxx> 

ajaxListener विधि में निम्न हस्ताक्षर हैं:

 import javax.faces.event.AjaxBehaviorEvent; // ... public void ajaxListener(AjaxBehaviorEvent event) { // ... } 

Mojarra में, AjaxBehaviorEvent तर्क वैकल्पिक है, नीचे के रूप में अच्छा काम करता है

 public void ajaxListener() { // ... } 

लेकिन MethodNotFoundException , यह एक MethodNotFoundException फेंक MethodNotFoundException । नीचे जब आप तर्क को छोड़ना चाहते हैं, तो दोनों जेएसएफ के कार्यान्वयन में काम करता है।

 <h:commandXxx ...> <f:ajax execute="@form" listener="#{bean.ajaxListener()}" render="@form" /> </h:commandXxx> 

अजाक्स श्रोताओं कमान घटकों पर वास्तव में उपयोगी नहीं हैं वे इनपुट और चयन घटकों पर अधिक उपयोगी हैं <h:inputXxx> / <h:selectXxx> । कमांड घटकों में, बस स्पष्टता और बेहतर स्व-दस्तावेजीकरण कोड के लिए action और / या actionListener लिए actionListener । इसके अलावा, actionListener तरह, f:ajax listener actionListener f:ajax listener एक नेविगेशन परिणाम लौटने का समर्थन नहीं करता है।

 <h:commandXxx ... action="#{bean.action}"> <f:ajax execute="@form" render="@form" /> </h:commandXxx> 

execute और render एट्रिब्यूट्स पर स्पष्टीकरण के लिए, प्राइमफैसेस प्रक्रिया / अपडेट और जेएसएफ़ को समझने के लिए प्रमुख एफ: अजाक्स निष्पादित / रेंडर एट्रिब्यूट्स ।


आमंत्रण आदेश

actionListener को हमेशा उसी क्रम में action से पहले ही आमंत्रित किया जाता है क्योंकि वे दृश्य में घोषित किए गए हैं और घटक से जुड़ी हैं। f:ajax listener हमेशा किसी भी क्रिया श्रोता से पहले लागू होता है। तो, निम्न उदाहरण:

 <h:commandButton value="submit" actionListener="#{bean.actionListener}" action="#{bean.action}"> <f:actionListener type="com.example.ActionListenerType" /> <f:actionListener binding="#{bean.actionListenerBinding()}" /> <f:setPropertyActionListener target="#{bean.property}" value="some" /> <f:ajax listener="#{bean.ajaxListener}" /> </h:commandButton> 

निम्न क्रम में तरीकों का आह्वान करेगा:

  1. Bean#ajaxListener()
  2. Bean#actionListener()
  3. ActionListenerType#processAction()
  4. Bean#actionListenerBinding()
  5. Bean#setProperty()
  6. Bean#action()

उपवाद सम्भालना

actionListener एक विशेष अपवाद का समर्थन करता है: AbortProcessingException यदि यह अपवाद किसी actionListener विधि से फेंका जाता है, तो जेएसएफ किसी भी शेष क्रिया श्रोताओं और क्रिया विधि को छोड़ देगा और सीधे प्रतिक्रिया को प्रस्तुत करने के लिए आगे बढ़ेगा। आप एक त्रुटि / अपवाद पृष्ठ नहीं देखेंगे, JSF हालांकि यह लॉग इन करेगा। जब भी किसी भी अन्य अपवाद को किसी actionListener से फेंक दिया जा रहा है, तब यह भी पूरी तरह से किया जाएगा। इसलिए, यदि आप व्यावसायिक अपवाद के परिणामस्वरूप पृष्ठ को एक त्रुटि पेज द्वारा ब्लॉक करना चाहते हैं, तो आपको निश्चित रूप से action पद्धति में नौकरी का प्रदर्शन करना चाहिए।

यदि एक actionListener का उपयोग करने का एकमात्र कारण है, तो एक ही पृष्ठ पर लौटने के लिए एक void विधि है, तो यह एक बुरा है action विधियां पूरी तरह से void भी वापस void , इसके विपरीत जो कुछ IDE आपको EL सत्यापन के माध्यम से विश्वास करते हैं। ध्यान दें कि प्राइमफ़ेस शोकेस के उदाहरण इस तरह की actionListener साथ पूरी जगह पर मौजूद हैं। यह वास्तव में गलत है इसका प्रयोग करने के लिए बहाने के रूप में इसका प्रयोग न करें।

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

BalusC के संकेत के अनुसार, actionListener डिफ़ॉल्ट रूप से निगल अपवाद, लेकिन जेएसएफ 2.0 में इसके लिए थोड़ा अधिक है। अर्थात्, यह निगल नहीं करता है और लॉग करता है, लेकिन वास्तव में यह अपवाद प्रकाशित करता है

ऐसा कॉल के माध्यम से होता है:

 context.getApplication().publishEvent(context, ExceptionQueuedEvent.class, new ExceptionQueuedEventContext(context, exception, source, phaseId) ); 

इस घटना के लिए डिफ़ॉल्ट श्रोता एक अपवादहैंडलर है, जिसके लिए Mojarra com.sun.faces.context.ExceptionHandlerImpl सेट है। यह क्रियान्वयन मूल रूप से किसी भी अपवाद को पुनर्स्थापित करेगा, सिवाय इसके कि वह एक AbortProcessingException, जो लॉग की गई है। एक्शनलिस्टनर अपवाद लपेटते हैं जो कि क्लाइंट कोड द्वारा ऐसे एबोर्ट प्रोसेसिंग एक्सक्साशन में फेंक दिया जाता है जो बताता है कि ये हमेशा क्यों लॉग इन किए जाते हैं।

यह ExceptionHandler फिर चेहरे-config.xml में एक कस्टम कार्यान्वयन के साथ बदला जा सकता है:

 <exception-handlerfactory> com.foo.myExceptionHandler </exception-handlerfactory> 

विश्व स्तर पर सुनने के बजाय, एक सेम भी इन घटनाओं को सुन सकता है। निम्नलिखित इस प्रकार की अवधारणा का प्रमाण है:

 @ManagedBean @RequestScoped public class MyBean { public void actionMethod(ActionEvent event) { FacesContext.getCurrentInstance().getApplication().subscribeToEvent(ExceptionQueuedEvent.class, new SystemEventListener() { @Override public void processEvent(SystemEvent event) throws AbortProcessingException { ExceptionQueuedEventContext content = (ExceptionQueuedEventContext)event.getSource(); throw new RuntimeException(content.getException()); } @Override public boolean isListenerForSource(Object source) { return true; } }); throw new RuntimeException("test"); } } 

(ध्यान दें, यह आम तौर पर श्रोताओं को कैसा होना चाहिए, यह केवल प्रदर्शन के प्रयोजनों के लिए ही है!)

इसे इस तरह से फेसलेट से कॉल करना:

 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:body> <h:form> <h:commandButton value="test" actionListener="#{myBean.actionMethod}"/> </h:form> </h:body> </html> 

परिणामस्वरूप एक त्रुटि पृष्ठ प्रदर्शित होगा।

एक्शन लास्टनर को पहली बार निकाल दिया जाता है, प्रतिक्रिया को संशोधित करने के विकल्प के साथ, कार्रवाई से पहले कहा जाता है और अगले पृष्ठ के स्थान को निर्धारित करता है।

यदि आपके पास एक ही पृष्ठ पर कई बटन हैं जो एक ही स्थान पर जाना चाहिए, लेकिन थोड़ा अलग चीजें करें, तो आप प्रत्येक बटन के लिए एक ही कार्रवाई का उपयोग कर सकते हैं, लेकिन थोड़ा अलग कार्यक्षमता को नियंत्रित करने के लिए एक अलग ActionListener का उपयोग कर सकते हैं।

यहां एक लिंक है जो संबंधों का वर्णन करता है:

http://www.java-samples.com/showtutorial.php?tutorialid=605