2011-09-01 81 views
1

我有一個簡單的GWT應用程序,它由一個包含單個FileUpload字段的FormPanel組成。此表單上的操作是將其發送到GWT.getModuleBaseURL()+「process」,該web.xml反過來告訴GWT是FileProcessServlet。在HttpServlet和GWT應用程序的客戶端之間進行通信

FileProcessServlet是一個類,我提出,延伸的HttpServlet和覆蓋的doPost(HttpServletRequest的REQ,HttpServletResponse的RESP)來解析上傳的文件,把它變成使用Base64Utils一個Base64字符串。現在,我想向客戶端傳遞一個字符串,它是剛剛發送它的文件的Base64編碼。

對於我的生活,我只是無法弄清楚如何做到這一點。關於Communicating with the Server的GWT文檔沒有說明從FormPanel.submit()接收信息的任何內容。沒有與這樣的請求相關的回調函數,就像GWT RPC的情況一樣。同時,我需要使用一個servlet,因爲我想分析一個文件,而這不能由客戶端完成。有什麼建議麼?

~~~~

PS:一種選擇是,我可以直接寫信給使用java.io的PrintWriter的servlet的html頁面(如this建議)。這可能會提供一種解決方案,將Base64字符串存儲在帶有特殊ID的div中,然後使用DOM在客戶端上獲取此內容。不過,我還沒有得到PrintWriter與我合作。每當我使用它時,使用不同的內容類型和字符編碼,我仍然看不到任何內容打印在頁面上。我目前試圖打印出來的是:

 String base64 = Base64Utils.toBase64(file); 
     resp.setContentType("text/html; charset=UTF-8"); 
     resp.setCharacterEncoding("UTF-8"); 
     PrintWriter out = resp.getWriter(); 
     out.print(base64); 
     out.flush(); out.close(); 

但是什麼都沒有出來。調試器已確認在倒數第二行的字符串base64不爲空也不爲空。任何有關這方面的幫助也將不勝感激。儘管如此,我衷心希望有更好的辦法。

+0

這不是空要麼? – home

+0

如何將servlet集成到頁面中? – home

+0

我不確定我瞭解你的問題。 – Coder

回答

4
form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
     public void onSubmitComplete(SubmitCompleteEvent event) { 
     // When the form submission is successfully completed, this event is 
     // fired. Assuming the service returned a response of type text/html, 
     // we can get the result text here (see the FormPanel documentation for 
     // further explanation). 
     Window.alert(event.getResults()); 
     } 
    }); 

無論你從servlet寫出來,將在event.getResults(),你的情況的base64字符串

+0

完美!這正是我所期待的。它就在FormPanel文檔中! – Coder

0

嗯,我不是100%肯定,如果你的問題是客戶端或服務器端。

對於客戶端:

formPanel.setAction("/[urlMappingOfYourServlet]"); 
formPanel.setEncoding(FormPanel.[CORRECT_ENCODING]); 
formPanel.setMethod(FormPanel.METHOD_POST); 

,並開始提交: formPanel.submit();

不要忘記在web.xml你的servlet的映射。例如: -

<servlet> 
    <servlet-name>nameOfYourServlet</servlet-name> 
    <servlet-class>your.package.server.YourServletClass</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>nameOfYourServlet</servlet-name> 
    <url-pattern>/urlMappingOfYourServlet</url-pattern> 
</servlet-mapping> 

在服務器端,你得到的解析數據:

String data = request.getParameter("[NameOfYourFormPanelItem]"); 

你可以使用一個javax.servlet.ServletOutputStream,而不是爲PrintWriter。

ServletOutputStream out = resp.getOutputStream(); 
    out.write(base64); 
    out.flush(); 

另一種可能性是在客戶端使用RequestBuilder

RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, "/urlMappingOfYourServlet"); 
requestBuilder.sendRequest(someData, new RequestCallback() { 

        @Override 
        public void onResponseReceived(Request request, 
          Response response) { 
         // ToDo: Get your String here 
      response.getText(); 
        } 

        @Override 
        public void onError(Request request, Throwable exception) { 
         // ToDo 
        } 
       }); 
相關問題