Actionクラスの構造
通常、ログインを行うのは一度きりですので、ログイン状態やユーザー情報は、各画面をまたがって保持する必要があります。そのため、ログイン状態やユーザー情報は、セッションに保存するのが一般的です。
今回のアプリケーションでは、前回説明したModelDriven構成を用い、ScopedModelDrivenインターフェイスを実装することで、ユーザー情報をセッション単位に保持しています。
また、ログイン情報は、各画面の処理に必要ですので、ログイン情報を持つクラスを親クラスとして、各Action
クラスは、それを継承する形としています。
ScopedModelDrivenインターフェイスの実装は、親クラスで行います。
public class ToDoBaseAction extends ActionSupport implements ScopedModelDriven<LoginModel> { protected LoginModel user; // LoginModelクラス private String scopeKey; // セッションでのModelオブジェクト識別キー ...中略... }
LoginModel
オブジェクトがModel
オブジェクトです。
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
クラスをわけています。
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では、次のように定義しています。
@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("パスワードを入力してください。"); } } ...中略... }