क्या <f: मेटाडेटा>, <f: viewParam> और <f: viewAction> का उपयोग किया जा सकता है?


149

क्या कोई स्पष्ट कर सकता है कि हम सामान्य रूप से, या वास्तविक दुनिया के उदाहरण में, इस स्निपेट का उपयोग कैसे कर सकते हैं?

<f:metadata>
    <f:viewParam id="id" value="#{bean.id}" />
    <f:viewAction action="#{bean.init}" />
</f:metadata>

जवाबों:


288

प्रक्रिया जीईटी मापदंडों

<f:viewParam>सेटिंग, रूपांतरण और GET पैरामीटर के सत्यापन का प्रबंधन करता है। यह जैसा है <h:inputText>, लेकिन तब GET मापदंडों के लिए।

निम्न उदाहरण

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

मूल रूप से निम्नलिखित है:

  • नाम से अनुरोध पैरामीटर मान प्राप्त करें id
  • परिवर्तित और उसे सत्यापित करने में यदि आवश्यक हो तो (आप उपयोग कर सकते हैं required, validatorऔर converterगुण और घोंसला एक <f:converter>और <f:validator>के साथ के रूप में की तरह उस में <h:inputText>)
  • यदि रूपांतरण और सत्यापन सफल हो जाता है, तो इसे #{bean.id}मूल्य द्वारा valueदर्शाई गई बीन संपत्ति के रूप में सेट करें , या यदि विशेषता अनुपस्थित है, तो इसे नाम पर अनुरोध के रूप में सेट करें idताकि यह #{id}दृश्य में उपलब्ध हो ।

इसलिए जब आप पृष्ठ को खोलते हैं, foo.xhtml?id=10तब पैरामीटर मान 10बीन में इस तरह सेट हो जाता है, दृश्य प्रस्तुत होने से ठीक पहले।

सत्यापन के अनुसार, निम्न उदाहरण परम को required="true"10 और 20 के बीच के मूल्यों को निर्धारित करता है । कोई भी सत्यापन विफलता प्रदर्शित होने वाले संदेश के परिणामस्वरूप होगी।

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
</f:metadata>
<h:message for="id" />

जीईटी मापदंडों पर व्यावसायिक कार्रवाई करना

आप इसके लिए उपयोग कर सकते हैं <f:viewAction>

<f:metadata>
    <f:viewParam id="id" name="id" value="#{bean.id}" required="true">
        <f:validateLongRange minimum="10" maximum="20" />
    </f:viewParam>
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
<h:message for="id" />

साथ में

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

<f:viewAction>तथापि JSF 2.2 (के बाद से नया है <f:viewParam>पहले से ही JSF 2.0 के बाद से मौजूद है)। यदि आप अपग्रेड नहीं कर सकते हैं, तो <f:event>इसके बजाय आपका सबसे अच्छा दांव उपयोग कर रहा है ।

<f:event type="preRenderView" listener="#{bean.onload}" />

हालांकि यह हर अनुरोध पर लागू किया जाता है । यदि अनुरोध पोस्टबैक नहीं है, तो आपको स्पष्ट रूप से जांचना होगा:

public void onload() {
    if (!FacesContext.getCurrentInstance().isPostback()) {
        // ...
    }
}

जब आप "रूपांतरण / मान्यता विफल" मामलों को भी छोड़ना चाहते हैं, तो निम्नानुसार करें:

public void onload() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if (!facesContext.isPostback() && !facesContext.isValidationFailed()) {
        // ...
    }
}

<f:event>इस तरीके का उपयोग करना सार / हैक में है, यही कारण है कि <f:viewAction>JSF 2.2 में पेश किया गया था।


अगले दृश्य के लिए दृश्य पैरामीटर पास करें

आप नेविगेशन लिंक में दृश्य पैरामीटर को "पास-थ्रू" कर सकते हैं, जो includeViewParamsविशेषता पैरामीटर सेट trueकरके या includeViewParams=trueअनुरोध पैरामीटर जोड़कर कर सकते हैं।

