チュートリアル7(編集入力)

入力チェックを実装します。まず、init に以下のコードを書き加えます。

tutorial2/logic/user/EditHtml.java①
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    public void init(){
        super.init();
        // モックアップHTMLの内容と異なる内容で初期化したい場合は
        // super.init()の後に変更用の処理を記述して下さい。
        // このメソッドは上記コンストラクタの中から呼ばれます。
        // インスタンス発生はバックグラウンドで非同期に処理していますので
        // HTTPリクエスト発生よりずっと過去に初期化されます。
        // このため、ユーザーのトランザクションに応じた条件分岐を設けても
        // 意図した振る舞いになりません。
 
        getErrorFont().setVisible( false );
        getUserIdInput().setTitle( "ユーザーID" );
        getNameInput().setTitle( "名前" );
        getAddressInput().setTitle( "住所" );
    }

次にinputMainにチェックルーチンを入れます。

ユーザーID
名前
性別男性  女性
住所
ユーザーIDは半角英数字にして下さい。

tutorial2/logic/user/EditHtml.java②
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:
    public Forward inputMain( RequestParameter req, Forward fw ) throws PageException {
        // fwにはモックアップと同じ遷移先が設定されています。
        // 別の遷移先としたい場合は、新しくForwardインスタンスを生成して
        // リターンして下さい。
 
        if ( getOkInput().isClicked() ) {
            try {
                Control.checkNull(
                    "が未入力です。",
                    getUserIdInput(),
                    getNameInput(),
                    getAddressInput()
                );
                Control.checkPattern(
                    "は半角英数字にして下さい。",
                    Control.CharGroup.ALNUM,
                    getUserIdInput()
                );
                String  sex = CheckBox.getRadio( getSexTags() );
                if ( sex == null ) {
                    throw new ControlException( "性別を指定して下さい。", (Control)null );
                }
            }
            catch( ControlException ce ) {
                Control ctl = ce.getControl();
                String  mes = "";
                if ( ctl != null ) {
                    mes = ctl.getTitle();
                }
                getErrorFont().setValueString( mes + ce.getMessage() );
                getErrorFont().setVisible( true );
                fw = new Forward( PageType.USER_EDIT_HTML, true, false );
            }
        }
        return fw;
    }

キャッチ節の中で、エラーメッセージの表示を行っています。
ControlException には、文章とエラー要因となったコントロールを持たせる事が可能です。
Cotorol のエラーチェックメソッドは、渡された文字列とエラーチェックに違反したコントロールを例外に持たせてスローします。
init で各コントロールにタイトルを持たせていますが、このように利用します。

続いて、エラーチェックをクリアしたら、データ更新を実施します。

tutorial2/logic/user/EditHtml.java③
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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
    public Forward inputMain( RequestParameter req, Forward fw ) throws PageException {
        // fwにはモックアップと同じ遷移先が設定されています。
        // 別の遷移先としたい場合は、新しくForwardインスタンスを生成して
        // リターンして下さい。
 
        if ( getOkInput().isClicked() ) {
            try {
                Control.checkNull(
                    "が未入力です。",
                    getUserIdInput(),
                    getNameInput(),
                    getAddressInput()
                );
                Control.checkPattern(
                    "は半角英数字にして下さい。",
                    Control.CharGroup.ALNUM,
                    getUserIdInput()
                );
                String  sex = CheckBox.getRadio( getSexTags() );
                if ( sex == null ) {
                    throw new ControlException( "性別を指定して下さい。", (Control)null );
                }
 
                User    user = getEditUser(
                    (SeekHtml)req.getHistory().getPage( PageType.USER_SEEK_HTML )
                );
                String  id = getUserIdInput().getValueString();
                String  name = getNameInput().getValueString();
                String  addr = getAddressInput().getValueString();
                if ( user == null ) {
                    user = new User( id, name, sex, addr );
                    User.db.add( user );
                }
                else {
                    user.name = name;
                    user.sex = sex;
                    user.address = addr;
                }
            }
            catch( ControlException ce ) {
                Control ctl = ce.getControl();
                String  mes = "";
                if ( ctl != null ) {
                    mes = ctl.getTitle();
                }
                getErrorFont().setValueString( mes + ce.getMessage() );
                getErrorFont().setVisible( true );
                fw = new Forward( PageType.USER_EDIT_HTML, true, false );
            }
        }
        return fw;
    }

以上でこのサイトの実装は全て済みました。

GateやDummyPageへの追記は割愛しています。
そういった意味では、まだまだ改善の余地があります。

最終更新: 2009/10/31
特に明示されていない限り、本Wikiの内容は次のライセンスに従います:CC Attribution 3.0 Unported
文書の先頭へ
SourceForge.JP
2009 © Akira Terasaki.  
Driven by DokuWiki The Apache Software Foundation