struts1.x自定义异常问题

问题描述

在做struts1.x全局异常捕获的时候遇到一个问题:1.当我的类LoginAction中写execute方法时,能捕获到自定义的异常并跳转到专门处理错误的页面显示错误信息,publicclassLoginActionextendsBaseAction{privateBaseservicebaseservice;publicActionForwardexecute(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse)throwsAppException{LoginFormloginform=(LoginForm)form;System.out.println("login==========================");try{baseservice.addvalue();}catch(Exceptione){thrownewAppException("error.add","值出错");//抛出自己定义的异常类异常}returnmapping.findForward("success");}

BaseAction继承自DispatchActionpublicclassBaseActionextendsDispatchAction{protectedLoglogger;publicBaseAction(){logger=LogFactory.getLog(this.getClass());}protectedActionForwarddispatchMethod(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse,Stringname){System.out.println("name===="+name);if(name==null){try{returnthis.unspecified(mapping,form,request,response);}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}Methodmethod=null;try{method=getMethod(name);//System.out.println("method=========="+method);}catch(NoSuchMethodExceptione){//Stringmessage=messages.getMessage("dispatch.method",mapping//.getPath(),name);//logger.error(message,e);//StringuserMsg=messages.getMessage("dispatch.method.user",//mapping.getPath());//thrownewNoSuchMethodException(userMsg);}ActionForwardforward=null;StringnoToken=request.getParameter("_noToken");//System.out.println("noToken=============="+noToken);if(!"1".equals(noToken)){if(!checkToken(request)){//如果重复提交//System.out.println("22==============");thrownewAppException("err.add","页面不能做刷新操作(或者页面已经提交,请查看数据确认)");}}else{logger.debug("noToken");}Objectargs[]={mapping,form,request,response};try{forward=(ActionForward)method.invoke(this,args);}catch(IllegalArgumentExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(IllegalAccessExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}catch(InvocationTargetExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}//ActionForwardforward=null;returnforward;}

但是当我的LoginAction中写上其他方法名的时候就不能正常跳转到处理错误页面进行处理了下面是我的配置文件<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.1//EN""http://struts.apache.org/dtds/struts-config_1_1.dtd"><struts-config><form-beans><form-beanname="loginform"type="com.sitech.form.LoginForm"/></form-beans><global-exceptions><exceptionkey="error.exception"type="com.sitech.framework.exception.AppException"handler="com.sitech.framework.exception.AppExceptionHandler"scope="request"path="/term/errorpage_undefine.jsp"/></global-exceptions><action-mappings><actionpath="/login"name="loginform"parameter="operate"scope="request"type="org.springframework.web.struts.DelegatingActionProxy"><forwardname="success"path="/success.jsp"></forward><forwardname="failure"path="/failure.jsp"></forward></action></action-mappings><message-resourcesparameter="MessageResources"/><plug-inclassName="org.springframework.web.struts.ContextLoaderPlugIn"><set-propertyproperty="contextConfigLocation"value="/WEB-INF/a*.xml"/></plug-in></struts-config>

我的异常类定义:publicclassAppExceptionHandlerextendsExceptionHandler{publicActionForwardexecute(Exceptionex,ExceptionConfigae,ActionMappingmapping,ActionFormformInstance,HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException{System.out.println("execute=========");ActionForwardforward=null;ActionMessageerror=null;Stringproperty=null;if(ae.getPath()!=null){//配置文件中的pathforward=newActionForward(ae.getPath());}else{forward=mapping.getInputForward();//如果没有找到path,转到input配置的路径}this.logException(ex);//处理自定义的异常类SystemExceptionif(exinstanceofAppException){AppExceptionse=(AppException)ex;//如果只有message,而没有keySystem.out.println("ex======"+se.getKey());if(se.getKey()==null){error=newActionMessage(ae.getKey(),ex.getMessage());property=ae.getKey();}else{//中有key值error=newActionMessage(se.getKey(),se.getValues());property=se.getKey();}request.setAttribute(Globals.EXCEPTION_KEY,ex);this.storeException(request,property,error,forward,ae.getScope());returnforward;}returnsuper.execute(ex,ae,mapping,formInstance,request,response);}

自定义异常类publicclassAppExceptionextendsRuntimeException{privateStringkey;//得到本地资源文件keyprivateObject[]values;publicAppException(){super();}publicAppException(Stringmessage,Throwablearg1){super(message,arg1);}publicAppException(Stringmessage){super(message);}publicAppException(Throwablemessage){super(message);}publicAppException(Stringkey,Stringmessage,Throwablearg1){super(message,arg1);this.key=key;}publicAppException(Stringkey,Objectvalue){super();this.key=key;values=newObject[]{value};}publicAppException(Stringkey,Objectvalue1,Objectvalue2){super();this.key=key;values=newObject[]{value1,value2};}publicAppException(Stringkey,Object[]values){super();this.key=key;this.values=values;}publicStringgetKey(){returnkey;}publicObject[]getValues(){returnvalues;}}

时间: 2024-10-30 06:32:53

struts1.x自定义异常问题的相关文章

Struts1.1 介绍

前一段时间好象有人问关于Struts的事情,本人留意了一下.请有兴趣的同志不防研究研究.(1)1. 介绍 1.1 Model-View-Controller (MVC) 设计模式 FIXME - 需要一个对该模式一般性的介绍.(译注:可以参考机械工业出版社的<设计模式>.) 1.2 将MVC概念映射到Struts组件中 Struts 的体系结构实现了Model-View-Controller设计模式的概念,它将这些概念映射到web应用程序的组件和概念中. 这一体系结构中每个主要的组件都将在下面

struts1和spring整合的方法

struts1和spring有两种整合的方法  一种是action和spring bean映射:一种是将action交给 spring初始化 第一种方式:访问.do的URL->tomcat接收到request-〉到Struts配置文件里找对应的action-〉找 到对应的action组件(Action那个类)-〉这个类对request进行一系列处理-〉调用spring提供的某个 service的注入实例的方法->由这个方法返回值-〉响应输出 第二种方式:访问.do的URL->tomcat

层层递进Struts1(八)之总结

先来看一下Struts1学习总结的思维导图,画的主要是Struts1中的重点和博客分布,如下所示: 系列博客的侧重点是: Struts1是什么? 为什么要使用它? 如何使用Struts1? Struts1源码分析 ? 总结 学完后综合看来,所谓的Struts1框架,实际是利用java已存在的函数二次封装所得,它侧重于解 决MVC中V和部分C的控制问题,较多使用配置文件,很大程度上减少了文件个数和代码重复,使得开发和维护 相对于不使用框架而言要简单的多.当然因为它只是封装和重组Java函数,如果你

层层递进Struts1(七)详解DispatchAction

通过前面几篇博客,不知道大家有没有发现这个问题,虽然现在可以灵活控制跳转了,但是Action的数量 还是比较多,如何既能保证跳转灵活,还能减少Action的数量?这就是我们这篇博客所说的DispatchAction, 如其名,可以理解为"分发式Action",使用它可以避免为每个Action创建一个类. 我们先来看一下 实例. UserAction DispatchAction继承的是Action,它的特点就是把以前的多个Action合并为 一个,当多个Action关联较大时,可以像这

层层递进Struts1(六)自定义转换器

Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例: org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet action threw exception java.lang.IllegalArgumentException: Cannot invoke com.tgb.struts1.TypeCovertActionForm.set

层层递进Struts1(五)之处理流程

这篇博客我们深入Struts框架执行部分源码,从ActionServlet的process函数开始,看一下其内在的执行 过程. 流程图 以下流程图展示的是ActionServlet和RequestProcessor两个类用到的函数,如RequestProcessor调用的 其它类的函数不再说明. 函数说明 我们选择几个重要的函数说明,其它函数则简单说明一下即可. ActionServlet process /** * <p>Perform the standard request proces

层层递进Struts1(四)之预加载ActionServlet

Struts的执行相当于分为两个阶段,预加载阶段和执行阶段,预加载阶段是指在Tomcat启动之时就开始执 行的内容,而此时我们并未真正进入跳转逻辑,这篇博客我们来分析一下预加载阶段. 配置文件 还记得web.xml中关于Struts的Servlet是如何配置的吗? <servlet- name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-c

层层递进Struts1(三)之Struts组成

这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤: 获取路径.封装表单.获取转向列表.转向逻辑处理.转向,与此对应的是:ActionServlet.ActionForm. ActionMapping.Action.ActionForward. ActionServlet 这个在上篇博客已经说明,可以访 问< 预加载ActionServlet>. ActionForm ActionForm的主要作用是对表单数据进行封装,这 个.NET开发中的实体类

层层递进Struts1(二)之Struts1简介及登录实例

上篇博客由Servlet的几个版本的例子,引出在页面跳转控制方面要解决的问题,在文章最后提到了 Struts1,这篇文章目的是解释一下什么是Struts1,及如何使用的问题. 什么是Struts1 说一 下我的理解:它符合MVC思想,使用Java二次开发封装的一个框架,主要简化.解决页面请求分发.跳转的问 题.Stuts1的优点是使用了丰富的配置文件使得灵活性大大提高:因为已经封装成框架,使得缩短了开发时间 .提高了开发效率,同时适量使用抽象,使得代码冗余减低.文件冗余减少,维护更加简单. St