2011-09-02 54 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。