Develop with pleasure!

福岡でCloudとかBlockchainとか。

Struts2は基本的にInterceptorで処理が進んでいく。

HTMLパラメータをActionにセットするのもInterceptor。
入力値のバリデーションを行うのもInterceptor。
2重サブミット検知のためのTokenによるチェックもInterceptor。

といった感じで、デフォルトで多くのInterceptorが実装されている。

さて、このInterceptorを自分で実装する方法は2通り。

  1. com.opensymphony.xwork2.interceptor.Interceptorをimplementsする。
  2. com.opensymphony.xwork2.interceptor.AbstractInterceptorを継承する。

まぁ、Interceptorくらい別にPOJOじゃなくても良っかーと思い、AbstractInterceptorを継承する。
後は、

public String intercept(ActionInvocation invocation) throws Exception;

メソッドをオーバーライドするだけ。

あとは引数として渡される、ActionInvocationを利用して実行中のAction等にアクセスできる。
InterceptorからからHttpServletRequest/Responseにアクセスしたい場合は、

public String intercept(ActionInvocation actionInvocation) throws Exception {
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
    HttpSession session = ServletActionContext.getRequest().getSession();
}

といった形でアクセス可能。
ServletActionContextにクラスメソッドが用意されてるのね。

てことは、ActionクラスもSessionAwareやRequestAwareをimplementsしなくてもHttpServletRequestやHttpSessionにアクセスできるじゃん。
ただ、ServletActionContextを使用すると生のHttpServletRequest、HttpSessionが帰ってくるため、ServletAPIに依存したコードになってしまう。
SessionAwareやRequestAwareをimplementsして取得可能なのは、生のHttpServletRequest、HttpSessionではなく、Struts2がRequestやSessionのパラメータをラップ?したMapが帰ってくるだけなのでServletAPIに依存しない。
当然、ServletAPIに依存しない方がテストしやすいので、ServletActionContextを使用するよりもSessionAwareやRequestAwareを利用した方がイケてる。

ちゃんと考えられてるなぁ。Struts2。