ServletConfigInterceptorはActionクラスにHttpServletRequest、HttpServletResponse、ServletContextなどの情報を設定してくれる。ただし、設定される為にはサポートされてるインターフェースをActionで継承しなければならない。サポートされるのは以下のインターフェース。

  • ServletContextAware
  • ServletRequestAware
  • ServletResponseAware
  • ParameterAware
  • RequestAware -
  • SessionAware
  • ApplicationAware
  • PrincipalAware


仮にサポートされるすべてのインターフェースを継承したクラスを作成すると以下のようになる。各setterメソッドに対してServletConfigInterceptorが値を設定してくれる。


import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.PrincipalAware;
import org.apache.struts2.interceptor.PrincipalProxy;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;


public class HogeAction extends ActionSupport implements ServletContextAware,
ServletRequestAware,
ServletResponseAware,
ParameterAware,
RequestAware,
SessionAware,
ApplicationAware,
PrincipalAware{

private ServletContext servletContext;
private HttpServletRequest request;
private HttpServletResponse response;
private Map parameterMap;
private Map requestMap;
private Map sessionMap;
private Map applicationMap;
private PrincipalProxy principalProxy;

public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setParameters(Map parameterMap) {
this.parameterMap = parameterMap;
}
public void setRequest(Map requestMap) {
this.requestMap = requestMap;
}
public void setSession(Map sessionMap) {
this.sessionMap = sessionMap;
}
public void setApplication(Map applicationMap) {
this.applicationMap = applicationMap;
}
public void setPrincipalProxy(PrincipalProxy principalProxy) {
this.principalProxy = principalProxy;
}
}

ServletContextAware、ServletRequestAware、ServletResponseAwareを継承してしまうとservletApiに依存したクラスになってしまうので注意が必要。(テストがしにくくなるとか、フレームワークがせっかく隠してくれてたのに〜 っているのが理由)リクエストの値がとりたい場合はRequestAware、セッションの値がとりたい場合はSessionAwareを継承しとけば値がとれる(かつservletApiにも依存しなくて済む)のでそれらの値がとりたいだけであれば、上記インターフェースの継承は不要。

また、SessionAware,RequestAware、ParameterAware、を継承してServletConfigInterceptorに値を設定してもらわなくても、Action内で直接以下のように書けば同じように値を取得できる(ServletConfigInterceptorがやっていることと一緒だけど。。)
ActionContext.getContext().getSession().get("foo");
ActionContext.getCongext().get("request").get("bar");
ActionContext.getParameters().get("hoge");


Actionに対して使用するインターセプターをstruts-default.xmlで宣言しているinterceptor-stackを使用する場合はstruts.xmlに対して何も記述の必要はない。(struts-default.xmlで宣言されているすべてのinterceptor-stackにServletConfigInterceptorが入っているため)もし、自分でinterceptor-stackをstruts.xmlに宣言して、その中にServletConfigInterceptorを追加したい場合は以下の記述を追加する。
<interceptor-ref name="servletConfig"/>

0 コメント: