読者です 読者をやめる 読者になる 読者になる

ListView に配置した Formフィールド 受信

WicketListView でリストの中に 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 の onSubmit() で受信する時に、
ListView から取得するコンポーネントイテレータ処理をラムダで書けば、、
つまり、、ListView → iterator()java.util.IteratorforEachRemaining(Consumer)

順序どおりの受信を簡単に取得できるではないですか。

listview.iterator().forEachRemaining(c->{
    String name = ((TextField<String>)c.get("name")).getModelObject();
    String id = ((HiddenField<String>)c.get("id")).getModelObject();
    // 後は好きなように処理をする。。。
});