ViewParam बनाम @ManagedProperty (मान = "# {param.id}")


97

इस तरह देखें पारामों को परिभाषित करने में क्या अंतर है:

<f:metadata>
  <f:viewParam name="id" value="#{someBean.id}"/>
</f:metadata>

और इस तरह से प्रबंधित में संपत्ति को परिभाषित करना:

@ManagedProperty(value = "#{param.id}")
private Integer id;

जवाबों:


144

<f:viewParam>:

  • अद्यतन मॉडल मान चरण के दौरान मान सेट करता है (क्योंकि यह विस्तारित होता है UIInput)।

  • सेट वैल्यू के दौरान उपलब्ध नहीं है @PostConstruct, इसलिए आपको सेट वैल्यू के आधार पर इनिशियलाइज़ेशन / प्रीलोडिंग करने के लिए अतिरिक्त <f:event type="preRenderView" listener="#{bean.init}" />अंदर की आवश्यकता है <f:metadata>। JSF 2.2 के <f:viewAction>बजाय आप इसके लिए उपयोग कर सकते हैं ।

  • नेस्टेड <f:converter>और <f:validator>अधिक ठीक-ठीक रूपांतरण / सत्यापन के लिए अनुमति देता है । यहां तक ​​कि एक <h:message>संलग्न किया जा सकता है।

  • किसी URL में includeViewParamsविशेषता <h:link>या includeViewParams=trueअनुरोध पैरामीटर का उपयोग करके GET क्वेरी स्ट्रिंग के रूप में शामिल किया जा सकता है ।

  • एक @RequestScopedबीन पर इस्तेमाल किया जा सकता है , लेकिन इसके लिए बीन की आवश्यकता होती है @ViewScopedयदि आप चाहते हैं कि दृश्य मापदंडों को दृश्य में संलग्न प्रपत्रों के कारण किसी भी सत्यापन विफलताओं से बचना चाहिए, अन्यथा आपको <f:param>कमांड द्वारा बाद के अनुरोधों के लिए सभी अनुरोध मापदंडों को मैन्युअल रूप से बनाए रखने की आवश्यकता है अवयव।

उदाहरण :

<f:metadata>
    <f:viewParam id="user_id" name="id" value="#{bean.user}"
        required="true" requiredMessage="Invalid page access. Please use a link from within the system."
        converter="userConverter" converterMessage="Unknown user ID."
    />
</f:metadata>
<h:message for="user_id" />

साथ में

private User user;

और एक @FacesConverter("userConverter")Http://example.com/context/user.xhtml?id=123 द्वारा पृष्ठ को आमंत्रित करना idकनवर्टर के माध्यम से पैरामीटर पास करेगा और Userऑब्जेक्ट को सेम प्रॉपर्टी के रूप में सेट करेगा ।


@ManagedProperty:

  • बीन के निर्माण के तुरंत बाद मूल्य सेट करता है।

  • सेट वैल्यू उपलब्ध है @PostConstructजिसके दौरान सेट वैल्यू के आधार पर अन्य गुणों के आसान इनिशियलाइज़ेशन / प्रीलोडिंग की अनुमति मिलती है।

  • देखने में घोषणात्मक रूपांतरण / सत्यापन के लिए अनुमति नहीं देता है।

  • #{param}अनुरोधित दायरे की तुलना में व्यापक पैमाने पर सेम की प्रबंधित संपत्ति की अनुमति नहीं है, इसलिए सेम होना आवश्यक है @RequestScoped

  • यदि आप #{param}बाद के POST अनुरोधों में मौजूद एक प्रबंधित संपत्ति पर भरोसा करते हैं, तो आपको इसे घटकों के रूप <f:param>में शामिल करने की आवश्यकता है UICommand

उदाहरण :

@ManagedProperty("#{param.id}")
private Long id;

private User user;

@EJB
private UserService userService;

@PostConstruct
public void init() {
    user = userService.find(id);
}

लेकिन आपको जब भी या कुछ के साथ फ़िदेलिंग करना होता userहै, तो आपको अपने आप को सत्यापन का प्रबंधन करना होगा।nullFacesContext#addMessage()


आप दोनों का उपयोग कर सकते हैं जब दोनों अनिवार्य हैं @PostConstructऔर includeViewParamsअनिवार्य हैं। अब आप केवल ठीक-ठीक रूपांतरण / सत्यापन लागू नहीं कर पाएंगे।


यह सभी देखें:


1
असाधारण मामलों में अनुरोध पैरामीटर प्राप्त करने के लिए अन्य विकल्प हैं: FacesContext.getCurrentInstance ()। GetExternalContext ()। GetRequestParameterMap ()। Get ("parernername");
स्वर्गदूत

1
@ इंजील: केवल तभी जब बीन में अनुरोध गुंजाइश की तुलना में व्यापक गुंजाइश होती है जो @ManagedPropertyअनुरोध पैरामीटर को असंभव बनाती है।
बालूसी

hi @ बाल्सक मैं किसी दूसरी पोस्ट पर मैनेजप्रॉपर्टी का उपयोग करके param.id से प्राप्त आईडी के मूल्य पर निर्भर करता हूं। मैं इसे f: param का उपयोग करके कैसे शामिल कर सकता हूं? बहुत बहुत धन्यवाद
sys_debug

1
@thufir: यह अपडेट मॉडल मान चरण के दौरान सेट किया गया है। बीन के निर्माण और निर्भरता इंजेक्शन के बाद, पोस्टकॉन्स्ट्रक्ट उससे बहुत पहले चलता है। यह श्रोता विधि में उपलब्ध है जिसे <f:event type="preRenderView">जेएसएफ 2.2 द्वारा या आगामी द्वारा लाया जाता है <f:viewAction>
बालुसक


6

2 अन्य अंतर:

  • @ManagedPropertyजेएसएफ द्वारा प्रबंधित बीन्स के साथ ही उपयोग करने योग्य है, सीडीआई द्वारा प्रबंधित बीन्स के साथ नहीं ( @Named);
    • <f:viewParam> केवल GET अनुरोधों के मापदंडों के साथ काम करता है।

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