2011-09-02 28 views
10

Tôi đang thực hiện yêu cầu HTTP POST từ GWT Client đến HTTPServlet. Servlet này đang tạo một tệp PDF từ nội dung yêu cầu và ghi nó vào luồng phản hồi.Xử lý tệp đính kèm để phản hồi với RequestBuilder trong GWT

Headers của dòng phản ứng là:

Content-Disposition: attachment; filename=report.pdf 

Tôi muốn mở PDF này ở cửa sổ mới của trình duyệt của người dùng hoặc nhắc anh ta tải nó.

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   
} 

Tôi nên xử lý phản hồi trong onResponseRecieved như thế nào?

Trả lời

17

Tôi nghĩ trong trường hợp này, bạn không nên sử dụng một cuộc gọi AJAX RequestBuilder duy nhất. Bạn có thể dựa vào hành vi trình duyệt mặc định bằng cách gọi một cuộc gọi bình thường và cho phép trình duyệt xử lý phản hồi PDF (hiển thị nó bằng plugin trình xem PDF hoặc mở hộp thoại Lưu).

Có một số lựa chọn thay thế để đạt được điều này:

  1. Nếu bạn có thể truyền dữ liệu của bạn trong một yêu cầu GET (chỉ có thể cho một khối lượng dữ liệu nhỏ), bạn có thể tạo ra các URL với các dữ liệu như các tham số GET và sau đó mở một cửa sổ trình duyệt mới với Window.open() chuyển URL bằng dữ liệu.

  2. Đối với số lượng lớn hơn các dữ liệu bạn đầu tiên có thể gửi dữ liệu của bạn với RequestBuilder đến máy chủ để lưu trữ các dữ liệu temporaly và trong RequestCallback.onResponseReceived() mở một cửa sổ trình duyệt mới với một URL ngắn như trên trong thay thế 1. Về phía server bạn có để phân chia servlet thế hệ PDF thành hai phần: một servlet lưu trữ dữ liệu với phương thức POST (tức là lưu trữ dữ liệu vào phiên web) và một servlet tạo PDF bằng phương thức GET, lấy dữ liệu ra khỏi phiên làm việc (và xóa nó) và không cần tham số lớn.

  3. Tạo biểu mẫu có phương thức POST, trường ẩn cho dữ liệu của bạn và URL servlet thế hệ PDF. Điền vào các trường ẩn với dữ liệu của bạn và gửi biểu mẫu theo chương trình (ví dụ: FormPanel.submit()). Nếu bạn tạo FormPanel bằng một target name trình duyệt sẽ mở một cửa sổ mới hoặc sử dụng khung được chỉ định để xử lý phản hồi.

1

Ở phía máy khách, sử dụng Anchor thay vì trình tạo yêu cầu và gọi trực tiếp servlet bằng cách sử dụng Window.Location.replace (URL.encode (formActionUrl));

Các vấn đề liên quan