2010-12-02 21 views
7

Bir dosya indirmek için jsf Sayfasındaki bir komutButton'u kullanma. Kullanımı: JSF & Richfaces.Bir komut dosyası kullanarak jsf Sayfasında bir dosyayı indirecek sayfa

Bir tablom var (ExtendedDataModel, Değiştirilebilir, Serializable uygular) bazı verilerle ve her satırda bir "indir" düğmesine sahiptir.

<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> 

ben denetleyicisi dosyayı oluşturmak zorunda: Ben ExtendedDataModel kendime uygulandığında

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); 
    } 

} 
... 
} 

Sorun, başladı. İlk başta h: commandLink kullandım, ama denetleyici yöntemi hiç çağrılmadı ... denedim ve denedim ... şimdi doğru yöntem çağrıldı, ancak (zip) dosya içeriği sayfada görüntülenir. Kullanıcının dosyayı indirmek için tıklayabileceği bir düğme/bağlantı istiyorum. Sayfanın kendisi değişmemelidir. Herhangi bir fikir?

Bir sunucu uygulaması oluşturabilirim, ancak ExtendedDataModel'in neden içindeki bağlantıların davranışını değiştirdiğini anlamıyorum.

Edit1

Daha önce

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

kullandı. "Normal" richfaces tablosuyla çalışır, ancak ExtendedDataModel'i genişleten kendi masamın içinde kullandığımda değil.

Düzenleme 2 - Çözüm/Çözüm

O h kullanmak mümkün değildir: KomutDüğmesi .. Bağlantı ... bir dosya indirmek için ne olursa olsun kendini yapılmış tablonun içinde. Şimdi yeni bir PanelGroup ve dosyayı indirmek için yeni PanelGroupt içinde ikinci bir düğme oluşturmak için tabloda bir düğme kullanıyorum. Ben bunun için çok googled, zengin yüzler böcek gibi görünüyor.

cevap

10

Bir dosyayı ajax isteği ile karşıdan yükleyemezsiniz. 'u h:commandButton ile değiştirin.


Güncelleme soru güncelleme göre: Komut bağlantıları almak için/gibi <h:dataTable>, <rich:dataTable>, vb çalışmak için UIData bileşenlerin içinde düğmeler, sen sağlamak için gereken veri modelini düzenliyor fasulye (UIData bileşeninin value özniteliğinin arkasında ne olursa olsun, formun isteği sırasında tam olarak aynı veri modelini korur. Fasulye isteğinizin kapsamını korumak istiyorsanız, en kolay yol, <a4j:keepAlive> etiketindeki fasulyeye referans vermektir.

+0

h: i ExtendedDataModel uzatıldı beri KomutDüğmesi'ı, çalışmıyor. "Normal" richfaces tablosunu kullandım - h: commandButton bir çekicilik gibi çalıştı. Daha sonra tabloyu kendimle değiştirdim: h: commandButton artık yöntemi çağırmadı .. sadece siteyi yeniledi. Site.jsf gibi bir şey # –

+0

Eşzamanlı bir isteği gerçekten yakmanız gerekiyor. JavaScript, * Farklı Kaydet * iletişimini zorlayacak veya güvenlik kısıtlamaları nedeniyle yerel diske yazacak bir özelliği olmadığı için ikili yanıtı düzgün işleyemez.A4x: commandButton'da ajaxSingle = "false" 'yi ayarlamayı deneyin (ancak bunun düzgün çalışacağını düşünmüyorum). RichFaces'ı yapmıyorum, ancak bu problemi çözme, bu problemle uğraşan tek kişi olmadığınızı öğrenir. 'A4j: htmlCommandLink' da bir çözüm olarak önerilmiştir, denemelisiniz. – 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) { 

    } 

} 
İlgili konular