struts的声明式异常处理

时间:2021-05-17 16:23:44

情景

使用Struts封装的下载文件的功能

当下载文件找不到的时候,struts获取的InputStream为null

这个时候,就会报500错误

java.lang.IllegalArgumentException : Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack. Check the tag specified for this action.
org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)
.......

解决方案

因为getInputSteam是struts自己完成的,所以我们不能再用try-catch了

这时候就要用到声明式异常处理了

类似于web.xml中的error-page配置

声明式异常处理

声明式异常处理要用到两个标签exception-mappingresult

先放上刚刚解决方案的代码

<package namespace="...">

<global-results>

<result name="notFound" type="redirect">notFound</result>

</global-results>

<action name="download" class="xxxx">

<exception-mapping result="notFound" exception="java.lang.IllegalArgumentException"></exception-mapping>

....

</package>

当抛出异常,Struts就会检查struts.xml里面有没有配置exception-mapping,检查exception-mapping的class跟异常是否一样,如果一样就会找到exception-mapping的result,先检查当前action内的result是否有匹配的(如果是<global-exeception-mapping>就直接检查<global-results>),如果匹配上了,就执行result的内容,像正常的action返回result那样

在这里,就是返回了notFound的result,然后找到global-results里有一个叫做notFound的result,然后执行重定向notFound,notFound是一个action

注意,如果result返回了一个action,那么就要指定type="redirect"(默认的是dispatcher)

因为处理声明式异常的filter在接受action的后面,如果type是转发请求的话,不会经过ActionFilter的处理,结果会报404

error-page

在web.xml中,可以针对某个error代码(404、403、500。。。),去自定义错误页面

demo

<error-page>

<error-code>404</error-code>

<location>/index.html</location>

</error-page>

这时候,用户乱输入地址,就会被自动跳转到index.html

查看原文:http://www.wewill.top/2016/06/02/struts%E7%9A%84%E5%A3%B0%E6%98%8E%E5%BC%8F%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86/