SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

続 Struts 2入門

Struts2のインターセプタの選定(1)

続 Struts 2入門(2)

インターセプタのジャンル分け

 実装されているインターセプタを大別すると次のように分けられます。

  • Actionクラスの制御に関するもの
  • サーブレット属性に関するもの
  • パラメータ操作に関するもの
  • 同梱されるStruts 2プラグイン(注1)によって提供されるもの。
  • デバッグ用のインターセプタ

 複数のジャンルにかかるものもひとまず一箇所にまとめています。

 今回はActionクラスの制御に関するものを取り上げます。残りについては、次回紹介いたします。

注1

 Struts 2の機能を拡張するライブラリをプラグインと呼びます。プラグインについては次回以降紹介する予定です。

Actionクラスの制御に関するもの

 ここではActionクラスの動きを制御するインターセプタを挙げていきます。インターセプタを適用することで動きが変わっていき、デフォルトのインターセプタ・スタックで適用されているものもあります。ここでは良く使われると思われるインターセプタについて解説していきます。

(1)Chaining Interceptor

 元Actionのフィールドの初期値を引き継ぐリクエストのフォワードを行います。ActionのResultTypeにchainを指定する際に使われます。

リスト1 ChainSampleAction.java(抜粋)
//Actionクラスのグループをchainに指定
@Namespace(value="/chain")
// Actionメソッドの戻り値と遷移先画面を指定
@Results({
    @Result(name="success" , location="success.jsp") ,
    // type="chain"時、locationに指定したActionクラス/メソッドへ遷移
    @Result(name="chainResult" , type="chain" , location="chainAction"),
})
public class ChainSampleAction extends ActionSupport {
    private static Logger log = Logger.getLogger(ChainSampleAction.class);

    // start.actionで起動
    @Action(value="start")
    public String execute() throws Exception {
        return "success";
    }

    // chainStart.actionで起動
    @Action(value="chainStart" )
    public String chainStart() throws Exception {
        // value2の値に文字列を追加
        value2 += "+chain+";
        log.debug(value1 + "/" + value2 + ".");
        return "chainResult";
    }

    private String value1;
    private String value2;

    public String getValue1() {
        return value1;
    }
    public void setValue1(String value1) {
        this.value1 = value1;
    }
    public String getValue2() {
        return value2;
    }
    public void setValue2(String value2) {
        this.value2 = value2;
    }
}

 type="chain"を指定することで、locationで指定した別のActionクラスへ遷移します。この例ではchainActionと記述されていますので、chainAction.actionが呼ばれます。

 このActionクラスのどの時点での値を引き継いでいるかを調べるため、画面から渡されたvalue2の値の後ろに +chain+ をつけることにしました。

 次にchainで指定先として選ばれたActionクラスです。先ほど指定したchainActionが@Actionアノテーションで指定されていますので、このActionクラスが起動します。type="chain"によって呼び出されたActionクラスは、呼び出し元のActionクラスのフィールドの初期値を引き継ぎます。

リスト2 ChainAnotherSampleAction.java(抜粋)
@Namespace(value="/chain")
@Results({
    @Result(name="success" , location="success.jsp"),
})
public class ChainAnotherSampleAction extends ActionSupport {
    private static Logger log = Logger.getLogger(ChainAnotherSampleAction.class);
    // chainAction.actionで起動
    @Action(value="chainAction")
    public String execute() throws Exception {
        log.debug(value1 + "/" + value2 + ".");
        return "success";
    }
    private String value1;
    private String value2;

    public String getValue1() {
        return value1;
    }
    public void setValue1(String value1) {
        this.value1 = value1;
    }
    public String getValue2() {
        return value2;
    }
    public void setValue2(String value2) {
        this.value2 = value2;
    }
}

 では実際にサンプルを動かして確認してみましょう。

 ブラウザでhttp://127.0.0.1:8080/interceptors/chain/start.actionを表示します。

図1 Chaining Interceptor 入力画面
図1 Chaining Interceptor 入力画面

 この画面のテキストボックスに値を入力し、「ActionChainを稼動する」ボタンを押すことでテキストボックスの内容がChainSampleActionクラスへ渡され、さらにChaining InterceptorによってChainAnotherSampleActionクラスへと自動的に遷移します。この動作をそれぞれのActionクラスにてログで出力していますので、そのログの結果は次のように表示されます。

図2 Chaining Interceptor を使ったActionクラスのログ出力結果
図2 Chaining Interceptor を使ったActionクラスのログ出力結果

 画面からActionクラスのvalue1,value2が伝播されていることがわかります。そしてvalue2に+chain+がつけられていることもログで確認され、Chaining Interceptorで遷移したActionクラスでは、加工前のvalue2の値になっていることもわかります。

 このログからわかることは、遷移したChainAnotherSampleActionではChainSampleActionの初期値がそのまま渡されていることになります。

 結果画面も同様にvalue1,value2が渡されますので、次のように表示されます。

図3 Chaining Interceptor 結果画面
図3 Chaining Interceptor 結果画面

次のページ

この記事は参考になりましたか?

続 Struts 2入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5024 2010/04/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー