2013-08-21 8 views
6

f:paramh:link के साथ बहुत अच्छा काम करता है, लेकिन p:commandLink या h:commandLink के साथ नहीं।f: param p के साथ काम नहीं करता है: कमांड लिंक्स या एच: क्वेरी स्ट्रिंग पर कमांड लिंक्स

उदाहरण के लिए, मेरे पास दो पृष्ठ test_first.xhtml और test_second.xhtml हैं, और एक बैकिंग जावा बीन TestBean.java है।

मैं test_first.xhtml चला रहा हूं।

यदि मैं link1 पर क्लिक करता हूं, जो h:link है, तो पृष्ठ test_second.xhtml पर रीडायरेक्ट करेगा। f:param की सहायता से, ब्राउज़र का पता बार .../test_second.xhtml?id=1 दिखाएगा। उस पृष्ठ पर, testBean.userId मुद्रित हो जाता है।

यदि मैं link2 या link3 पर क्लिक करता हूं, तो पृष्ठ test_second.xhtml पर रीडायरेक्ट करता है। हालांकि, पता बार केवल .../test_second.xhtml दिखाता है, कोई ?id=# नहीं है! और testBean.userId उस पृष्ठ पर मुद्रित नहीं होता है।

मैं commandLinkf:param के साथ कैसे काम कर सकता हूं? कभी-कभी मैं चाहता हूं कि लिंक किसी अन्य पृष्ठ पर रीडायरेक्ट न करें लेकिन डेटा के आधार पर बीन के कुछ तरीकों को कॉल करें।

test_first.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head/> 
<h:body> 
<h:form> 
    <h:link value="link1" outcome="test_second" > 
     <f:param name="id" value="1"/> 
    </h:link> 
    <br/><br/> 
    <h:commandLink value="link2" action="test_second?faces-redirect=true" > 
     <f:param name="id" value="2" /> 
    </h:commandLink> 
    <br/><br/> 
    <p:commandLink value="link3" action="test_second?faces-redirect=true"> 
     <f:param name="id" value="3" /> 
    </p:commandLink> 
    <br/><br/> 
</h:form> 
</h:body> 
</html> 

test_second.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
<f:metadata> 
    <f:viewParam name="id" value="#{testBean.userId}" /> 
</f:metadata> 
<h:head/> 
<h:body> 
<h:form> 
    This is the second page. 
    <h:outputText value="Selected id is #{testBean.userId}" /> 
    <h:commandButton value="Print page id" action="#{testBean.print()}" /> 
</h:form> 
</h:body> 
</html> 

TestBean.java

@ManagedBean 
@SessionScoped 
public class TestBean implements Serializable{ 
    private Integer userId; 

    public void print() { 
     System.out.println(userId); 
    } 

    public Integer getUserId() { 
     return userId; 
    } 

    public void setUserId(Integer userId) { 
     this.userId = userId; 
    } 
} 
+0

संबंधित: http://stackoverflow.com/questions/4317684/when-should-i-use-houtputlink-instead-of-hcommandlink/4317723#4317723 – BalusC

उत्तर

7

उन दो टैग, अर्थात् <h:link> और <h:commandLink> का अर्थ गलत व्याख्या की है, इसलिए, आप भी दो में से किसी से जुड़ी <f:param> का अर्थ गलत व्याख्या की। किसी भी मामले में प्रश्नों को और अधिक अंतर्दृष्टि प्राप्त करने से पहले दस्तावेज़ों को हमेशा पढ़ने के लिए उपयुक्त है।

<h:link> एक HTML "एक" एंकर तत्व बना देता है। घटक का मान एंकर टेक्स्ट के रूप में प्रस्तुत किया जाता है और घटक का नतीजा "href" विशेषता में दिए गए लक्षित यूआरएल को निर्धारित करने के लिए किया जाता है। किसी भी बच्चे को UIParameter घटकों स्ट्रिंग के साथ जोड़ दिया जाता है "href" विशेषता के मान के रूप में उत्पादन होने के लिए प्रश्न के रूप में प्रतिपादन से पहले पैरामीटर ...

<h:commandLink> एक HTML "एक" एंकर तत्व है कि एक रूप की तरह काम करता प्रस्तुत करना प्रस्तुत बटन * क्लिक करते समय ... यदि अक्षम विशेषता मौजूद नहीं है, या इसका मान गलत है।यह "href" विशेषता के मान के रूप में "#" प्रस्तुत करता है, जो घटक के वर्तमान मान को लिंक टेक्स्ट के रूप में प्रस्तुत करता है और * जावास्क्रिप्ट को प्रस्तुत करता है जो "ऑनक्लिक" विशेषता के मान के रूप में निम्नानुसार कार्यात्मक रूप से समतुल्य है :

