2011-11-06 33 views
0

JSF頁面上存在命令鏈接。點擊鏈接時,會打開一個模式。 選擇模式中的下載按鈕,對輸入字段進行驗證,然後下載文件。要求是關閉模式並在成功下載文件後返回到同一頁面。當打開文件對話框顯示在同一頁面上時,我們如何關閉模式。在JSF 2.0中成功下載文件後關閉模式

<h:panelGroup rendered="#{downloadBacking.showDownloadModal}"> 
    <ui:include src="DownloadFile.xhtml" /> 
</h:panelGroup> 

showDownloadModal字段在viewscoped bean中定義。

點擊模態下載按鈕後,將調用downloadFile()方法。

public String downlaodFile(){ 
    // response.getwriter.write(string); 
    showDownloadModal = false; 
    return ""; 
} 

回答

1

您的downloadFile()方法不會這樣工作。每個請求只能發送一個一個響應。文件下載本身就是一個完整的響應。你不能附加其他數據;它只會使用該數據破壞下載的文件。或者,如果您已經正確編寫了下載文件代碼,您應該也看到了一個IllegalStateException: response already committed

你有2種選擇:

  1. 關閉上的一些JS代碼幫助的下載鏈接的點擊立即對話框。

    <h:commandButton value="Download" action="#{bean.downloadFile}" 
        onclick="some JS code here to hide the modal" /> 
    
  2. 保存文件服務器的臨時磁盤(或在內存byte[]如果不是大),並返回到其中隱藏對話框並有條件地呈現一些JS window.location指向該文件在同一頁面。如果要下載的文件實際上需要首先被創建/生成,這可能是耗時的,這是特別有用的。

    <h:panelGroup rendered="#{bean.downloadReady}"> 
        <script>window.location = '#{bean.downloadURL}';</script> 
    </h:panelGroup> 
    

    URL可以指向一個簡單的servlet,它從磁盤或內存中流式傳輸文件。

+0

你能告訴如何保存文件服務器的臨時磁盤。另外我是否還需要創建另一個Servlet類來存儲該文件,或者只需要在backing bean中的代碼應該很好? – user679526

+0

'File.createTempFile(前綴,後綴)'。是的,你需要創建一個servlet。這超出了JSF的責任。 – BalusC

+0

我在backing bean中創建了一個臨時文件並將內容複製到臨時文件。我創建了一個servlet。我怎樣才能將臨時文件從bean傳遞給servlet?我很困惑。請幫助我。 – user679526