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

Wicket7と Java 8

Wicket 7 になって驚いたのは、 Wicket 6 まで、コンポーネントをHTMLのタグの階層に合わせて、add していたのだが、
wicket:id 属性をユニークにしていれば、

  queue( component ) ;

で、add の代わりになることだ。これはコードを書くスピードが速くなるし後でチェックしなくても書き下していける

この Wicket 7 に、Java 8Optional を使えば、Wicket6 + Java7 で書いていた以下のコードも、、

final TextField<String> nameField = TextField<String>("name", new Model<String>());
Form<Void> form = new Form<Void>("form"){
   @Override
   protected void onSubmit(){

      if (nameField.getModelObject() != null){
         // 入力された時の処理を実行する。
         logger.debug("input name = " + nameField.getModelObject() );
      }
   }
};
form.add(nameField);
add(form);


これが、、以下のように、

queue(new TextField<String>("name", new Model<String>()));
queue(new Form("form"){
   @Override
   protected void onSubmit(){

      Optional<String> nameOptional = Optional.ofNullable(*1.getModelObject());
      nameOptional.ifPresent(s->logger.debug("input name = " + s));
   }
});

------------------------------------
  Optional の ifPresent で nullでない=「入力された時に実行」Consumer 呼び出し実行が書けてしまいます。


この例は、入力フィールドが1つなのでたいしたことないですが、
10個くらいはよくあることなので、変数名割り当ての煩わしさから解放されると思います。

============
AjaxButton を使い、orElseThrow を使うなら。。。

queue(new TextField<String>("name", new Model<String>()));
queue(new Form("form"));
queue(new AjaxButton("send"){
   @Override
   protected void onSubmit(AjaxRequestTarget target, Form<?> form){
      Optional<String> nameOptional = Optional.ofNullable(*2.getModelObject());
      try{
         String name = nameOptional.orElseThrow*3;
         //
         target.appendJavaScript("$('#name').css('background-color', '#ffffff')");
      }catch(Exception e){
         target.appendJavaScript("$('#name').css('background-color', '#ffc7c7')");
      }
   }
});

try~catch 書くぐらいなら、TextFieldコンポーネントgetModelObject の結果 NULLチェックでも
いいような気がしたが、if 文が沢山並ぶ場合は、こちらの方が綺麗かも。

*1:TextField<String>)get("name"

*2:TextField<String>)form.get("name"

*3:)->new Exception("Input error"