java – 在GWT中使用RequestBuilder处理附件

前端之家收集整理的这篇文章主要介绍了java – 在GWT中使用RequestBuilder处理附件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在从GWT Client向HTTPServlet发出HTTP POST请求.该Servlet正在从请求内容创建一个PDF文件,并将其写入响应流.

回应流的标题是:

  1. Content-Disposition: attachment; filename=report.pdf

我想在用户浏览器的新窗口中打开此PDF,或者提示他下载它.

  1. import com.google.gwt.http.client.*;
  2. ...
  3.  
  4. String url = "http://www.myserver.com/getData?type=3";
  5. RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,URL.encode(url));
  6.  
  7. try {
  8. Request request = builder.sendRequest(data,new RequestCallback() {
  9. public void onError(Request request,Throwable exception) {
  10. // Couldn't connect to server (could be timeout,SOP violation,etc.)
  11. }
  12.  
  13. public void onResponseReceived(Request request,Response response) {
  14. if (200 == response.getStatusCode()) {
  15. // Process the response in response.getText()
  16. // Window.open(url,"_blank","");
  17. } else {
  18. // Handle the error. Can get the status text from response.getStatusText()
  19. }
  20. }
  21. });
  22. } catch (RequestException e) {
  23. // Couldn't connect to server
  24. }

应该如何处理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,浏览器将打开一个新窗口或使用指定的框架来处理响应.

猜你在找的Java相关文章