[Struts2] Actionメソッドをフックする(@Before, @After, @BeforeResult)
Struts2では複数のアクションを1つのActionに記述できるので、TemplateMethodパターンではメソッドの前処理と後処理を書けません(Struts1では、Actionごとにメソッドが1つだったので、TemplateMethodパターンを利用して簡単にActionメソッドをフックできる)。
Struts2では、@Before, @After, @BeforeResultを使って、Actionのフックメソッドを定義できます。
@Before public void prepareAction() { // ... }
これらのアノテーションを利用するには、AnnotationWorkflowInterceptorをinterceptorStackに追加する必要があります(Defaultではないので自分で追加します)。個々のAction定義に記述してもよいですが、アプリケーションのデフォルトパッケージとして定義したほうが使いやすいと思います。
<struts> <include file="struts-default.xml" /> <package name="myapp-default" extends="struts-default" abstract="true" > <interceptors> <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" /> <interceptor-stack name="myapp-defaultStack"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="annotationWorkflow" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="myapp-defaultStack" /> </package> <include file="struts/struts-order.xml" /> </struts>
なお、@Before, @After以外にActionをフックする方法としては、以下が考えられます。
- Interceptorを実装する
- Prepareインターフェースを利用する(前処理のみ)
- AOPを適用する
参考