(2)Execute And Wait Interceptor
Actionクラスを別スレッド(BackgroundProsess)にて動かし、Actionクラスの動作が完了するまでResultにwaitを返すようにします。スレッドはセッション単位で動作します。
詳細については『続・Struts 2入門(1)Struts 2の同期処理を手助けするExecuteAndWaitインターセプタ』を参照してください。
(3)Exception Interceptor
例外を検出した場合、設定されている例外とresultの対応マッピングを見て、例外ごとに定義されたresultを返すようになります。Action単位で指定も可能で、共通の指定も可能になっています。
次のサンプルは、設定ファイルであるstruts.xmlに例外設定を付け加えたものです。
<struts>
<!-- 継承用の設定 -->
<package name="base" extends="struts-default" abstract="true">
…(省略)…
<!-- 共通Result定義 -->
<global-results>
<result name="ApplicationException">/ApplicationException.jsp
</global-results>
<global-exception-mappings>
<exception-mapping exception="seren.lumi2.exception.ApplicationException"
result="ApplicationException"/>
</global-exception-mappings>
</package>
</struts>
上のサンプルでは、Strust2のデフォルト設定を継承したbaseパッケージという共通定義をpackage要素で作成しています。その中で、global-exception-mappingsにて例外と対応する遷移先ID、global-resultsにて、共通する遷移先IDと遷移先を定義することができます。この例では、seren.lumi2.exception.ApplicationExceptionを検出すると、遷移先がApplicationExceptionになり、つまりApplicationException.jspが表示されるようになります。
では実際にサンプルで確認をしてみましょう。ブラウザで「http://127.0.0.1:8080/interceptors/exception/start.action」を開きます。

この画面で「Actionを起動する」ボタンを押して起動されるActionクラスでは、次のような実装をしています。
// 使用するpackage名
@Namespace(value="/exception")
// 利用するstruts.xmlのpackage要素名
@ParentPackage("base")
// Actionクラスの遷移先
@Results({
@Result(name="success" , location="success.jsp"),
})
/**
* ExceptionInterceptor利用サンプル。
*/
public class ExceptionSampleAction extends ActionSupport {
private static Logger log = Logger.getLogger(ExceptionSampleAction.class);
// 開始画面を表示
@Action(value="start")
public String start() throws Exception {
return "success";
}
// アプリケーション例外を送出するAction
@Action(value="execute")
public String execute() throws Exception {
log.debug("アプリケーション例外を送出します");
throw new ApplicationException("アプリケーション例外です");
}
}
「Actionを起動する」ボタンを押すと、execute()メソッドが起動します。このメソッドではstruts.xmlにて定義した例外クラスであるApplicationExceptionを送出します。すると定義どおり、ApplicationException.jspへ遷移し、次の画面が表示されます。

