2012-11-27 9 views
11

एक उदाहरण उम्मीद है कि इस मुद्दे को प्रदर्शित करना चाहिए। मेरे पास पृष्ठ पर प्रदर्शित 10 दस्तावेज़ हैं, उनमें से 3 में ज़िप पैकेज के अंदर निहित अतिरिक्त जानकारी है। प्रारंभिक पृष्ठ लोड के दौरान, मुझे केवल यह पता है कि कौन से दस्तावेज़ों में यह अतिरिक्त जानकारी है, मैं इन ज़िप फ़ाइलों के लिए यूआरएल जानता हूं। तो फिर, मैं एक लिंक ('ज़िप पैकेज प्राप्त करें') को 3 दस्तावेज़ों में प्रदर्शित करता हूं जिनमें अतिरिक्त ज़िप फ़ाइलें होती हैं। जब उपयोगकर्ता 'ज़िप पैकेज प्राप्त करें' पर क्लिक करता है, तो यह बैकिंग बीन में एक विधि को कॉल करता है जो ज़िप पैकेज के यूआरएल को जानने के लिए डेटाबेस में जाता है। एक बार ऐसा करने के बाद, मैं ब्राउज़र में ज़िप पैकेज की सेवा करना चाहता हूं जो तब सेव के रूप में पॉप अप करेगा ... संवाद और उपयोगकर्ता ज़िप पैकेज को सहेज सकता है।जेएसएफ बैकिंग बीन में गतिशील रूप से निर्मित URL पर बैकिंग बीन से रीडायरेक्ट कैसे करें?

मैंने दो दृष्टिकोणों की कोशिश की है लेकिन उनमें से कोई भी काम नहीं करता है।

दृष्टिकोण 1

<p:commandLink actionListener="#{myBackingBean.zipPackage(aDocument)}" 
       value="Get Zip Package" 
       ajax="false" 
       rendered="#{aDocument.packageAvailable}"/> 
public String zipPackage(DocItem item){ 
    //logic here to figure out the URL for this item's zip package 
    return packageLink; 
} 

दृष्टिकोण 2

<h:outputLink onclick="getPackageLink([{name:'product', value: '#{aResult.product}'}, {name:'version',value:'#{aResult.version}'}])" 
    <h:outputText value="Get Documentation Package"/> 
</h:outputLink> 
<p:remoteCommand name="getPackageLink" actionListener="#{kbBackingBean.zipPackage()}"/> 
public String zipPackage() { 
    Map map = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 
    String product = (String) map.get("product"); 
    String version = (String) map.get("version"); 
    //logic here to figure out the URL for this item's zip package 
    return packageLink; 
} 

के रूप में पृष्ठ लोड और 10 दस्तावेज प्रदर्शित किए जाते हैं, 'पिन पैकेज प्राप्त करें' क्लिक (3 दस्तावेजों के लिए) कुछ भी नहीं, ई पृष्ठ के समान ही यूआरएल है। जब मैं उस पर क्लिक करता हूं, तो यह सर्वर को एक GET अनुरोध भेजता है और बैकिंग बीन फ़ंक्शन को भी कॉल करता है। दृष्टिकोण 1 के साथ, ब्राउजर प्रतिक्रिया को प्रस्तुत करने से पहले बैकिंग बीन विधि को समाप्त करने के लिए प्रतीक्षा करता है। दृष्टिकोण 2 के साथ, कोई प्रतीक्षा नहीं है और ब्राउज़र तुरंत पृष्ठ को फिर से लोड करता है। मुझे संदेह है कि 'गेट ज़िप पैकेज' लिंक पृष्ठ पर ही इंगित करता है, ब्राउज़र के जीईटी अनुरोध को पहले संसाधित किया जाता है और बैकिंग बीन विधि की प्रतिक्रिया बस खो जाती है।

एक तीसरा दृष्टिकोण (मैंने अभी तक कोशिश नहीं की है) जो मुझे संदेह है कि एक कामलेट का आह्वान करना ठीक है जो ज़िप पैकेज को पूरा करेगा। लेकिन यह देखते हुए कि मेरे पास ज़िप पैकेज के लिए एक सीधा यूआरएल है, मैं उम्मीद कर रहा था कि ब्राउज़र में सर्विसलेट को शामिल किए बिना सेवा करने का कोई तरीका होगा।

कोई भी सुझाव (एस) या दृष्टिकोण (एसएस) जो मुझे सर्वलेट का आह्वान किए बिना यूआरएल का उपयोग करने की इजाजत देता है, का स्वागत है। बेशक, अगर सर्वलेट ऐसा करने का एकमात्र 'उचित' तरीका है, तो मैं निश्चित रूप से ऐसा करूँगा।

धन्यवाद।

उत्तर

26

आप तर्क इस तरह से कोशिश कर सकते हैं:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
context.redirect(context.getRequestContextPath() + "download-page.jsf?product=" + product + "&version=" + version); 
+0

मैं विश्वास नहीं कर सकता मैं भी यह किसी भी सोचा नहीं दिया। धन्यवाद :) बाहरी कॉन्टेक्स्ट संदर्भ = FacesContext.getCurrentInstance()। GetExternalContext(); getExternalContext(); context.redirect (पैकेजलिंक); – Harinder

+5

कभी-कभी हम इस परियोजना में बहुत अधिक हैं! –

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