Struts2は基本的にInterceptorで処理が進んでいく。
HTMLパラメータをActionにセットするのもInterceptor。
入力値のバリデーションを行うのもInterceptor。
2重サブミット検知のためのTokenによるチェックもInterceptor。
といった感じで、デフォルトで多くのInterceptorが実装されている。
さて、このInterceptorを自分で実装する方法は2通り。
- com.opensymphony.xwork2.interceptor.Interceptorをimplementsする。
- 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。