struts2 跳轉至404 頁面的解決方案

對於使用了struts2的工程,如下幾種狀況,我以爲須要跳轉至 404 頁面告訴用戶:java

① 在地址欄裏,直接輸入一個不存在的jsp頁面web

     好比, http://xxx:port/webapp/test.jsp, 其中test.jsp根本就不存在apache

解決辦法:app

<error-page>  
        <error-code>404</error-code>  
        <location>/jsp/error/error_forward.jsp?code=400</location>  
    </error-page>

上面的location對應的頁面有以下限制: webapp

(1) 必須以「/」開頭jsp

(2) jsp頁面中不能使用struts2的tag,不然會報錯
(3)沒法指定一個action做爲location的值。若是你指定了一個action,那麼當出現404出錯時,畫面將會是一片空白。ui

PS:下面兩種狀況是以使用「convention plugin」爲前提的this

② 在地址欄裏,直接輸入一個不存在的actionspa

     好比, http://xxx:port/webapp/test!method1,其中,TestAction根本就不存在。報如下異常:.net

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.csdn.net/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>
相關文章
相關標籤/搜索