资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Struts,应用的异常处理,Struts,框架处理异常的流程,Struts,框架处理异常的流程,Struts,的控制器负责捕获各种异常。,当,Struts,的控制器捕获到异常后,在异常处理代码块中,创建描述异常信息的,ActionMessage,对象把它保存在,ActionMessages,(,或其子类,ActionErrors,),对象中,然后把,ActionMessages,保存在特定范围(,request,范围或,session,范围)内。,接下来,视图层的,标签检索特定范围内的,ActionMessages,对象,把本地化的错误消息输出到网页上。,Struts,框架的异常处理机制的优点,可以避免直接向用户显示原始的,Java,异常信息,而是在控制层对,Java,异常进行重新包装,在视图层提供能够让用户理解的错误信息。,Struts,框架向用户显示的错误消息来自于,Resource Bundle,,,这有助于实现异常处理的国际化。,Struts,应用响应用户请求时的方法调用过程,ActionServlet,类处理异常的机制,protected void process(HttpServletRequest request,HttpServletResponse response),throws IOException,ServletException,ModuleUtils.getInstance().selectModule(request,getServletContext();,getRequestProcessor(getModuleConfig(request).process(request,response);,ActionServlet,类的,process(),方法不捕获任何异常,仅仅声明向上层调用方法抛出,IOException,或,ServletException,。,RequestProcessor,类处理异常的机制,RequestProcessor,类是,Struts,框架处理异常的核心组件。其,process(),方法不捕获任何异常,仅仅声明向上层调用方法抛出,IOException,或,ServletException,。,以下是,process(),方法的部分代码:,public void process(,HttpServletRequest,request,HttpServletResponse,response),throws,IOException,ServletException,/Call the Action instance itself,ActionForward,forward=,processActionPerform,(request,response,action,form,mapping);,RequestProcessor,类处理异常的机制,RequestProcessor,类的,process(),方法调用自身的,processActionPerform,(),方法,该方法再调用,Action,类的,execute(),方法。以下是,processActionPerform,(),方法的代码:,protected,ActionForward processActionPerform,(,HttpServletRequest,request,HttpServletResponse,response,Action action,ActionForm,form,ActionMapping,mapping),throws,IOException,ServletException,try,return(action.execute(mapping,form,request,response);,catch(Exception e),return(,processException,(request,response,e,form,mapping),);,RequestProcessor,类处理异常的机制,在,processException,(),方法中,先查看是否存在,ExceptionConfig,对象,,ExceptionConfig,和,Struts,配置文件中的异常配置元素,对应,,ExceptionConfig,对象中封装了,元素的配置信息。,如果不存在,ExceptionConfig,对象,就继续向上层调用方法抛出异常。如果找到了,ExceptionConfig,对象,就调用它的,getHandler,(),方法获得异常处理类,ExceptionHandler,,,并创建异常处理类的实例,最后调用,ExceptionHandler,类的,execute(),方法,来处理异常:,handler.execute(exception,config,mapping,form,request,response);,ExceptionHandler,类处理异常的机制,(1),Struts,框架提供了默认的异常处理类,org.apache.struts.action.,ExceptionHandler,,,它的,execute(),方法负责处理异常,,ExceptionHandler,类的,execute(),方法首先决定转发路径:,if(,ae,.,getPath,()!=null),forward=new,ActionForward,(,ae,.,getPath,();,else,forward=mapping.,getInputForward,();,ExceptionHandler,类处理异常的机制,(2),接着把异常信息包装到,ActionMessage,对象中:,/,Figure out the error,if(ex,instanceof,ModuleException),error=(ModuleException)ex).,getActionMessage,();,property=(ModuleException)ex).,getProperty,();,else,error=new,ActionMessage,(,ae,.,getKey,(),ex.,getMessage,();,property=error.,getKey,();,ExceptionHandler,类处理异常的机制,(3),然后调用自身的,storeException,(),方法。,storeException,(),方法负责把,ActionMessage,对象保存在,ActionMessages,对象中,再把,ActionMessages,对象存放在适当的范围内。,Struts,框架处理异常的时序图,在,Struts,应用中处理异常的各种方式,以配置方式处理异常,配置,元素,使用,ModuleException,类,在,Struts API,中提供了专门的异常类,org.apache.struts.util.ModuleException,,它是,Exception,类的子类。它的优点在于可以很好地和,Struts,的,Resource Bundle,绑定。,ModuleException,有以下构造方法:,ModuleException(java.lang.String key),其中参数,key,指定错误消息,key,,与,Resource Bundle,中的消息,key,匹配。,Action,类中抛出,ModuleException,try,new Model().,businessMethod,();,catch(,BaseException,be),throw new ModuleException(error.business.error);,配置,元素包括以下属性:,type:,指定待处理的异常类。,handler:,指定异常处理类,默认值为,org.apache.struts.action.,ExceptionHandler,。,如果设置为用户自定义的异常处理类,则该类必须继承,ExceptionHandler,。,path:,指定转发路径。,key:,指定错误消息,key,Struts,框架将根据这个,key,到,Resource Bundle,中寻找匹配的消息文本。,bundle:,指定,Resource Bundle,,如果没有设置此项,将使用默认的,Resource Bundle。,scope:,指定,ActionMessages,的存放范围,可选值包括,request,和,session。,默认值为,request。,配置,在,Struts,应用中处理异常的各种方式,以编程方式处理异常,参见例子,Action3,
展开阅读全文