2011-10-07 35 views
1

對於我來說這個問題非常簡單。點擊一個錨標籤,我使用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(); 

在這方面的任何幫助將是非常有幫助的。

回答

0

我可以用粗糙的方法來解決這個問題,但不能推薦,但別無選擇。

我添加了一個隱藏的h:commandButtona4j:jsFunction移動屬性action="#{archiveOrderBean.loadSelectedOrder}",完成後的JavaScript執行我使用JavaScript顯式調用點擊事件h:commandButton。這將同步對XML的請求。總之決定點擊事件。

這是從運行時創建XML以來我不得不做的更改的一種方法。另一種方式是由@Bozho解釋。

謝謝@BalusC的幫助:-)

3

是的,你不能用ajax觸發saveAs對話框。你可以做的是返回一個URL。然後打開該URL(使用JavaScript)。然後服務器應該發送文件(使用適當的頭文件)。當然,你可以跳過所有這些,只是給鏈接到問題的URL(除非它是動態生成的)

+0

謝謝。我也在想同樣的方式,但是在等待我是否可以在這方面進一步學習:-) – chaosguru

+1

@ chaosguru:Ajax請求由JavaScript代碼處理。 JavaScript **不能**處理二進制響應並強制一個*另存爲*對話框。您必須通過正常的按鈕或鏈接發送完全可用的同步請求。當前頁面在瀏覽器中將保持不變。這裏不需要JS/Ajax。 – BalusC

+0

@BalusC:非常感謝,您的描述真的很有幫助。我會做相應的改變。 – chaosguru

相關問題