之前有篇博客介绍了Struts2与ajax的整合,链接Struts2之—集成Json插件实现Ajax
这里不再累述,看以上博客。
此篇博客想吐槽一下Struts2的缺点——错误处理做的不好,怎么做的不好,哪里做的不好,通过Struts2中Ajax的应用缺陷来介绍。
先提出它的缺点,后面再做出证明。
1,Struts2与Ajax整合的缺点
无论采用$.post还是$.ajax都捕获不到服务器产生的错误($.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("</HTML>"); 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:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0" encoding="UTF-8"?> <web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>AjaxServlet</servlet-name><servlet-class>cn.itcast.oa0909.servlet.AjaxServlet</servlet-class> </servlet> <servlet-mapping><servlet-name>AjaxServlet</servlet-name> <url-pattern>/AjaxServlet</url-pattern> </servlet-mapping> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app> </span>
用户User类——实体类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private Long uid;//用户id privateString username;//用户名 /************get/set方法*******************************************/ publicLong getUid(){ returnuid; } publicvoidsetUid(Long uid) { this.uid= uid; } publicStringgetUsername() { returnusername; } publicvoidsetUsername(String username) { this.username=username; }</span>
UserAction.java——处理业务,获取用户
<span style="font-family:KaiTi_GB2312;font-size:18px;">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; } }</span>
配置Strut2的配置文件Struts.xml
——继承json-default,指定Action返回的结果集的类型为:json;
<struts> <packagename="userjson"namespace="/"extends="json-default"> <actionname="userAction_*"method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction"> <!--指定返回的结果集的类型为:json --> <resulttype="json"></result> </action> </package> </struts>
ajax-struts2.html:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><html> <head> <title>ajax-struts2.html</title> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="this is my page"> <metahttp-equiv="content-type"content="text/html;charset=UTF-8"> </head> <!--引入js文件 --> <scriptsrc="js/jquery-1.4.2.js"></script> <scriptsrc="js/test.js"></script> <body> 我的$.ajax()在Struts2中是否能处理异常,测试页面 </body> </html></span>
test.js:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//页面加载执行 $().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!"); } }); } </span>
(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的核心的过滤器
<span style="font-family:KaiTi_GB2312;font-size:18px;"><web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置Struts2的核心的过滤器--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app></span>
用户User类——实体类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">private Long uid;//用户id privateString username;//用户名 /************get/set方法*******************************************/ publicLong getUid(){ returnuid; } publicvoidsetUid(Long uid) { this.uid= uid; } publicStringgetUsername() { returnusername; } publicvoidsetUsername(String username) { this.username=username; }</span>
UserAction.java——处理业务,获取用户
<span style="font-family:KaiTi_GB2312;font-size:18px;">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; } }</span>
配置Strut2的配置文件Struts.xml
——继承json-default,指定Action返回的结果集的类型为:json;
<span style="font-family:KaiTi_GB2312;"><struts> <packagename="userjson"namespace="/"extends="json-default"> <actionname="userAction_*"method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction"> <!--指定返回的结果集的类型为:json --> <resulttype="json"></result> </action> </package> </struts> </span>
ajax-struts2.html:
<span style="font-family:KaiTi_GB2312;font-size:18px;"><html> <head> <title>ajax-struts2.html</title> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="this is my page"> <metahttp-equiv="content-type"content="text/html;charset=UTF-8"> </head> <!--引入js文件 --> <scriptsrc="js/jquery-1.4.2.js"></script> <scriptsrc="js/test.js"></script> <body> 我的$.ajax()在Struts2中是否能处理异常,测试页面 </body> </html></span>
test.js:
<span style="font-family:KaiTi_GB2312;font-size:18px;">//页面加载执行 $().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!"); } }); } </span>
执行结果:刷新页面后,执行结果如下;代码中走的成功后的回调函数success:function()——应该走error:function(),因为后台代码有异常int
a=1/0;
总结:在Struts2中$.ajax()的错误处理不能正常使用,(也就是说,无论后台是否有异常,$.ajax()函数都走成功后的回调函数success:function())——这是Struts2的内部设计缺点
Struts2中的错误处理存在这样的缺点,在系统开发时无疑让人很头疼,那么针对这个问题,该如何解决呢?之后的博客再做介绍。
即便是再完美的框架也有它的缺点,我们要善于发现!