26 7月 2011

Struts2 處理404錯誤的方法

一個Member問起這個問題,我覺得很不錯。

Error Code 404 這個問題說大不大,不過是使用者敲錯了URL,又不是Error Code 500代表我們的系統出現錯誤,何況使用者要敲什麼,我們哪管得著?我想這也沒錯啦,如果我在Google Map敲個'我家',然後還希望它給我什麼好看的是不是有點超過?(也許會出現全家便利商店?)

在Struts2中,一般要解決的404URL大約是兩類,一類是struts2 的.action,另一類就是一般的resource,像jpg、js等

第一類Action的方式很容易,在struts.xml中設定一個default的package,然後用個default-action-ref就可以解決

	<package name="default" extends="struts-default">
		<default-action-ref name="index"/>
		<action name="index">
			<result>/index.jsp</result>
		</action>
	</package>

第二類非Action的話就要在xml中加上error-page的設定

	<error-page>
		<error-code>404</error-code>
		<location>/rootAction.action</location>
	</error-page>
這類的處理要注意的是,如果是直接導到jsp或html就不用在意,但若是想導到一個action的話,請注意你的struts action filter,是不是有加上error 的dispatcher。
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		<!-- <init-param> <param-name>actionPackages</param-name> <param-value>com.mycompany.myapp.actions</param-value> 
			</init-param> -->
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>