我正在从GWT客户端向HTTPServlet发出HTTP POST请求。此Servlet正在从请求内容创建PDF文件并将其写入响应流。
响应流的标头是:
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中的响应?
答案 0 :(得分:17)
我认为在这种情况下你不应该使用单个RequestBuilder
AJAX调用。您可以通过调用普通调用并让浏览器处理PDF响应(使用PDF查看器插件显示它或打开“保存”对话框)来依赖默认浏览器行为。
实现这一目标有几种选择:
如果您可以在GET请求中传递数据(仅适用于小数据卷),您可以创建包含GET参数数据的URL,然后打开一个新的浏览器窗口并传递Window.open()带有数据的URL。
对于大量数据,您可以先使用RequestBuilder
将数据发送到服务器以临时存储数据,然后在RequestCallback.onResponseReceived()打开一个新的浏览器窗口,其中包含如上所示的短网址替代方案1.在服务器端,您必须将PDF生成servlet拆分为两部分:使用POST方法的数据存储servlet(即将数据存储到Web会话中)和使用GET方法的PDF呈现servlet,它将数据输出会话(并删除它)并且不需要大的参数。
使用方法POST,数据隐藏字段和PDF生成servlet URL创建表单。使用您的数据填充隐藏字段并以编程方式提交表单(即FormPanel.submit())。如果您使用target name创建FormPanel
,则浏览器会打开一个新窗口或使用指定的框架来处理响应。
答案 1 :(得分:1)
在客户端,使用Anchor而不是请求构建器并直接调用servlet 通过使用Window.Location.replace(URL.encode(formActionUrl));