2011-09-02 16 views
10

में RequestBuilder के साथ प्रतिक्रिया में अनुलग्नक संभाल लें मैं जीडब्ल्यूटी क्लाइंट से HTTPServlet तक HTTP पोस्ट अनुरोध कर रहा हूं। यह सर्वलेट अनुरोध सामग्री से पीडीएफ फाइल बना रहा है और इसे प्रतिक्रिया स्ट्रीम में लिख रहा है। प्रतिक्रिया स्ट्रीम कीजीडब्ल्यूटी

हेडर हैं:

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   
} 

मुझे रेस्पॉन्स रिसीव में प्रतिक्रिया कैसे संभालना चाहिए?

उत्तर

17

मुझे लगता है कि इस मामले में आपको एक RequestBuilder AJAX कॉल का उपयोग नहीं करना चाहिए। आप एक सामान्य कॉल का आह्वान करके और ब्राउज़र को पीडीएफ प्रतिक्रिया को संभालने (इसे पीडीएफ व्यूअर प्लगइन के साथ प्रदर्शित करने या सहेजने वाला संवाद खोलने) को डिफ़ॉल्ट ब्राउज़र व्यवहार पर भरोसा कर सकते हैं।

इसे प्राप्त करने के लिए कई विकल्प हैं:

  1. आप (एक छोटे से डेटा की मात्रा के लिए ही संभव) GET अनुरोध में अपने डेटा को पारित कर सकते हैं, तो आप GET पैरामीटर और के रूप में डेटा के साथ URL बना सकते हैं फिर डेटा के साथ यूआरएल पास करने के साथ Window.open() के साथ एक नई ब्राउज़र विंडो खोलें।

  2. बड़ी मात्रा में डेटा के लिए आप पहली बार सर्वर temporaly डाटा स्टोर करने के लिए RequestBuilder के साथ अपने डेटा पोस्ट कर सकते हैं और RequestCallback.onResponseReceived() में ऊपर की तरह एक छोटी URL के साथ एक नई ब्राउज़र विंडो खोलें विकल्प 1 में सर्वर साइड आप पर पीडीएफ पीढ़ी सर्वलेट को दो हिस्सों में विभाजित करने के लिए: POST विधि के साथ एक डेटा स्टोर सर्वलेट (यानी वेब सत्र में डेटा संग्रहीत करना) और जीईटी विधि के साथ पीडीएफ रेंडर सर्वलेट, जो सत्र से डेटा लेता है (और इसे हटा रहा है) बड़े पैरामीटर की आवश्यकता नहीं है।

  3. विधि पोस्ट, अपने डेटा के लिए छिपे हुए फ़ील्ड और पीडीएफ पीढ़ी सर्वलेट यूआरएल के साथ एक फॉर्म बनाएं। छिपे हुए फ़ील्ड को अपने डेटा से भरें और प्रोग्राम को प्रोग्रामेटिक रूप से सबमिट करें (यानी FormPanel.submit())। यदि आप को target name के साथ बनाते हैं तो ब्राउज़र एक नई विंडो खुलता है या प्रतिक्रिया को संभालने के लिए निर्दिष्ट फ्रेम का उपयोग करता है।

1

क्लाइंट साइड पर, अनुरोध निर्माता के बजाय एंकर का उपयोग करें और विंडो.Location.replace (URL.encode (formActionUrl)) का उपयोग करके सर्वलेट सीधे का आह्वान करें;