SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

ToDoメッセージの一覧表示

 list.jspの2つめのフォームは、登録済みのToDoメッセージの一覧表示と、ToDoを完了済みの状態に更新する処理の呼び出しに使用しています。

[リスト14]list.jspの一部
<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オブジェクトのゲッターは、次のようになっています。

[リスト15]ToDoAction.javaの一部
// ToDo一覧
public TodoList[] getTodoList() {
    TodoDao todo = new TodoDao();
    return todo.getAll(this.user.getUserid());
}

 TodoDaoクラスのgetAllメソッドで、実際にデータベースから取得しています。

[リスト16]TodoDao.javaの一部
// 全データ取得
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アクションは、次のようになっています。

[リスト17]ToDoAction.javaの一部
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メソッドにわたして、状態の更新を行っています。

[リスト18]TodoDao.javaの一部
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だけで行っています。

[リスト19]ToDoUserEntryAction.javaの一部
@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メソッドを呼び出し、登録処理をしています。

[リスト20]LoginDao.javaの一部
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にあって、これまでの記事が、ひとりでも多くの開発者の手助けになれば、これ以上の喜びはありません。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
作りながら学ぶJavaアプリケーションフレームワーク連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4214 2009/08/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング