【问题标题】:Communicating between an HttpServlet and the client side of a GWT application在 HttpServlet 和 GWT 应用程序的客户端之间进行通信
【发布时间】:2011-09-01 06:13:27
【问题描述】:

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

【问题讨论】:

  • 如何将 servlet 集成到您的页面中?
  • 我不确定我是否理解您的问题。

标签: gwt servlets


【解决方案1】:
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 字符串

【讨论】:

  • 完美!这正是我一直在寻找的。它就在 FormPanel 文档中!
【解决方案2】:

嗯,我不能 100% 确定您的问题是在客户端还是服务器端。

对于客户:

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

然后开始提交: formPanel.submit();

不要忘记您的 servlet 在 web.xml 中的映射。例如:

  <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
                    }
                });

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多