我正在从GWT Client向HTTPServlet发出HTTP POST请求.该Servlet正在从请求内容创建一个PDF文件,并将其写入响应流.
回应流的标题是:
Content-Disposition: attachment; filename=report.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的响应?
解决方法
我认为在这种情况下,你不应该使用单一的RequestBuilder AJAX调用.您可以通过调用正常调用来依赖默认的浏览器行为,并让浏览器处理PDF响应(用PDF查看器插件显示或打开保存对话框).
实现这一点有几种选择:
>如果您可以通过GET请求传递数据(仅适用于小数据卷),则可以使用数据作为GET参数创建URL,然后打开一个新的浏览器窗口,其中Window.open()将URL传递给数据.
>对于大量数据,您可以先将RequestBuilder的数据与服务器POST数据进行临时存储,并在RequestCallback.onResponseReceived()中打开一个新的浏览器窗口,其中包含一个如上所述的简短URL.在服务器端,您必须拆分PDF生成servlet分为两部分:具有POST方法的数据存储servlet(即将数据存储到Web会话中)和使用GET方法的PDF渲染servlet,它将数据从会话(并删除)中删除,并且不需要大参数.
>创建一个表单,方法POST,数据的隐藏字段和PDF生成servlet URL.使用数据填写隐藏的字段,并以编程方式提交表单(即FormPanel.submit()).如果您使用target name创建FormPanel,浏览器将打开一个新窗口或使用指定的框架来处理响应.