कब उपयोग करें f: viewAction / preRenderView बनाम PostConstruct?


95

जब किसी पृष्ठ के लिए एनोटेशन का उपयोग करके डेटा को इनिशियलाइज़ करने के लिए f:viewActionया preRenderViewईवेंट का उपयोग करना चाहिए @PostConstruct? बैकिंग बीन के स्कोप के प्रकार के आधार पर एक या दूसरे का उपयोग करने का औचित्य है यदि बैकिंग बीन है @RequestScoped, तो देखने के प्रतिपादन से पहले अपने बैकिंग बीन को इनिशियलाइज़ करने के लिए उपयोग f:viewActionया preRenderViewओवर @PostConstructकरने का विकल्प होगा जैसा कि दोनों के लिए अप्रासंगिक होगा। उसी प्रभाव में परिणाम?

f: viewAction या preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

या

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

जवाबों:


117

जब किसी को f: viewAction या preRenderView ईवेंट का उपयोग करना चाहिए, तो @PostConstruct एनोटेशन का उपयोग करते हुए किसी पृष्ठ छंद के लिए डेटा को इनिशियलाइज़ करने के लिए?

<f:viewAction>HTML रेंडर करने से पहले जब आप किसी विधि को निष्पादित करना चाहते हैं तो इसका उपयोग करें । यह विशेष रूप से उपयोगी है यदि आप <f:viewParam>अद्यतन मॉडल मान चरण के दौरान निर्धारित मॉडल मूल्यों के आधार पर क्रिया करना चाहते हैं । अर्थात्, वे इस समय उपलब्ध नहीं हैं @PostConstruct। JSF 2.0 / 2.1 में, यह टैग मौजूद नहीं था और आपको preRenderViewवर्कअराउंड का उपयोग करना होगा ।

यदि बैकिंग सेम @RequestScoped है, तो क्या वे प्रभावी रूप से सटीक एक ही काम करते हैं? (और इसलिए यह डेवलपर की पसंद पर निर्भर है? (@PostConstruct लगता है "क्लीनर")।

नहीं, वे निश्चित रूप से प्रभावी रूप से एक ही काम नहीं करते हैं। @PostConstructकार्रवाई करने के लिए intented है सीधे सेम के निर्माण और सभी इंजेक्शन निर्भरता स्थापित करने और इस तरह के रूप में कामयाब गुण के बाद @EJB, @Inject, @ManagedProperty, आदि अर्थात्, इंजेक्शन निर्भरता नहीं सेम के निर्माता अंदर उपलब्ध हैं। इस प्रकार सेम, व्यू, सेशन या एप्लिकेशन स्कोप होने पर केवल एक बार व्यू, सेशन या एप्लिकेशन के अनुसार चलेगा। <f:viewAction>डिफ़ॉल्ट केवल प्रारंभिक GET अनुरोध पर लागू कर रहा है, लेकिन के माध्यम से कर सकते हैं onPostback="true"विशेषता साथ ही पोस्टबैक अनुरोध पर लागू किया जा करने के लिए विन्यस्त किया जा। preRenderViewघटना हर HTTP अनुरोध पर शुरू हो जाती है (हाँ, यह भी ajax अनुरोध शामिल हैं!)।

संक्षेप, उपयोग @PostConstructकरता है, तो आप इंजेक्शन निर्भरता और प्रबंधित गुण है जिसके द्वारा स्थापित कर रहे हैं पर कार्रवाई करने के लिए चाहते हैं @EJB, @Inject, @ManagedPropertyसेम के निर्माण के दौरान, आदि। उपयोग करें <f:viewAction>यदि आप भी द्वारा निर्धारित गुणों पर कार्रवाई करना चाहते हैं <f:viewParam>। यदि आप अभी भी JSF 2.0 / 2.1 पर हैं, तो preRenderViewइसके बजाय का उपयोग करें <f:viewAction>। यदि आवश्यक हो तो आप केवल प्रारंभिक अनुरोध पर कार्रवाई FacesContext#isPostback()करने के लिए एक चेक जोड़ सकते हैं preRenderView

यह सभी देखें:


धन्यवाद। क्षमा करें, जब आप प्रतिक्रिया लिख ​​रहे थे, तो मैंने अपना मूल प्रश्न संपादित किया ...
बेस्टप्रैक्टिस

मैंने बीन स्कोप का उल्लेख किया क्योंकि @PostConstruct को केवल एक बार बुलाया जाएगा यदि बीन SessionScoped था (उस समय बीन पहली बार बनाई गई है), लेकिन प्रीरेन्डरव्यू को हर बार पेज एक्सेस होने पर कहा जाएगा। या मुझे वह गलत लगा?
बेस्टप्रैक्टिस

हाँ, यह सही है। प्री रेंडर व्यू इवेंट को इन्वोक एक्शन चरण पर कहा जाता है। सेम के निर्माण के बाद पोस्ट का निर्माण किया जाता है। प्रत्येक HTTP अनुरोध पर एक सत्र स्कॉप्ड बीन का निर्माण नहीं किया जाता है।
बालुसक

मैं सोच रहा था कि मेरे तरीके को अजाक्स अनुरोध के दौरान बुलाया जा रहा था। isPostBack () कॉल ने दिन बचाया!
२०:३० पर जकोस्टा

1

क्या आपको प्रबंधित बीन के गुणों को आरंभ करने की आवश्यकता है? -> फिर, @ PostConstruct का उपयोग करें अन्यथा, क्या आपको अन्य दृश्य से पारित किए गए पैरामेट्स के साथ काम करने की आवश्यकता है? -> फिर, " preRenderView " का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.