struts2中的ajax异常解决-利用spring异常通知处理异常

来源:互联网 发布:java大学实用教程答案 编辑:程序博客网 时间:2024/06/05 02:30

在java语言的web项目中,ssh架构的项目是最常见的,用户交互操作、操作提示友好性是非常重要的,而对操作出现的异常是非常常见的,但是怎样做到友好性是我们要考虑的问题,而且如何在程序中统一做异常处理也是我们所做的重要部分,所以可以使用spring的切面统一处理程序中的异常。
首先我们应该明白一点我们程序中的异常是怎么产生的,大体上可以这么说,是在用户操作数据是而产生的异常处理,而用户交互的是我们的struts层,但是作为控制的struts是不操作数据的、操作数据是在我们service层调用dao实现的,所以异常产生的地方是在service层,所以spring切面统一处理异常应该是对我们的service层出现的错误统一处理后返回给控制层,最后返回给用户,以提示用户增加友性,下面就是定义异常处理
自定义一个异常操作的类,代码如下
import com.opensymphony.xwork2.ActionContext;
public class MyException {
public void getExceptionMessage(Throwable ex) {
//放入栈顶
ActionContext.getContext().getValueStack().push(ex.getMessage());
}
}
这样定义好了处理异常的类,并把异常信息放入到控制层的值栈的栈顶在控制层就可以
try {
// 添加
personService.add(person);
} catch (Exception e) {
// 添加操作失败后 获得栈顶信息返回给用户
setMessage(ActionContext.getContext().getValueStack().peek() .toString());
}

这里写图片描述
关于java web系统架构之重要部分——异常架构之利用异常通知处理异常
最后总结也是重点。spring中配置好异常通知处理就大功告成了,但是我们很快就发现弊端、虽然spring把异常信息统一处理后交给控制层,但是控制层中岂不是每个方法都要
try {
} catch (Exception e) {
}
吗?那么在控制层有没有统一处理并返回给客户端的呢?可以自定义一个action的基类在基类中处理呢?答案是不行的、因为基类不能帮每个action实现访问数据的功能,因此是不能统一处理的,那么只有在具体方法处理了,这就说明了一点struts2是不能统一处理异常的。
框架有好处但是也有弊端,没有十分完美的,做到可控制才是最最要的
http://blog.sina.com.cn/s/blog_e8412fa20101n96e.html

——————————个人笔记———————————-
这里写图片描述

把jar导入,xml项目异常架构之利用异常通知处理异常 package cn.itcast.oa0909.exception;import org.apache.struts2.json.JSONResult;import com.opensymphony.xwork2.ActionContext;/** * 切面 * @author Administrator * */public class OAException {    public void getExceptionMessage(Throwable ex){        /**         * 把获取到的异常的信息放入到栈顶         */        ActionContext.getContext().getValueStack().push(ex.getMessage());    } }
     <aop:config>        <aop:pointcut expression="execution(* cn.itcast.oa0909.service.impl.*.*(..))" id="perform"/>        <!--             事务的通知         -->        <aop:advisor advice-ref="tx" pointcut-ref="perform"/>        <!--             异常的切面         -->         <aop:aspect ref="oaException">            <aop:after-throwing method="getExceptionMessage" pointcut-ref="perform" throwing="ex"/>         </aop:aspect>     </aop:config>      <bean id="oaException" class="cn.itcast.oa0909.exception.OAException"></bean>
在service那个方法 int =1/0;使它异常。action:public String getAllDepartment(){        try{            Collection<Department> departmentList = this.departmentService.getAllDepartment();        }catch(Exception e){            /**             *              */            this.setMessage(ActionContext.getContext().getValueStack().peek().toString());        }        return SUCCESS;    }baseaction:    private String message;//处理ajax产生的异常    public void setMessage(String message) {        this.message = message;    }
json返回的是一个数据,不是一个url,所以懒加载异常了,用原来那个拦截器也不能解决现在的异常问题。json只返回数据,而不要代理对象,就是比如getService这样的对象。那么可以在它上面加上@JSON(serialize)
  <package name="json" namespace="/" extends="json-default">    <action name="departmentJSONAction_*" method="{1}" class="departmentAction">        <result type="json">            <param name="ignoreHierarchy">false</param>//把忽略继承关了。。因为我们的message继承的        </result>    </action>  </package>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>ajax.html</title>    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">    <meta http-equiv="description" content="this is my page">    <meta http-equiv="content-type" content="text/html; charset=UTF-8">    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->  </head>  <script src="js/jquery-1.4.2.js"></script>  <script language="JavaScript">    $.post("departmentJSONAction_getAllDepartment.action",null,function(data){        alert(data.message);    });  </script>  <body>    This is my HTML page. <br>  </body></html>
0 0