Struts2をやってみる (9) - Preparable Interface -
いわゆるアクションメソッドが起きる前の事前処理をしたい場合とかにメソッドがコールされる仕組みが存在する模様
それがcom.opensymphony.xwork2.Preparableを実装する事で可能。で発生する概要的なのとして
- prepareアクションメソッド(ucfirst?)が発生
- alwaysInvokePrepareがfalseで無い限りはprepareメソッドが発生
的なパターンかと。例えば
package sample.action;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;
public class IndexAction extends ActionSupport implements Preparable {
private static final long serialVersionUID = 1L;
@Override
public void prepare() {
System.out.println("prepare");
}
public void prepareIndex() {
System.out.println("prepareIndex");
}
public String index() throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/plain); charset=utf-8");
PrintWriter out = response.getWriter();
out.print("hoge");
out.flush();
out.close();
return NONE;
}
}
的な事をすれば
- prepareIndex
- prepare
- index
っていう流れで実行される模様。但し、上記でも書いてあるようにalwaysInvokePrepareをfalseに設定するとprepareメソッドはコールされない模様
あと確証は無いけど、<action>に<interceptor-ref>を設定するとデフォルトのインターセプタースタックが初期化されるのか分からないけど、前回の例外処理を行う場合は例外処理に関わるインターセプターも設定しないといけない。但し、<interceptor-ref name="defaultStack" />だと、デフォルトなprepareがぶち込まれる模様。なので自前なstruts.xmlで<param name="alwaysInvokePrepare">を設定しようか関わらずprepareは実行されてしまう。なのでこういうケースに限ってはインターセプターを個々で指定しておくべきなのかも知れない