document.forms['CLIENT_ID']['hiddenFieldName'].value='CLIENT_ID';  
document.forms['CLIENT_ID']['PARAM1_NAME'].value='PARAM1_VALUE'; 
document.forms['CLIENT_ID']['PARAM2_NAME'].value='PARAM2_VALUE'; return false; 
document.forms['CLIENT_ID'].submit()" 

जहां hiddenFieldName है जैसा कि ऊपर वर्णित CLIENT_ID UICommand घटक के clientid, PARAM नाम_ और PARAM _VALUE है के नाम और मान क्रमश: किसी भी नेस्टेड UIParameter बच्चों के हैं।

दूसरे शब्दों में, <h:link> टैग नेस्ट <f:param> उत्पन्न यूआरएल की एक क्वेरी पैरामीटर के रूप खत्म हो जाएगा, जबकि <h:commandLink> टैग <f:param> नेस्ट के भीतर किसी दिए गए मूल्य के साथ एक अनुरोध पैरामीटर के रूप में खत्म हो जाएगा के भीतर।

जबकि पहला व्यक्ति स्पष्ट है, दूसरा दूसरा बेहतर विस्तार के योग्य है। यह समझने के लिए कि यह क्या करता है, मान लीजिए कि यदि हम <h:commandLink> विवरण से दूर हैं तो एक POST अनुरोध भेजता है और अनुरोध पैरामीटर के रूप में सभी नेस्टेड <f:param> टैग संलग्न करता है। लेकिन यह आप पर निर्भर करता है कि आप उन्हें कैसे संभालेंगे, नेविगेशन पूरी तरह से आपके हाथों में है।

तो, पहला विकल्प एक हार्डकोडेड action विशेषता, जो का उपयोग मामला संदिग्ध है, action="second-page" में की तरह है, जो रास्ते में आप सभी पर किसी भी क्वेरी पैरामीटर में सफल नहीं हुआ सेट करने के लिए है। क्या किया जाएगा बिना किसी कार्रवाई के दूसरे दृश्य को पोस्ट करना और दूसरे को अग्रेषित करना। काफी गूंगा कार्रवाई।

दूसरा विकल्प action="#{bean.action}" में एक क्रिया विधि निर्दिष्ट करना है। इस मामले में आपको प्रदत्त क्रिया विधि में नेविगेशन को संभालना होगा, यानी पोस्टबैक के लिए विधि से null/void लौटाएं, या निर्दिष्ट दृश्य पर अग्रेषित करने के लिए एक स्ट्रिंग के रूप में नेविगेशन केस परिणाम लौटाएं। के रूप में अनुरोध पैरामीटर है कि आप <f:param> साथ पारित कर दिया है कि वे मानक JSF के साथ इसका मतलब है@ManagedProperty("#{param.name}") तरह के अनुरोध के-दायरे वाले सेम पर, या किसी-दायरे वाले सेम में ExternalContext#getRequestParameterMap() बुला, उदाहरण के लिए, कार्रवाई विधि में String param = externalContext.getRequestParameterMap().get("name") में की तरह, द्वारा उपलब्ध हो जाएगा। तो अब आपके पास एक्शन विधि में आपका पैरामीटर है कि आप इसका उपयोग करने के लिए स्वतंत्र हैं, बस यूआरएल के लिए मौजूद नियमों के एक समूह का पालन करें।

उल्लेख करने के लायक दो चीजें छोड़ दी गईं। याद रखें कि कमांड लिंक को कॉल करने के साथ पास किए गए अनुरोध पैरामीटर केवल उसी अनुरोध के भीतर उपलब्ध होंगे, क्योंकि आप उम्मीद कर सकते हैं कि यह faces-redirect=true से बचें जो मूल रूप से एक अन्य अनुरोध को सक्रिय करता है। दूसरा विकल्प वर्तमान दृश्य के पैरामीटर से गुजरने के लिए includeviewparams=true निर्दिष्ट करना है, यदि यह वांछित है, जैसा कि दूसरे उत्तर में उल्लिखित है।

2

आप कार्रवाई में & सीधे साथ मापदंडों श्रृंखलाबद्ध द्वारा यह कर सकता है विशेषता:

<p:commandLink value="link3" action="test_second?faces-redirect=true&id=3"/> 

अद्यतन 1

तुम भी &includeViewParams=true जोड़ने के लिए विचार कर सकते हैं। इस तरह अपने लक्षित नेविगेशन के पैरामीटर स्वचालित रूप से शामिल किया जाएगा।

संबंधित मुद्दे