1、Struts应用的异常处理,Struts框架处理异常的流程,Struts框架处理异常的流程,Struts的控制器负责捕获各种异常。 当Struts的控制器捕获到异常后,在异常处理代码块中,创建描述异常信息的ActionMessage对象把它保存在ActionMessages(或其子类ActionErrors)对象中,然后把ActionMessages保存在特定范围(request范围或session范围)内。 接下来,视图层的标签检索特定范围内的ActionMessages对象,把本地化的错误消息输出到网页上。,Struts框架的异常处理机制的优点,可以避免直接向用户显示原始的Java异常信息
2、,而是在控制层对Java异常进行重新包装,在视图层提供能够让用户理解的错误信息。 Struts框架向用户显示的错误消息来自于Resource Bundle,这有助于实现异常处理的国际化。,Struts应用响应用户请求时的方法调用过程,ActionServlet类处理异常的机制,protected void process(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException ModuleUtils.getInstance().selectModule(reques
3、t,getServletContext();getRequestProcessor(getModuleConfig(request).process(request,response); ActionServlet类的process()方法不捕获任何异常,仅仅声明向上层调用方法抛出IOException或ServletException。,RequestProcessor类处理异常的机制,RequestProcessor类是Struts框架处理异常的核心组件。其process()方法不捕获任何异常,仅仅声明向上层调用方法抛出IOException或ServletException。以下是pro
4、cess()方法的部分代码: public void process(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException / Call the Action instance itselfActionForward forward =processActionPerform(request, response, action, form, mapping); ,RequestProcessor类处理异常的机制,RequestProcessor类的process(
5、)方法调用自身的processActionPerform()方法,该方法再调用Action类的execute()方法。以下是processActionPerform()方法的代码:protected ActionForward processActionPerform(HttpServletRequest request,HttpServletResponse response,Action action,ActionForm form,ActionMapping mapping)throws IOException, ServletException try return (action.e
6、xecute(mapping, form, request, response); catch (Exception e) return (processException(request, response, e,form,mapping); ,RequestProcessor类处理异常的机制,在processException()方法中,先查看是否存在ExceptionConfig对象,ExceptionConfig和Struts配置文件中的异常配置元素对应,ExceptionConfig对象中封装了元素的配置信息。 如果不存在ExceptionConfig对象,就继续向上层调用方法抛出异
7、常。如果找到了ExceptionConfig对象,就调用它的getHandler()方法获得异常处理类ExceptionHandler,并创建异常处理类的实例 最后调用ExceptionHandler类的execute()方法,来处理异常:handler.execute(exception, config, mapping, form,request,response);,ExceptionHandler类处理异常的机制(1),Struts框架提供了默认的异常处理类org.apache.struts.action.ExceptionHandler,它的execute()方法负责处理异常,Exc
8、eptionHandler类的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).getAction
9、Message();property = (ModuleException) ex).getProperty(); else error = new ActionMessage(ae.getKey(), ex.getMessage();property = error.getKey(); ,ExceptionHandler类处理异常的机制(3),然后调用自身的storeException()方法。storeException()方法负责把ActionMessage对象保存在ActionMessages对象中,再把ActionMessages对象存放在适当的范围内。,Struts框架处理异常的时
10、序图,在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
11、,trynew 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,