對於我來說這個問題非常簡單。點擊一個錨標籤,我使用a4j:jsFunction
執行一個javascript,並且此函數的操作應該從服務器流式傳輸一個XML文件。問題是,在richfaces響應中發送的流不會提供saveAs對話框,而是在瀏覽器上呈現xml。在閱讀了很多文章後,我明白Ajax響應不能給出SaveAs對話框。內容配置與附件不適用於AJAX響應
XHTML片段:
<h:form>
<a4j:jsFunction name="updateCart" reRender="idFavouritePanel">
<a4j:actionparam name="jsonObject" assignTo="#{archiveOrderBean.jsonObject}"/>
</a4j:jsFunction>
<a4j:jsFunction name="download" reRender="partTableId" action="#{archiveOrderBean.loadSelectedOrder}">
<a4j:actionparam name="strId" assignTo="#{archiveOrderBean.strId}" />
</a4j:jsFunction>
</h:form>
和響應從豆設置。
response.setContentType("application/xml");
response.setContentLength(byteArr.length);
response.addHeader("Content-Disposition", "attachment; filename=" + attr.getUrl());
// writer.write(byteArr.toString());
// writer.flush();
response.getOutputStream().write(byteArr);
response.getOutputStream().flush();
// post(trueStr,encPath,encUrl,trueStr,response);
FacesContext.getCurrentInstance().responseComplete();
在這方面的任何幫助將是非常有幫助的。
謝謝。我也在想同樣的方式,但是在等待我是否可以在這方面進一步學習:-) – chaosguru
@ chaosguru:Ajax請求由JavaScript代碼處理。 JavaScript **不能**處理二進制響應並強制一個*另存爲*對話框。您必須通過正常的按鈕或鏈接發送完全可用的同步請求。當前頁面在瀏覽器中將保持不變。這裏不需要JS/Ajax。 – BalusC
@BalusC:非常感謝,您的描述真的很有幫助。我會做相應的改變。 – chaosguru