之前有篇博客介绍了Struts2与ajax的整合,链接
这里不再累述,看以上博客。
此篇博客想吐槽一下Struts2的缺点——错误处理做的不好,怎么做的不好,哪里做的不好,通过Struts2中Ajax的应用缺陷来介绍。
先提出它的缺点,后面再做出证明。
1,Struts2与Ajax整合的缺点
不管採用$.post还是$.ajax都捕获不到server产生的错误($.ajax捕获错误在servlet能做到),是struts2内部设计的不好,不是Ajax的问题。
2,$.post()与$.ajax()
大家都知道,$.post()方法与$.ajax()方法的差别:
$.post()方法:不能截获异常;
$.ajax()方法:能够截获异常;
官方文档解释:
3,Servlet中$.ajax()
Servlet中$.ajax()可正常工作,能正常捕获异常,并作出处理(使用回调函数error:function())
样例:
新建Servlet类——AjaxServlet.java:
import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; public class AjaxServlet extends HttpServlet { /** * Constructor of the object. */ public AjaxServlet() {super();} public void doPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { response.setContentType("text/html"); PrintWriterout = response.getWriter(); int a = 1/0; //异常 out.println(""); out.flush(); out.close(); } public void init()throws ServletException {//Put your code here} public voiddestroy() {super.destroy();// Just puts "destroy" string in log//Put your code here}}
Web.xml:
AjaxServlet cn.itcast.oa0909.servlet.AjaxServlet AjaxServlet /AjaxServlet login.jsp
用户User类——实体类:
private Long uid;//用户idprivateString username;//用户名 /************get/set方法*******************************************/publicLong getUid(){returnuid;}publicvoidsetUid(Long uid) {this.uid= uid;}publicStringgetUsername() {returnusername;}publicvoidsetUsername(String username) {this.username=username;}
UserAction.java——处理业务,获取用户
importcn.itcast.oa0909.domain.User;importcom.opensymphony.xwork2.ActionSupport; public classUserAction extends ActionSupport { privateLong uid; privateString username;/** * 获取用户 * @return */ publicString showUser(){ User user = new User();//创建一个User对象 user.setUid(1L); user.setUsername("hanxuemin"); this.uid=user.getUid(); this.username=user.getUsername(); int a =1/0; //异常 returnSUCCESS; }/*******get/set方法**************************/ publicLong getUid() { return uid; } publicString getUsername() { return username; } }
配置Strut2的配置文件Struts.xml
——继承json-default,指定Action返回的结果集的类型为:json;
ajax-struts2.html:
ajax-struts2.html 我的$.ajax()在Struts2中能否处理异常,測试页面
test.js:
//页面载入运行$().ready(function(){ load();//调用load()函数 }); function load(){ $.ajax({url:"userJSONAction_showUser.action",type:"POST",success:function(data){ alert("ID:"+data.uid+", UserName:"+data.username);},error:function(XMLHttpRequest,textStatus, errorThrown){alert("Error!Cannot Get User Information!");} });}
(1)运行ajax-post.html中的$.post()方法:
——调用后台AjaxServlet.java,当中有异常 int a = 1/0
运行结果:刷新页面后,毫无反应——不能对异常做出处理
(2)运行ajax-post.html中的$.ajax()方法:
——调用后台AjaxServlet.java,当中有异常 int a = 1/0
运行结果:刷新页面后,运行结果例如以下;代码中走的错误处理函数error:function()
总结1:在Servlet中$.post()方法不能对异常做出处理,$.ajax()方法能对异常做出处理(通过error:function()回调函数)
4,Struts2中$.ajax()
可是,在Struts2中两个方法一样,都不能截获异常——Struts2的缺点;
(在Struts2中,运行$.ajax()方法,不管后台是否有异常,都运行成功)
样例:
Web.xml:
——配置Struts2的核心的过滤器
struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* index.jsp
用户User类——实体类:
private Long uid;//用户idprivateString username;//用户名 /************get/set方法*******************************************/publicLong getUid(){returnuid;}publicvoidsetUid(Long uid) {this.uid= uid;}publicStringgetUsername() {returnusername;}publicvoidsetUsername(String username) {this.username=username;}
UserAction.java——处理业务,获取用户
importcn.itcast.oa0909.domain.User;importcom.opensymphony.xwork2.ActionSupport; public classUserAction extends ActionSupport { privateLong uid; privateString username;/** * 获取用户 * @return */ publicString showUser(){ User user = new User();//创建一个User对象 user.setUid(1L); user.setUsername("hanxuemin"); this.uid=user.getUid(); this.username=user.getUsername(); int a =1/0; //异常 returnSUCCESS;}/*******get/set方法**************************/ publicLong getUid() { return uid;} publicString getUsername() { return username;} }
配置Strut2的配置文件Struts.xml
——继承json-default,指定Action返回的结果集的类型为:json;
ajax-struts2.html:
ajax-struts2.html 我的$.ajax()在Struts2中能否处理异常,測试页面
test.js:
//页面载入运行$().ready(function(){ load();//调用load()函数 }); function load(){ $.ajax({url:"userJSONAction_showUser.action",type:"POST",success:function(data){ alert("ID:"+data.uid+", UserName:"+data.username);},error:function(XMLHttpRequest,textStatus, errorThrown){alert("Error!Cannot Get User Information!");} });}
运行结果:刷新页面后,运行结果例如以下;代码中走的成功后的回调函数success:function()——应该走error:function(),由于后台代码有异常int a=1/0;
总结:在Struts2中$.ajax()的错误处理不能正常使用,(也就是说,不管后台是否有异常,$.ajax()函数都走成功后的回调函数success:function())——这是Struts2的内部设计缺点
Struts2中的错误处理存在这种缺点,在系统开发时无疑让人非常头疼,那么针对这个问题,该怎样解决呢?之后的博客再做介绍。
即便是再完美的框架也有它的缺点,我们要善于发现!