CodeZine(コードジン)

特集ページ一覧

Struts 2入門(8)~Struts2で構築するToDoアプリケーション~

作りながら学ぶJavaアプリケーションフレームワーク (8)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/08/24 14:00
目次

Actionクラスの構造

 通常、ログインを行うのは一度きりですので、ログイン状態やユーザー情報は、各画面をまたがって保持する必要があります。そのため、ログイン状態やユーザー情報は、セッションに保存するのが一般的です。

 今回のアプリケーションでは、前回説明したModelDriven構成を用い、ScopedModelDrivenインターフェイスを実装することで、ユーザー情報をセッション単位に保持しています。

 また、ログイン情報は、各画面の処理に必要ですので、ログイン情報を持つクラスを親クラスとして、各Actionクラスは、それを継承する形としています。

 ScopedModelDrivenインターフェイスの実装は、親クラスで行います。

[リスト1]ToDoBaseAction.javaの一部
public class ToDoBaseAction extends ActionSupport implements
        ScopedModelDriven<LoginModel> {

    protected LoginModel user; // LoginModelクラス
    private String scopeKey;   // セッションでのModelオブジェクト識別キー

    ...中略...
}

 LoginModelオブジェクトがModelオブジェクトです。

[リスト2]LoginModelクラスのフィールド
public class LoginModel {

    private String userid;
    private String password;
    private String username;

    private int state = -1;

    ...中略...
}

 LoginModelクラスのフィールド、stateが、ログイン状態を表す変数です。初期値は-1で、ログインが完了した場合には1をセットしています。

バリデーション

 ModelDrivenの場合のバリデーションですが、フィールドの各変数に対して、以前紹介したアノテーションを用いた方法では動作しないようです。今回は、ActionSupportクラスで定義されているvalidateメソッドをオーバーライドする方法をとりました。

 validateメソッドは、Actionメソッドが実行される直前に呼び出されるメソッドです。また定義したActionメソッドすべてにおいて、validateメソッドが呼び出されます。バリデーション処理を行いたくないメソッドがある場合には、Actionクラスを分割した方がいいでしょう。今回のアプリケーションでも、機能単位でActionクラスをわけています。

[リスト3]ToDoBaseAction.javaの一部
public class ToDoBaseAction extends ActionSupport implements
        ScopedModelDriven<LoginModel> {

    public void validate() {

        // ログイン済み?
        if (this.user.getState() != 1) {
            addActionError("ログインしてください");
        }
    }
    ...中略...
}

 ToDoBaseActionクラスでは、デフォルトとなるバリデーションを定義しています。ログイン状態をチェックし、未ログインであれば、addActionErrorメソッドでメッセージをセットします。このメッセージが登録されれば、Actionメソッドで定義された処理はスキップされ、ActionメソッドのResult値として、"input"が返されます。なお、登録されたメッセージをJSPで表示するには、<s:actionerror>タグを用います。

 アノテーションによるResult定義は、親クラスではなく、実際のインスタンスとなる派生クラスで行います。ログイン処理を行うActionクラスのToDoLoginActionでは、次のように定義しています。

[リスト4]ToDoLoginAction.javaの一部
@Results({
    @Result(name = "input", location = "login.jsp"),
    @Result(name = "todo", location = "todo", type = "chain")
})
public class ToDoLoginAction extends ToDoBaseAction {

    private static final long serialVersionUID = 1L;

    // バリデーション
    @Override
    public void validate() {

        // ログイン済みなら何もしない
        if (this.user.getState() == 1) return;

        if (this.user.getUserid() == null
                || (this.user.getUserid().length() == 0 && this.user
                        .getPassword().length() == 0)) {
            addActionError("ログインしてください");
            return;
        }

        if (this.user.getUserid().length() == 0) {
            addActionError("ユーザーIDを入力してください。");
        }
        if (this.user.getPassword().length() == 0) {
            addActionError("パスワードを入力してください。");
        }
    }
    ...中略...
}

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:作りながら学ぶJavaアプリケーションフレームワーク

もっと読む

著者プロフィール

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

  • WINGSプロジェクト 高江 賢(タカエ ケン)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5