SeekHtml クラスから実装していきます。この画面は表示のされ方が多彩です。
| No | 遷移元 | 表示トリガー | 備考 |
|---|---|---|---|
| 1 | MenuHtml | ユーザー一覧リンク | |
| 2 | SeekHtml | 検索ボタン | |
| 3 | 前へ~次への各リンク | ||
| 4 | 削除ボタン | データ削除が発生 | |
| 5 | EditHtml | 決定ボタン | |
| 6 | キャンセルボタン |
特に、自身が遷移元・遷移先、両方同時になり得る可能性もあるため、inputMain と outputMain の使い分けが曖昧です。
このため次のポリシーで実装する事とします。
| inputMain | ページ番号の切り替え(一覧の再描画は行わない)を行う。 上表 No4 の削除処理(User.db からの削除)を行う。 |
| outputMain | 単純に、検索条件(ユーザーID)とページ番号(一覧の上下にあるページ番号)に基づいて User.db の中身を一覧へ反映する。 No5、No6 で遷移した場合も上記と同様に処理。 No1 から遷移した場合のみ初期化する。 |
まず、init メソッドに初期化処理を入れます。
最初表示される時は、検索項目と新規追加ボタン、戻るリンク以外は表示しない(インスタンスは存在するが、出力しない)ようにします。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
public void init(){ super.init(); // モックアップHTMLの内容と異なる内容で初期化したい場合は // super.init()の後に変更用の処理を記述して下さい。 // このメソッドは上記コンストラクタの中から呼ばれます。 // インスタンス発生はバックグラウンドで非同期に処理していますので // HTTPリクエスト発生よりずっと過去に初期化されます。 // このため、ユーザーのトランザクションに応じた条件分岐を設けても // 意図した振る舞いになりません。 getNotFoundP().setVisible( false ); getResultDiv().setVisible( false ); }
また、ページ番号制御が必要なため、次の変数を準備して初期化します。
1: 2: 3: 4: 5: 6: 7:
public class SeekHtml extends tutorial2.view.user.SeekHtml { // 1ページの最大行。 private static final int MAX_LINE = 3; // 表示中のページ。 private int page = 0; // 行のテンプレート。 private Line org_line;
最後の org_line 変数は、
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
public void init(){ super.init(); // モックアップHTMLの内容と異なる内容で初期化したい場合は // super.init()の後に変更用の処理を記述して下さい。 // このメソッドは上記コンストラクタの中から呼ばれます。 // インスタンス発生はバックグラウンドで非同期に処理していますので // HTTPリクエスト発生よりずっと過去に初期化されます。 // このため、ユーザーのトランザクションに応じた条件分岐を設けても // 意図した振る舞いになりません。 getNotFoundP().setVisible( false ); getResultDiv().setVisible( false ); // テーブルのデータ行を複製する。 org_line = getListTable().getLineReplica( 1 ); }
init で複製を作っておき、表示処理にて使用します。後で説明します。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
public Page outputMain( Page from, RequestParameter req ) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 if ( from.getID() != tutorial2.base.PageType.MENU_HTML ) { // 全件の数 int data_count = User.db.size(); if ( data_count > 0 && getUserIdInput().isEmptyValue() ) { // ユーザーIDが空欄なら全件表示 getNotFoundP().setVisible( false ); getResultDiv().setVisible( true ); // 総ページ数の算出。 int page_count = (data_count + MAX_LINE - 1) / MAX_LINE; // このページの開始データ。 int start = page * MAX_LINE; // このページの終了データ。 int end = start + MAX_LINE - 1; if ( end >= data_count ) end = data_count - 1; } else { // ユーザーIDに何か入っていれば0件表示 getNotFoundP().setVisible( true ); getResultDiv().setVisible( false ); } } return this; }
遷移元がメニュー以外であれば、ユーザーID欄の内容に応じて、setVisible で表示・非表示を切り替えます。
メニューから遷移されて来れば、履歴ではなく必ず新規インスタンスが使われるはずなので、ここでは考慮しません。
また、現在のページ番号より、データの表示範囲等を求めます。
前へ ~ 次へ のリンクを作成します。SeekHtml クラスに新しくメソッドを作ります。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
/** * Aタグの生成。 * @param str 見出し。 * @param pno ページ番号。 * @return Aタグ。 */ private Tag makeA( String str, int pno ) throws PageException { Tag tag = new Tag( "a", false ); tag.setValueString( str ); String query = "page=" + Integer.toString( pno ); tag.setAttribute( createPageToURI( "href", PageType.USER_SEEK_HTML, null, query ) ); return tag; }
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
/** * ページリンク作成。 * @param tag 作成するタグ。 * @param page_count 総ページ数。 */ private void makePageLink( Tag tag, int page_count ) throws PageException { tag.removeHTMLPart(); if ( page > 0 ) { tag.addHTMLPart( makeA( "前へ", page - 1 ), new Text( " " ) ); } for ( int i = 0; i < page_count; i++ ) { String str = Integer.toString( i + 1 ); if ( i == page ) { Tag current = new Tag( "b", false ); current.addHTMLPart( new Text( str ) ); tag.addHTMLPart( current, new Text( " " ) ); } else { tag.addHTMLPart( makeA( str, i ), new Text( " " ) ); } } if ( page < ( page_count - 1) ) { tag.addHTMLPart( makeA( "次へ", page + 1 ) ); } }
outputMain に呼び出しを追加します。
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
public Page outputMain( Page from, RequestParameter req ) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 if ( from.getID() != tutorial2.base.PageType.MENU_HTML ) { // 全件の数 int data_count = User.db.size(); if ( data_count > 0 && getUserIdInput().getValueString().isEmpty() ) { // ユーザーIDが空欄なら全件表示 getNotFoundP().setVisible( false ); getResultDiv().setVisible( true ); // 総ページ数の算出。 int page_count = (data_count + MAX_LINE - 1) / MAX_LINE; // このページの開始データ。 int start = page * MAX_LINE; // このページの終了データ。 int end = start + MAX_LINE - 1; if ( end >= data_count ) end = data_count - 1; // ページリンク作成 try { makePageLink( getPageTopSpan(), page_count ); makePageLink( getPageBottomSpan(), page_count ); } catch( Exception e ) { throw new PageException( e ); } } else { // ユーザーIDに何か入っていれば0件表示 getNotFoundP().setVisible( true ); getResultDiv().setVisible( false ); } } return this; }