2011-09-01 100 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 
        } 
       }); 
相关问题