2011-09-02 55 views
10

我正在從GWT客戶端向HTTPServlet發送HTTP POST請求。此Servlet從請求內容創建PDF文件並將其寫入響應流。響應流的GWT中的RequestBuilder處理附件

標題有:

Content-Disposition: attachment; filename=report.pdf 

我想打開這個PDF在用戶的瀏覽器的新窗口或提示他下載。

import com.google.gwt.http.client.*; 
... 

String url = "http://www.myserver.com/getData?type=3"; 
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, URL.encode(url)); 

try { 
    Request request = builder.sendRequest(data, new RequestCallback() { 
    public void onError(Request request, Throwable exception) { 
     // Couldn't connect to server (could be timeout, SOP violation, etc.)  
    } 

    public void onResponseReceived(Request request, Response response) { 
     if (200 == response.getStatusCode()) { 
      // Process the response in response.getText() 
      // Window.open(url, "_blank", ""); 
     } else { 
     // Handle the error. Can get the status text from response.getStatusText() 
     } 
    }  
    }); 
} catch (RequestException e) { 
    // Couldn't connect to server   
} 

我應該如何處理onResponseRecieved中的響應?

回答

17

我認爲在這種情況下,你不應該使用單一的RequestBuilder AJAX調用。您可以通過調用普通調用並讓瀏覽器處理PDF響應(使用PDF閱讀器插件或打開「保存」對話框)來依靠默認瀏覽器行爲。

有幾種備選方案,以實現這一目標:

  1. 如果你可以通過在GET請求(僅適用於小數據量)的數據,你可以創建一個數據作爲GET參數和URL然後用Window.open()傳遞帶有數據的URL來打開一個新的瀏覽器窗口。

  2. 對於更大量的數據,你可以先用RequestBuilder發表您的數據存儲數據temporaly服務器和RequestCallback.onResponseReceived()在替代1.打開一個新的瀏覽器窗口中出現了短網址像上面在你的服務器端將PDF生成servlet分成兩部分:帶POST方法的數據存儲servlet(即將數據存儲到Web會話中)和使用GET方法的PDF呈現servlet,該方法將數據從會話中取出(並刪除它)和不需要很大的參數。

  3. 使用方法POST創建表單,爲您的數據隱藏字段和PDF生成servlet URL。用您的數據填充隱藏字段並以編程方式提交表格(即FormPanel.submit())。如果您使用target name創建FormPanel,瀏覽器將打開一個新窗口或使用指定的框架來處理響應。

1

在客戶端,使用Anchor而不是請求構建器,並通過使用Window.Location.replace(URL.encode(formActionUrl))直接調用該servlet。