在HttpServlet和GWT应用程序的客户端之间进行通信

时间:2011-09-01 06:13:28

标签: gwt servlets

我有一个简单的GWT应用程序,它由一个包含单个FileUpload字段的FormPanel组成。此表单上的操作是将其发送到GWT.getModuleBaseURL()+“process”,其中web.xml依次告诉GWT是FileProcessServlet。

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在倒数第二行不为空,也不为空。对此相关方面的任何帮助也将不胜感激。尽管如此,我真诚地希望有更好的方法。

2 个答案:

答案 0 :(得分: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字符串

答案 1 :(得分:0)

如果您的问题出在客户端或服务器端,我不能100%确定。

对于客户:

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

开始提交: formPanel.submit();

不要忘记serv.xml在web.xml中的映射。 E.g:

  <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
                    }
                });
相关问题