tomcat7 + struts2でwebアプリケーション(9) インターセプター(1)

独自のインターセプタを作成し、アクションの処理に移る前に処理を横取りする。
独自インターセプタでは、セッションに情報を入れて結果画面に遷移する。

(1)struts.xmlでインターセプタを定義。
interceptor-stack内でmyInterceptorを後に定義。逆の順番ではうまく機能しなかった。
(そもそもdefaultStackの記述が必要ない気がするが、公式チュートリアルに記載を見つけられなかった)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
    <constant name="struts.devMode" value="false" />

    <package name="myapp" extends="struts-default" namespace="/">
	<!-- インターセプタ -->
	<interceptors>
		<interceptor name="myInterceptor" class="TestInterceptor"/>
		<interceptor-stack name="myStack">
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<interceptor-ref name="myInterceptor"/>
		</interceptor-stack>
	</interceptors>

	<default-interceptor-ref name="myStack"/>

    	<!-- フォーム入力処理 -->
    	<action name="testAction" class="TestAction">
    		<result name="success">/result.jsp</result>
    		<result name="input">/formTest.jsp</result>
    	</action>

    	<!-- セッション処理 -->
    	<action name="clearSession" class="SessionAction" method="clear">
    		<result name="success">/formTest.jsp</result>
    	</action>
    </package>

</struts>

(2)独自インターセプタクラス(TestInterceptor.java)
AbstractInterceptorを継承する。
今回、戻り値は"success"とし、アクションにはいかずに直接result.jspへ遷移する。
アクションに処理を戻す場合は、invocation.invoke()。

import java.util.Map;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class TestInterceptor extends AbstractInterceptor {

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String, Object> session = invocation.getInvocationContext().getSession();
		session.put("username", "yamada");
		session.put("password", "qwerty");
		return "success";
	}

}