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("パスワードを入力してください。");
}
}
...中略...
}
