ToDoメッセージの一覧表示
list.jspの2つめのフォームは、登録済みのToDoメッセージの一覧表示と、ToDoを完了済みの状態に更新する処理の呼び出しに使用しています。
<s:form action="finish" > <s:iterator value="TodoList"> <s:checkboxlist list="top" listKey="ID" name="todoid" listValue="todo" theme="simple" /><br> </s:iterator> <s:submit value="Finish"/> </s:form>
<s:checkboxlist>タグを用いて、チェックボックス付きでToDoメッセージの一覧を表示しています。なお、本来、<s:checkboxlist>タグのみで、一覧表示できるのですが、その場合、各チェックボックスが横1列に並んでしまうので、見づらい表示となってしまいます。チェックボックスごとに改行させたいため、<s:iterator>タグで、繰り返しを指定しています。
<s:iterator>タグのvalueで、表示もとのオブジェクト、TodoListを指定しています。TodoListとは、さきほどのEntityで定義したオブジェクトです。このオブジェクトにToDoメッセージが格納されていて、<s:iterator>タグにより、一つずつ取り出され、<s:checkboxlist>タグが繰り返し生成されます。
じつは、この部分が、ログインActionからの遷移では、うまくいかない箇所です。ログインActionクラスでは、TodoListオブジェクトを設定していませんから、ToDoメッセージの一覧表示がされないのです。
ToDoActionクラスのTodoListオブジェクトのゲッターは、次のようになっています。
// ToDo一覧
public TodoList[] getTodoList() {
TodoDao todo = new TodoDao();
return todo.getAll(this.user.getUserid());
}
TodoDaoクラスのgetAllメソッドで、実際にデータベースから取得しています。
// 全データ取得
public TodoList[] getAll(String userid) {
try {
return BaseDao.getInstance()
.getEntityManager().find(TodoList.class, "userid=? and valid=?", userid, 1);
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return null;
}
ToDoメッセージの有効無効をvalidフィールドの値で判断しています。findメソッドにて、validが1の有効なToDoのみを取得しています。
ToDoメッセージの状態更新
Finshボタンにて、finishアクションがsubmitされます。これは、完了済みとなったToDoメッセージの登録を削除する処理です。実際には、削除のかわりに、前述のvalidフィールドの値を0に更新します。
ToDoActionクラスのfinishアクションは、次のようになっています。
private String todoid[]; // ToDo更新用
// ToDo更新
@Action("/finish")
public String finish() throws Exception {
TodoDao todo = new TodoDao();
if (this.getTodoid() != null ) {
for ( String id : this.getTodoid() ) {
todo.setFinish(id);
}
}
return "success";
}
<s:checkboxlist>タグのnameで指定した文字列配列(todoid)に、TodoListオブジェクトのIDの値がセットされています。
<s:checkboxlist list="top" listKey="ID" name="todoid" listValue="todo" />
またIDは、TodoListテーブルの主キーであり、それをTodoDaoクラスのsetFinishメソッドにわたして、状態の更新を行っています。
public void setFinish(String id) {
TodoList todo = BaseDao.getInstance()
.getEntityManager().get(TodoList.class,Integer.valueOf(id));
todo.setValid(0);
todo.save();
}
主キーによるデータ取得は、getメソッドを使用します。
ユーザー情報の登録
最後は、ユーザー情報の登録処理です。この処理は、ToDoUserEntryActionクラスのusrentryexecアクションとusrentry.jspだけで行っています。
@Results({
@Result(name="input", location="usrentry.jsp"),
@Result(name="success", location ="usrentry.jsp")
})
public class ToDoUserEntryAction extends ToDoBaseAction {
@Override
public void validate() {
...中略...
}
@Action(value="/usrentryexec")
public String usrentry() throws Exception {
this.user.setUsername( FixString.encoding(this.user.getUsername()) );
LoginDao login = new LoginDao();
if (login.add(this.user.getUserid(), this.user.getPassword(),this.user.getUsername())) {
addActionMessage("ユーザーの登録を完了しました。");
this.user.setState(1);
}
else {
addActionMessage("このユーザーIDは既に登録されていますので、別のIDを入力してください。");
this.user.setUserid("");
this.user.setPassword("");
this.user.setUsername("");
}
return "success";
}
}
このクラスでも、validateメソッドをオーバーライドして、バリデーション処理を行っています。処理内容は、ログイン時のバリデーションとほとんど同じです。
usrentryexecアクションにて、LoginDaoクラスのaddメソッドを呼び出し、登録処理をしています。
public boolean add(String userid, String password,String username){
try {
if ( BaseDao.getInstance().getEntityManager().count(
User.class,"userid=?",userid ) == 0 ){
User user = BaseDao.getInstance()
.getEntityManager().create(User.class);
user.setUserid(userid);
user.setPassword(password);
user.setUsername(username);
user.save();
return true;
}
}
catch (SQLException e) {
System.out.println(e.getMessage());
}
return false;
}
このメソッドでは、まず、パラメータで渡されたユーザー情報が登録されているかどうかをcountメソッドでチェックしています。戻り値が0であれば、登録がないということなので、createメソッドで追加します。
まとめ
今回のサンプルは、一通りの機能をもったアプリケーションでした。ポイントとなるコードのみの説明でしたので、全体像がつかみにくかったかもしれません。ぜひ実際に動作させて、ソースコードを追ってみてください。一つ一つは、シンプルな処理ですので、すぐに理解できるはずです。
本連載では、Struts 2入門ということで、基本的な機能を中心に解説しました。Struts 2には、この連載では紹介しきれなかった機能もたくさんあります。実際のアプリケーションを構築する際には、思わぬところで、つまずくこともあるでしょう。
今回でひとまず連載の区切りをつけますが、まだまだ日本語による情報が少ないStruts 2にあって、これまでの記事が、ひとりでも多くの開発者の手助けになれば、これ以上の喜びはありません。
