Struts中的异常处理机制
Struts中的异常处理,必须利用Struts内置的机制(只针对action的execute)和标准的servlet机制相结合,才能完美的实现。
1. 首先通过在配置文件中定义全局异常处理或者特定于action的异常处理句柄
2. 然后在process中执行action的excute时遇到异常就读取其异常处理配置,并生成相应的ExceptionConfig对象。若ExceptionConfig为null(即此action没有配置异常处理),则直接抛出IoException或者ServletException到总控的dopost和doget,由容器负责处理(此时将会用到在web.xml中定义的异常处理对象)。
3. 根据ExceptionConfig生成ExceptionHandler,然后执行其execute方法。在execute中将产生actionerrors(包含由配置生成的actionerror列表)对象,并放到相应的scope(默认为request)中(以Globals.EXCEPTION_KEY为健),然后转到错误处理叶面,以<html:error>显示。
4. 在form bean 的验证方法中产生的action errors也是以Globals.EXCEPTION_KEY为健,但是存在request中。
5. struts的异常处理利用了其内置的资源文件和国际化机制。由于生成的actionerror是配置exception时的key和exception.getMessage()键值对,所以必须在message中放入足够的信息,我们无法在发生异常时,得到异常本身的引用,这或许是struts 的不足之处!
6. 在扩展struts总控时发现process()方法抛出的是IOException, ServletException,这不是明摆着不让我们扩展此方法吗?扩展时有新的异常难道都得包装成IOException, ServletException吗?不明白作者的深意?