Wicket の ListView でリストの中に TextField やフォーム送信するものを配置することが時々ある。
送信後、どうやって受け取るか以前はよく悩んでたもので、getRequestCycle().getRequest().getPostParameters() から取得する力技をよく
書いてたものだ。
そんなことすると、パラメータ名を辿りながらの取得でコーディングしていて悲しくなる。
Java8 から以下の方法で取得すればリストに書いた流れで取得できるではないですか。
例えば、ListView があって
final ListView<Foo> listview = new ListView<Foo>("listview", new PropertyModel<List<Foo>>(this, "list")){ @Override protected void populateItem(ListItem<Foo> item){ // フォームフィールドの配置 item.add(new TextField<String>("name", new Model<>())); item.add(new HiddenField<String>("id", new Model<>())); // ・・・等々。。。 } }; queue(listview);
これを、AjaxButton の submit や、Form
ListView から取得するコンポーネントのイテレータ処理をラムダで書けば、、
つまり、、ListView → iterator() → java.util.Iterator の forEachRemaining(Consumer)
順序どおりの受信を簡単に取得できるではないですか。
listview.iterator().forEachRemaining(c->{ String name = ((TextField<String>)c.get("name")).getModelObject(); String id = ((HiddenField<String>)c.get("id")).getModelObject(); // 後は好きなように処理をする。。。 });