2010-12-02 9 views
7

डाउनलोड करने के लिए एक JSF पृष्ठ में एक CommandButton का उपयोग करना। का उपयोग करना: जेएसएफ & रिचफैसेस।एक फाइल डाउनलोड करने के लिए एक JSF पृष्ठ में एक CommandButton का उपयोग करते हुए एक फ़ाइल

मैं एक मेज है (फैली ExtendedDataModel, परिवर्तनीय Serializable लागू करता है) कुछ डेटा के साथ और एक बटन "डाउनलोड" प्रत्येक पंक्ति में।

<a4j:commandButton id="getDownload" value="download" 
    style="margin-left:10px;margin-right:10px;width:100px;" 
    action="#{controller.download}" immediate="true" ajaxSingle="true"> 
    <f:setPropertyActionListener target="#{controller.idString}" value="#{item.id}" />      
</a4j:commandButton> 

मैं नियंत्रक में फ़ाइल का निर्माण करने के लिए है:

public void download(){ 
OutputStream out = null; 
.... 

FacesContext fc = FacesContext.getCurrentInstance(); 
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 
out = response.getOutputStream(); 

ZipOutputStream zipout = new ZipOutputStream(out); 
..... 

zipout.close(); 
response.setContentType("application/octet-stream"); 
response.addHeader("Content-Disposition", "attachment; filename=\""+filename+"\""); 
out.flush(); 
.... 

} finally { 
    try { 
     if (out!=null){ 
      out.close(); 
     } 
     FacesContext.getCurrentInstance().responseComplete(); 
    } catch (IOException e) { 
     logger.error(e); 
    } 

} 
... 
} 

समस्या शुरू कर दिया, जब मैं ExtendedDataModel मेरी स्वयं को लागू किया। पहले तो मैं ज प्रयोग किया है: commandLink, लेकिन नियंत्रक विधि कभी नहीं बुलाया गया था ... मैं कोशिश की और कोशिश की ... अब सही विधि कहा जाता है, लेकिन (ज़िप) फ़ाइल सामग्री पृष्ठ में दिखाया जाए। मुझे पृष्ठ में एक बटन/लिंक चाहिए, जिसे उपयोगकर्ता फ़ाइल डाउनलोड करने के लिए क्लिक कर सकता है। पृष्ठ को स्वयं नहीं बदला जाना चाहिए। कोई विचार?

मैं एक सर्वलेट बना सकते हैं, लेकिन मुझे समझ नहीं आता क्यों ExtendedDataModel अंदर लिंक का व्यवहार बदल दिया है।

Edit1

मैंने पहले

<h:commandLink id="getDownload" value="download" action="#{controller.download}">              
          <f:setPropertyActionListener target="#{controller.idString}" value="#{item.id}" />        
         </h:commandLink> 

इस्तेमाल किया। यह "सामान्य" समृद्ध तालिका के साथ काम करता है, लेकिन जब मैंने इसे अपनी खुद की तालिका में उपयोग नहीं किया जो विस्तारितडेटा मॉडल को बढ़ाता है।

संपादित करें 2 - समाधान/वर्कअराउंड

यह ज उपयोग करने के लिए असंभव है: CommandButton, .. लिंक ... जो कुछ भी स्वयं बनाया तालिका के अंदर, एक फाइल डाउनलोड करने के लिए। अब मैं फ़ाइल को डाउनलोड करने के लिए नए पैनल ग्रुप के अंदर एक नया पैनल समूह और दूसरा बटन प्रस्तुत करने के लिए तालिका में एक बटन का उपयोग कर रहा हूं। मैंने इसके लिए बहुत कुछ किया, एक अमीर चेहरे की तरह लग रहा है।

उत्तर

10

आप ajax अनुरोध के द्वारा एक फ़ाइल डाउनलोड नहीं कर सकते। a4j:commandButtonh:commandButton द्वारा बदलें।


अद्यतन अपने प्रश्न अद्यतन के अनुसार: आदेश लिंक प्राप्त करने/एक UIData घटक के अंदर बटन जैसे <h:dataTable>, <rich:dataTable>, आदि काम करने के लिए, आप यह सुनिश्चित करने की जरूरत है कि सेम जो डाटा मॉडल रखा है (जो कुछ भी UIData घटक के value विशेषता के पीछे है) प्रपत्र सबमिट के अनुरोध के दौरान बिल्कुल एक ही डाटा मॉडल संरक्षण है। यदि आप अपने बीन अनुरोध को स्कॉप्ड रखना चाहते हैं, तो सबसे आसान तरीका बीन को <a4j:keepAlive> टैग में संदर्भित करना है।

+0

ज: CommandButton काम नहीं करता है, के बाद से मैं ExtendedDataModel बढ़ाया। मैंने "सामान्य" समृद्ध टेबल का उपयोग किया - एच: कमांड बटन एक आकर्षण की तरह काम करता था। फिर मैंने टेबल को अपने आप से बदल दिया: एच: कमांड बटन ने अब विधि को नहीं बुलाया .. यह सिर्फ साइट को रीफ्रेश किया गया। साइट.जेएसएफ # –

+0

जैसी कुछ आपको वास्तव में एक सिंक्रोनस अनुरोध को आग लगाने की आवश्यकता है। जावास्क्रिप्ट बाइनरी प्रतिक्रिया को सही तरीके से संभाल नहीं सकता है क्योंकि सुरक्षा प्रतिबंधों के कारण * * के रूप में सहेजें * संवाद या स्थानीय डिस्क पर लिखने के लिए कोई सुविधा नहीं है।'A4j: commandButton' में 'AJAXSingle =" false "सेट करने का प्रयास करें (हालांकि मुझे नहीं लगता कि यह ठीक से काम करेगा)। मैं रिचफेस नहीं करता हूं, लेकिन इस समस्या को गुगल करने से मुझे पता चलता है कि आप अकेले नहीं हैं जो इस समस्या से जूझ रहे हैं। 'A4j: htmlCommandLink' को समाधान के रूप में भी सुझाव दिया गया है, इसे आज़माएं। – BalusC

4
<h:commandButton id="getDownload" value="download" action="#{controller.download()}" > 

</h:commandButton> 
public class Controller { 

OutputStream out = null; 
String filename = "ali.pdf"; 
public void download() throws IOException { 



    FacesContext fc = FacesContext.getCurrentInstance(); 
    HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 
    out = response.getOutputStream(); 

    ZipOutputStream zipout = new ZipOutputStream(out); 




    response.setContentType("application/octet-stream"); 
    response.addHeader("Content-Disposition", "attachment; filename=\""+filename+"\""); 
    out.flush(); 







try { 
     if (out != null) { 
      out.close(); 
     } 
     FacesContext.getCurrentInstance().responseComplete(); 
    } catch (IOException e) { 

    } 

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