Locked History Actions

wicket/ZipCode

郵便番号検索の方法

表題にあるとおりに郵便番号検索をしたいわけではなく、複数のコンポーネントを持つフォームの複数のサブミットボタンのうちの一つをクリックすると、その時の入力に応じて一部のフィールドだけを書き換える話である。

方法1

例えば、名前、郵便番号、住所、電話番号を必須入力とするが、郵便番号だけを入力した時点でボタンを押すと住所を自動入力してあげる。このとき、名前・電話番号はまだ空欄のままでよい。一体どうすればよいのか?html側は以下のようなものである。

 <tr><td>名前</td><td><input type="text" size="50" wicket:id="name"/></td></tr>
 <tr><td>郵便番号</td><td><input type="text" wicket:id="zipCode"/>
   <input type="submit" wicket:id="searchButton" value="郵便番号検索"/></td></tr>
 <tr><td>住所</td><td><input type="text" size="70" wicket:id="address"/></td></tr>
 <tr><td>電話</td><td><input type="text" wicket:id="phone"/></td></tr>

Java側では、電話番号の正当性をチェックし、すべてが埋められていることをチェックするバリデータを設定しているものとする。この場合、バリデータが気にいらない入力の場合は、フォームやボタンのonSubmitは決して呼び出されない。これを回避するには、郵便番号検索ボタンについてバリデータのチェックを回避設定を行う。

そして、郵便番号入力フィールドから郵便番号を取得し、住所を検索した後でそれを住所入力フィールドに設定するわけであるが、バリデータを通っていないため、郵便番号入力フィールドのモデルにはユーザ入力が到達していない。そこで、生のリクエストパラメータからこの値を取り出す。

あとは住所検索して住所フィールドに結果を設定すればよい。

      final TextField<String>zipCodeField = ... // 郵便番号入力フィールド
      final TextField<String>addressField = ... // 住所入力フィールド
      add(new Button("searchButton") { // 郵便番号検索ボタン
        @Override
        public void onSubmit() {
          // 生のリクエストパラメータからユーザの入力した郵便番号を取り出す。
          String zipCode = getRequest().getParameter(zipCodeField.getInputName());
           ....
          // 住所検索したのち、住所入力フィールドにそれを設定
          addressField.setModelValue(address);          
        }
      }.setDefaultFormProcessing(false)); // このボタンが押された場合はバリデータのチェックを回避