wicketでinputを整形する

前回で触れたのですが、WicketはHTMLとJavaでWebアプリケーションを構築するフレームワークです。特徴としては、HTMLの要素(Form等)をコンポーネントという枠組みで捉えることで、オブジェクト指向チックに動的なページを作成できることだと解釈しています。

前回に引き続き、Formから入力されたメールアドレスから空白を取り除く、という作業をwicketのフレームワーク内で解決するチケットに取り組みました。JavaScriptかJavaでtrimすれば良いと考えていたのですが、結果としては getConvertedInput() というメソッドを使用しました。このメソッドは convertedInput を引っ張って来るのですが、 convertedInput は以下のように定義されています。

private transient T convertedInput;

問題は、T の振る舞いが不明なことでした。ドキュメント によると、The model object type というものらしいです。modelはwicketにおいてデータの保存場所、のような振る舞いをするようです。つまり、getConvertedInput() は convertedInput という、 convert されたデータが格納されている model を引っ張ってくるようです。

以下は推測なのですが、このconvertedInput という model は以下のような関数 setModelValue()によって定義され、定義内で使用されている convertValue() 内の trim() によって空白文字が除去されたものだと解釈しています。

public void setModelValue(String[] value) {
  this.convertedInput = convertValue(value);
  updateModel();
}
protected T convertValue(String[] value) throws ConversionException {
  return (value != null) && (value.length > 0) && (value[0] != null) ? trim(value[0])
      : null;
}

setModelValue で配列を受け取り、その配列を convert して model に戻しており、その model が convertedInput であり、getConvertedInput() というメソッドでそれが呼び出された、というふうに捉えています。問題は、ModelValue が呼ばれているタイミングがわからないのと、よく分かっていない状態で問題だけが解決したように見えることです。今後わかりしだい、更新します。

参考: http://gihyo.jp/dev/feature/01/wicket/0001