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"; } }