在GWT中使用RequestBuilder处理响应中的附件



我正在从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        
}

我应该如何处理响应在onresponserecreceived ?

我认为在这种情况下,您不应该使用单个RequestBuilder AJAX调用。您可以通过调用正常调用并让浏览器处理PDF响应(使用PDF查看器插件显示它或打开保存对话框)来依赖默认的浏览器行为。

有几种方法可以实现这一点:

  1. 如果你可以在GET请求中传递你的数据(只可能用于小数据量),你可以用数据作为GET参数创建URL,然后用windows .open()传递带有数据的URL打开一个新的浏览器窗口。

  2. 对于较大的数据量,您可以首先使用RequestBuilder将数据POST到服务器以临时存储数据,并在requestcallback . onresponserreceived()中打开一个新的浏览器窗口,使用替代方案1中的短URL。在服务器端,你必须将PDF生成servlet分成两部分:一个带有POST方法的数据存储servlet(即将数据存储到web会话中)和一个带有GET方法的PDF呈现servlet,它将数据从会话中取出(并删除),并且不需要大的参数。

  3. 创建一个带有POST方法、数据隐藏字段和PDF生成servlet URL的表单。用数据填充隐藏字段,并以编程方式提交表单(即FormPanel.submit())。如果你用目标名称创建FormPanel,浏览器将打开一个新窗口或使用指定的框架来处理响应。

在客户端,使用Anchor而不是请求构建器并直接调用servlet

相关内容

  • 没有找到相关文章

最新更新