今天项目要配置异常页面。
贴配置
<!-- 配置全局结果及异常映射 -->
<package name="base-default" extends="struts-default">
<!-- 全局返回结果 -->
<global-results>
<result name="error" type="error">/WEB-INF/jsp/error.jsp</result>
<result name="sysError">/WEB-INF/jsp/error.jsp</result>
<result name="input">/WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 全局异常映射 -->
<global-exception-mappings>
<exception-mapping result="sysError" exception="cn.itcast.core.exception.SysException"></exception-mapping>
<exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package>
在struts配置后,会有struts的拦截器拦截。所以在配置好异常页面后,可以在action中写方法时抛出异常,交给struts拦截并处理
可以这么理解这个流程:
>我们在action中的方法遇到异常后,抛出相应的异常xxxException
>struts拦截获取到这个异常,根据获取的异常的类型,在<global-exception-mapping>中,看有没有这个类型的异常
>有这个类型的异常,再去获取<global-exception-mapping>配置的result叫什么
>没有这个类型的异常,看有没有父类异常(一般都会配置个Exception,保证其他类异常能够处理到),同样获取配置的result叫什么
>根据获得的result值去<global-results>中找叫这个名字的result,获得标签体内的跳转路径
所以,我们可以自己写异常类,比如action层一个异常类、service层一个异常类、dao层一个异常类,每个类对应不同的result,跳转到不同的提示页面,我们就能知道是那个部分出问题了。
再有些特殊情况的补充,有时候没有异常但是有错误信息等,我们需要处理这些错误信息,就要写一个类继承StrutsResultSupport。
<!-- 配置全局结果及异常映射 -->
<package name="base-default" extends="struts-default">
<!-- 返回结果类型 -->
<result-types>
<result-type name="error" class="cn.itcast.core.action.SysResultAction"></result-type>
</result-types>
<!-- 全局返回结果 -->
<global-results>
<result name="error" type="error">/WEB-INF/jsp/error.jsp</result>
<result name="sysError">/WEB-INF/jsp/error.jsp</result>
<result name="input">/WEB-INF/jsp/error.jsp</result>
</global-results>
<!-- 全局异常映射 -->
<global-exception-mappings>
<exception-mapping result="sysError" exception="cn.itcast.core.exception.SysException"></exception-mapping>
<exception-mapping result="input" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
</package>
这个配置相比上面就多了 <!-- 返回结果类型--> 的三行
实际上我们是自定义了result的类型。struts自带的result有10种类型。(json类型不是自带的,需要导包,也是自定义的)
所以为了便于理解,拿常见的result举例:
<result name="error" type="dispatcher">/WEB-INF/jsp/error.jsp</result>
上面这是表示转发类型,将后面的地址转发处理
<result name="error" type="redirect">/WEB-INF/jsp/error.jsp</result>
上面表示是重定向类型,地址重定向访问
同理
<result name="error" type="error">/WEB-INF/jsp/error.jsp</result>
就是按自定义的error类型进行处理,具体处理流程要找error这个type对应的类,这个类是自定义的,里面可以进行自定义的处理。我的理解是发生了未知的错误,可以这么用,(不是异常,异常会被我设置的exception类型捕获),在自定义的类中写一段发送错误报告的代码,然后转发或重定向到页面。
解决这个问题的过程中,为了能理清楚配置的意思,以及配置完成后的执行流程(能更好的理解为什么这么配置)。查阅了如下资料:
参考:
http://www.tuicool.com/articles/eeIr2e
http://lydia-fly.iteye.com/blog/2013736