SHOEISHA iD

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

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

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

続 Struts 2入門

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

続 Struts 2入門(2)

(4)Prepare Interceptor

 このインターセプタを使うと、Actionクラスのexecute()メソッドを実行する前の処理をprepare()メソッドで記述することができます。他に利用しているインターセプタとの兼ね合いもありますので、リクエストパラメータやサーブレット属性の修正については慎重に行う必要があります。また、Actionクラスの実行メソッドがexecute以外にもある場合には、常に接頭辞としてprepareをつけることで同様に前処理を実装することができます。

 例えば、search()メソッドはprepareSearch()メソッドになります。

リスト5 PrepareSampleAction.java(抜粋)
@Namespace(value="/prepare")
@ParentPackage(value="struts-default")

@InterceptorRefs({
    @InterceptorRef("defaultStack") ,
})

@Results({
    @Result(name="success" , location="success.jsp"),
})
/**
 * Preparable実装サンプル。実行メソッドexecute()の前処理を行う箇所をprepare()で提供される。
 */
public class PrepareSampleAction extends ActionSupport implements Preparable {
    private static Logger log = Logger.getLogger(PrepareSampleAction.class);
    /**
     * execute()の前処理をここに実装。
     */
    public void prepare() throws Exception {
        log.debug("*prepare*");
        addActionMessage("prepare()を通過しました");
    }

    @Action("execute")
    public String execute() throws Exception {
        log.debug("+execute+");
        addActionMessage("execute()を通過しました");
        return "success";
    }

    /**
     * other()の前処理をここに実装。
     */
    public void prepareOther() throws Exception {
        log.debug("*prepareOther*");
        addActionMessage("prepareOther()を通過しました");
    }

    @Action("other")
    public String other() throws Exception {
        log.debug("+other+");
        addActionMessage("other()を通過しました");
        return "success";
    }
}

 それではサンプルを使って確認をします。

 ブラウザから「http://127.0.0.1:8080/interceptors/prepare/execute.action」を表示します。すると次の画面が出ます。

図6 Prepare Interceptor のサンプル起動画面
図6 Prepare Interceptor のサンプル起動画面

 この画面ではexecute()メソッドが起動されますので、PrepareInterceptorによってprepare()が起動されてから、execute()を起動されます。画面上部のメッセージ部分で、Actionクラスのメソッド内で出力しているメッセージが表示されています。

 では、画面内のリンクにある「other()アクションを起動する」リンクをクリックしてother()メソッドを起動してみましょう。その結果は次のようになります。

図7 Prepare Interceptor の別メソッド起動後画面
図7 Prepare Interceptor の別メソッド起動後画面

 このように、Actionクラス内のメソッドが起動する前にprepareから始まるメソッドが起動されていることがわかります。

 注意点としては、prepare****()メソッドが実行された後、prepare()が実行されることです。1つのActionで複数のActionメソッドを実装する場合にはなるべくexecute()、prepare()での実装は避けておきましょう。

(5)Token Interceptor

 リクエストごとに発行される一時トークンをチェックし、合致しなければActionが起動されずにresult値はinvalid.tokenを返します。TokenInterceptorは同一セッションからの複数のリクエストをブロックすることができます。遷移チェック用の一時トークンはJSPにて<s:token />を記述するだけで利用することができます。なお、invalid.tokenの遷移先の画面はそれぞれのActionか、または共通で1つは設定しなければなりません。

 なお、遷移チェックでエラーを検出した場合のメッセージはstruts.messages.invalid.tokenで出力するようメッセージIDが固定されています。このメッセージIDはメッセージ用プロパティなどに登録しておけばその内容が表示されます。

 サンプルアプリケーションでは、commons.propertiesで

リスト6 commons.properties
struts.messages.invalid.token=不正な画面遷移を検出しました。

のように設定しています。

次のページ
まとめ

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

続 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー