GWT中FormPanel.SubmitCompleteHandler是否关注setAction指定的Servlet执行结果?
关于GWT FormPanel SubmitCompleteHandler的两个疑问解答
嘿,我来帮你把这两个问题说清楚:
1. SubmitCompleteHandler的“完成”判定是否关注Servlet的执行结果?
答案是:它只关心HTTP请求是否完成,而不直接判断Servlet的业务执行是否成功。
具体来说,只要浏览器从你指定的Servlet收到了HTTP响应(不管响应状态码是200成功,还是500服务器错误、404找不到等),SubmitCompleteHandler就会触发。哪怕你的Servlet的doPost方法抛出了异常,服务器返回了错误响应,这个handler依然会执行。
那怎么判断上传是否真的成功呢?你需要在Servlet里主动返回标识结果的内容,然后在handler里解析响应来判断:
- 当文件上传逻辑正常执行时,让Servlet返回一段包含成功标记的HTML(比如
<span id='status'>success</span>) - 如果执行过程中抛出异常,返回错误标记或者直接设置HTTP状态码为500,同时返回错误信息
举个简单的Servlet示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); try { // 这里是Apache Commons FileUpload的文件处理逻辑 // ... out.write("<html><body><span id='upload-status'>success</span></body></html>"); } catch (Exception e) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); out.write("<html><body><span id='upload-status'>failed</span></body></html>"); } }
然后在GWT的handler里解析结果:
formPanel.addSubmitCompleteHandler(new SubmitCompleteHandler() { @Override public void onSubmitComplete(SubmitCompleteEvent event) { String responseContent = event.getResults(); // 简单判断响应里是否包含成功标记 if (responseContent.contains("success")) { Window.alert("上传成功"); } else { Window.alert("上传失败,请检查后重试"); } } });
2. SubmitCompleteHandler是否会考虑FormPanel.setAction所设置的服务?
当然会!FormPanel.setAction()就是用来指定表单要提交到的目标服务地址(也就是你的那个HttpServlet),SubmitCompleteHandler本质上就是监听这个表单提交操作的完成事件——不管你设置的action是哪个Servlet,只要表单成功提交到该地址并收到响应,handler就会被触发。
换句话说,handler和你设置的action是绑定的,它只会关注这个特定地址的提交请求结果。
内容的提问来源于stack exchange,提问作者E. Rowlands
相关产品推荐
相关产品推荐

