对于使用了struts2的工程,以下几种情况,我觉得需要跳转至 404 页面告诉用户:
① 在地址栏里,直接输入一个不存在的jsp页面
比如, http://xxx:port/webapp/test.jsp, 其中test.jsp根本就不存在
解决办法:
<error-page>
<error-code>404</error-code>
<location>/jsp/error/error_forward.jsp?code=400</location>
</error-page>
上面的location对应的页面有如下限制:
(1) 必须以“/”开头
(2) jsp页面中不能使用struts2的tag,否则会报错
(3)无法指定一个action作为location的值。如果你指定了一个action,那么当出现404出错时,画面将会是一片空白。
PS:下面两种情况是以使用“convention plugin”为前提的
② 在地址栏里,直接输入一个不存在的action
比如, http://xxx:port/webapp/test!method1,其中,TestAction根本就不存在。报以下异常:
WARN [org.apache.struts2.dispatcher.Dispatcher : 68] - <Could not find action or result: /test-fs/forward11!notFound>
There is no Action mapped for namespace / and action name forward11. - [unknown location]
at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)
at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:70)
at org.apache.struts2.rest.RestActionProxyFactory.createActionProxy(RestActionProxyFactory.java:53)
...
解决办法:
<package name="your-package" extends="struts-default">
<default-action-ref name="notFound" />
<action name="notFound" class="com.test.test.action.ForwardAction" method="notFound">
<result name="notFound">/jsp/error/404.jsp</result>
</action>
</package>
需要提醒的是,不要给上面的package指定namespace。另外,action的 result 一定要声明。除非在global-results中刚好有一个result 与你的“notFound()”这个方法所要跳转的result的名字 是一样的。
上面的配置的意思就是,在package下配置一个 default action,这个当输入的action找不到的时候,就会使用此action来进行处理。
以我上面的配置来说,当一个action找不到时候,就会调用 com.test.test.action.ForwardAction 中的 notFound() 方法来对应。
③ 在地址栏里,输入了的action虽然存在,但是指定的方法,在action中却不存在
比如,http://xxx:port/webapp/test!method2,其中TestAction存在,但是method2却不存在于TestAction中
解决办法:
<!-- this is the handler of convention plugin. This is required by the convention plugin. -->
<bean name="conventionUnknownHandler" class="org.apache.struts2.convention.ConventionUnknownHandler" type="com.opensymphony.xwork2.UnknownHandler" />
<!-- this is the custom handler -->
<bean name="myUnknownHandler" class="com.test.test.handler.CustomUnknownHandler" type="com.opensymphony.xwork2.UnknownHandler" />
<unknown-handler-stack>
<unknown-handler-ref name="conventionUnknownHandler"></unknown-handler-ref>
<unknown-handler-ref name="myUnknownHandler"></unknown-handler-ref>
</unknown-handler-stack>
首先,声明了两个bean,一个是convetion自己实现的handler,一个是我自己实现的handler,然后在,在unknown-handler-stack标签中引用它们,这样一来,在上面的“methodResult = unknownHandlerManager.handleUnknownMethod(action, methodName);”处,就会使用这里所引用的handler去处理未知情况。当然, handleUnknownAction、handleUnknownResult还是使用的是convention plugin中的实现,handleUnknownActionMethod使用的是我的实现。
以上具体详细内容详见http://rainbow702.iteye.com/blog/2227847
另外还有一种解决第②种的方式(尚未验证):
参考http://blog.youkuaiyun.com/nthack5730/article/details/51241353
There is no Action mapped for namespace [/] and action name [] associated with context path....
在需要处理的命名空间下,加入由【*】配置的action即可。这个方法不单单能在根命名空间做处理,在任意命名空间都可以做这个处理,需要处理的就加上即可。
<!-- User命名空间 -->
<package name="User" namespace="/user" extends="struts-default">
<!-- 配置默认action -->
<default-action-ref name="index" />
<action name="index">
<result>/WEB-INF/jsp/user.jsp</result>
</action>
<!-- 通过通配方式跳转,防止页面地址乱请求 -->
<!-- 只要找不到对应的action都自动跳转到index,可以再写一个404的action,自动跳转到404 -->
<action name="*">
<result type="redirect">index</result>
</action>
</package>