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