Wicket 7 になって驚いたのは、 Wicket 6 まで、コンポーネントをHTMLのタグの階層に合わせて、add していたのだが、
wicket:id 属性をユニークにしていれば、
queue( component ) ;
で、add の代わりになることだ。これはコードを書くスピードが速くなるし後でチェックしなくても書き下していける
この Wicket 7 に、Java 8 の Optional を使えば、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 文が沢山並ぶ場合は、こちらの方が綺麗かも。