JSF2 में किसी क्रिया से नेविगेट करते समय आप व्यू पैरामीटर कैसे पास करते हैं?




jsf-2 (4)

आप इसे प्राइमफेस का उपयोग करके कर सकते हैं:

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}">
</p:button>

मेरे बीन में एक क्रिया से, मैं दृश्य पैरामीटर की अपेक्षा रखने वाले दूसरे पृष्ठ पर रीडायरेक्ट करने का प्रयास कर रहा हूं। JSF2 में ऐसा करने का अनुशंसित तरीका क्या है?

उदाहरण के लिए, मेरा स्रोत पृष्ठ कहें: http://localhost/page1.xhtml

इसमें एक कमांड बटन है जो एक क्रिया को कॉल करता है:

<h:commandButton value="submit" action="#{myBean.submit}" />

जहां मेरा बीन दिखता है:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success";
}

और अब, मैं http://localhost/page2.xhtml?id=2 पर नेविगेट करने के लिए 'सबमिट' कार्रवाई की वापसी चाहता हूं

मैंने अपने नेविगेशन मामले में व्यू-पैरा के साथ ऐसा करने की कोशिश की है, लेकिन अजीब परिणामों के साथ। चेहरे-कॉन्फ़िगर स्निपेट निम्न की तरह दिखता है:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#{myBean.id}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

अजीब व्यवहार, भले ही MyBean स्कोप्ड का अनुरोध करने के लिए सेट है, यह केवल myBean.getId () को कॉल करता है, पहली बार जब मैं अपना एप्लिकेशन लोड करता हूं, और सभी बाद के कॉल के लिए उसी मान का पुन: उपयोग करता हूं, पृष्ठ 2 के लिए गलत दृश्य पैरामीटर का उत्पादन करता है।

इसलिए मैं ऐसा करने का एक बेहतर तरीका ढूंढ रहा हूं, या एक कारण / समाधान है कि प्रत्येक बार मेरे बीन से व्यू-पैरा का अनुरोध क्यों नहीं किया जा रहा है।


इन्हें देखें:

आपको कुछ की आवश्यकता होगी:

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

...तथा...

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

इस पृष्ठ से निर्णय लेना, ऐसा कुछ आसान हो सकता है:

 <managed-bean>
   <managed-bean-name>blog</managed-bean-name>
   <managed-bean-class>com.acme.Blog</managed-bean-class>
   <managed-property>
      <property-name>entryId</property-name>
      <value>#{param['id']}</value>
   </managed-property>
 </managed-bean>

एक बीन के संदर्भ के बिना एक समाधान:

<h:button value="login" 
        outcome="content/configuration.xhtml?i=1" />

मेरी परियोजना में मुझे इस दृष्टिकोण की आवश्यकता थी:

<h:commandButton value="login" 
        action="content/configuration.xhtml?faces-redirect=true&amp;i=1"  />

जेएसएफ में पैरामीटर पास करने के बारे में अनजान बात यह है कि आप यह तय नहीं करते कि क्या (कार्रवाई में) भेजना है, बल्कि आप जो प्राप्त करना चाहते हैं (लक्ष्य पृष्ठ में)।

जब आप एक कार्यवाही करते हैं जो एक रीडायरेक्ट के साथ समाप्त होता है, तो लक्ष्य पृष्ठ मेटाडेटा लोड होता है और सभी आवश्यक पैरामीटर पढ़ा जाता है और यूआरएल को पैराम के रूप में जोड़ा जाता है।

ध्यान दें कि यह बिल्कुल वही तंत्र है जैसा किसी भी अन्य जेएसएफ बाध्यकारी के साथ है: आप इनपुटटेक्स्ट के मूल्य को एक स्थान से नहीं पढ़ सकते हैं और इसे कहीं और लिख सकते हैं। व्यू पैराम में परिभाषित मूल्य अभिव्यक्ति का उपयोग पढ़ने (रीडायरेक्ट से पहले) और लिखने के लिए (रीडायरेक्ट के बाद) दोनों के लिए किया जाता है।

अपने बीन के साथ आप बस करते हैं:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success?faces-redirect=true&includeViewParams=true";
}

// setter and getter for id

अगर प्राप्त करने वाले पक्ष में है:

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

यह वही करेगा जो आप चाहते हैं।