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にあって、これまでの記事が、ひとりでも多くの開発者の手助けになれば、これ以上の喜びはありません。