博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2与ajax整合之缺点
阅读量:7144 次
发布时间:2019-06-29

本文共 5794 字,大约阅读时间需要 19 分钟。

 之前有篇博客介绍了Struts2ajax的整合,链接

这里不再累述,看以上博客。

   此篇博客想吐槽一下Struts2的缺点——错误处理做的不好,怎么做的不好,哪里做的不好,通过Struts2Ajax的应用缺陷来介绍。

  先提出它的缺点,后面再做出证明。

1Struts2Ajax整合的缺点

不管採用$.post还是$.ajax都捕获不到server产生的错误($.ajax捕获错误在servlet能做到),是struts2内部设计的不好,不是Ajax的问题。

2$.post()$.ajax()

大家都知道,$.post()方法与$.ajax()方法的差别:

$.post()方法:不能截获异常;

$.ajax()方法:能够截获异常;

官方文档解释:

 

3Servlet$.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()

 

总结1Servlet$.post()方法不能对异常做出处理,$.ajax()方法能对异常做出处理(通过error:function()回调函数)

 

4Struts2$.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中的错误处理存在这种缺点,在系统开发时无疑让人非常头疼,那么针对这个问题,该怎样解决呢?之后的博客再做介绍。

      即便是再完美的框架也有它的缺点,我们要善于发现!

 

你可能感兴趣的文章
VS2017 性能优化方法
查看>>
mysql 字符集查看 设定
查看>>
数字高程模型和地图——thematicmapping.org译文(一)
查看>>
tomcat org.apache.jasper.JasperException: java.lang.NullPointerException
查看>>
C/C++快速排序及优化详解
查看>>
windows下 更新 android studio SDK 到最新版本 解决方案
查看>>
微信公众平台开发(64)航班动态
查看>>
获取真机使用的语言
查看>>
[Lydsy2017年4月月赛]抵制克苏恩题解
查看>>
8-5 泛型类型擦除
查看>>
正文处理命令及tar命令
查看>>
GDI+ 绘制多行文本,自动换行。
查看>>
[转载] ASCII、UTF8、Uncicode编码下的中英文字符大小
查看>>
结构-行为-样式-Css Div 居中的一个最佳实践
查看>>
实习第三周小记-----生活在于经历 分类: 程序人生 ...
查看>>
Leetcode题目:Minimum Depth of Binary Tree
查看>>
从微软官网下载联机入门丛书
查看>>
PHP三种访问控制模式(public、protected、private)解析
查看>>
python numpty 中shape的用法
查看>>
浅谈C#中的结构
查看>>