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.
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 # –
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