[Wicket-ja-user 227] FormでComponentResolverを使用したい

Back to archive index

Susumu ISHIGAMI susum****@gmail*****
2008年 9月 29日 (月) 11:20:22 JST


石上です。お世話になっています。

今開発中のもので、IComponentResolverを積極的に使用しようと考えています。

思惑としては、データベースの定義から適切な入力フォームを自動で生成するような仕組みを作りたくて、
その前段階として、次のようなクラスを作りました。

============================================

public class AutoForm extends Form implements IComponentResolver {
 〜 コンストラクタ省略〜
public boolean resolve(MarkupContainer container, MarkupStream markupStream,
ComponentTag tag) {
Component result = resolveComponent(container, markupStream, tag);
if (result == null) {
 return false;
 }
return container.autoAdd(result, markupStream);
}

// 実際に使うときはこのメソッドをChainOfResponsivilityパターンのようにする。
private static Component resolveComponent(MarkupContainer container,
MarkupStream markupStream, ComponentTag tag) {
if (tag.isAutoComponentTag()) {
return null;
}
 String tagName = tag.getName().toLowerCase();
if (tagName.equals("input")) {
String type = tag.getAttributes().getString("type").toLowerCase();
if (type.equals("text")) {
return new TextField(tag.getId());
}
} else if (Arrays.asList(new String[] {"p", "div", "td", "th", "li",
"dd"}).contains(tagName)) {
return new MultiLineLabel(tag.getId());
}
 // その他はデフォルトでラベル
return new Label(tag.getId());
}
}

============================================

HTML側の定義が<input type="text">の場合は、TextFieldを作成という感じです。
モデルに関しては、Formクラス初期化時にCompoundPropertyModelのように振る舞う自作のクラス※をセットしています。
※社内のフレームワークが独自のデータ構造を取るため仕方なく作成しました。

ところが、これが、思ったように動かきません。
・ページクラスのコンストラクタで、モデルオブジェクトに値をセットすると、テキストフィールドにその値が表示されます。
・ページでテキストボックスに入力をしてsubmitをしても、値がモデルに反映されません
・遷移先のページでは入力した値がかき消されて元の値が表示されてしまいます。
・resolverを使用しないで、手動でadd(new
TextField("HOGEHOGE")をした場合は、ちゃんと、データモデルの値に反映されます。
・return new TextField(tag.getId());の行にブレークポイントを置いてデバッグするとちゃんと到達しているようです。
(初期表示時・submit時共に)

ちなみにWicket1.3.4です。
JDKは1.4.2です。

私の力ではどうにも意味がわかりません。
どうかお力をください。
よろしくお願いします。
-------------- next part --------------
HTMLの添付ファイルを保管しました...
Download 


Wicket-ja-user メーリングリストの案内
Back to archive index