<h:link outcome="next" includeViewParams="true">
<!-- Or -->
<h:link outcome="next?includeViewParams=true">

जो उपरोक्त <f:metadata>उदाहरण के साथ मूल रूप से निम्न लिंक उत्पन्न करता है

<a href="next.xhtml?id=10">

मूल पैरामीटर मान के साथ।

यह दृष्टिकोण केवल आवश्यकता है कि next.xhtmlहै भी एक <f:viewParam>बहुत ही पैरामीटर पर, अन्यथा यह के माध्यम से पारित नहीं किया जाएगा।


JSF में GET फॉर्म का उपयोग करें

<f:viewParam>भी "सादे HTML" मिल रूपों के साथ संयोजन में उपयोग किया जा सकता है।

<f:metadata>
    <f:viewParam id="query" name="query" value="#{bean.query}" />
    <f:viewAction action="#{bean.search}" />
</f:metadata>
...
<form>
    <label for="query">Query</label>
    <input type="text" name="query" value="#{empty bean.query ? param.query : bean.query}" />
    <input type="submit" value="Search" />
    <h:message for="query" />
</form>
...
<h:dataTable value="#{bean.results}" var="result" rendered="#{not empty bean.results}">
     ...
</h:dataTable>

मूल रूप से यह @RequestScopedबीन के साथ:

private String query;
private List<Result> results;

public void search() {
    results = service.search(query);
}

ध्यान दें कि के <h:message>लिए है <f:viewParam>, सादे HTML नहीं <input type="text">! यह भी ध्यान दें कि इनपुट मूल्य #{param.query}तब प्रदर्शित होता #{bean.query}है जब खाली होता है, क्योंकि प्रस्तुत मूल्य अन्यथा सत्यापन या रूपांतरण त्रुटि होने पर बिल्कुल नहीं दिखाएगा। कृपया ध्यान दें कि यह निर्माण JSF इनपुट घटकों के लिए अमान्य है (यह "कवर के तहत" पहले से ही कर रहा है)।


यह सभी देखें:


@BalusC "बीन" की गुंजाइश क्या होनी चाहिए जब चेहरे के साथ संयोजन के रूप में उपयोग किया जाए-पुनर्निर्देशित = सच? क्या यह उम्मीद के मुताबिक काम करेगा अगर स्कोप "@RequestScoped" पर सेट है?
गीक

@ Geek: एक पुनर्निर्देशन एक नया GET अनुरोध बनाता है। स्रोत और लक्ष्य सेम की सेम गुंजाइश अप्रासंगिक है। हालाँकि आपको एक नए GET अनुरोध के संभावित निहितार्थों को एक अनुरोध के लिए ध्यान में रखना चाहिए और scoped बीन को देखना चाहिए। यह भी देखें stackoverflow.com/questions/7031885/...
BalusC

@BalusC आपका वास्तव में क्या मतलब है "आपको एक नए GET अनुरोध के संभावित निहितार्थ को एक अनुरोध के लिए ध्यान में रखना चाहिए और scoped बीन को देखना चाहिए।"
गीक

@ गीक: उन्हें ट्रैश किया जाएगा और फिर से बनाया जाएगा क्योंकि उनका दायरा फिर समाप्त हो जाएगा और शुरू हो जाएगा।
बालुस सी सी

@BalusC। एक व्यापक जवाब। "जब आपको '@' का उपयोग करने की आवश्यकता हो तो पोस्टपॉइंट को देखने की सुविधा के लिए जैसे कि स्कॉप्ड बीन्स जो कि हर अनुरोध पर लागू नहीं किया जाता है, जांचें कि क्या अनुरोध पोस्टबैक नहीं है"। अगर यह हर अनुरोध पर लागू नहीं किया गया है, तो यह जांचना क्यों है कि अनुरोध एक वापसी है या नहीं?
उलूक बाय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.