Wicket を Java8 で書くようになったせいなのか、Wicket のバリデータを書くのが嫌にになってきた。
たしかにバリデータを書いてセットして、Form の onError が call される方式は、
入力項目が少ない場合に手軽で良いと思う。でも項目が多くて Form のonSubmit と離れた場所でバリデータを書くのが読みにくくなってくる。
短いコードではないけど、以下のような書き方も魅力的だ。
queue(new TextField<String>("value", new Model<String>()));
queue(new Form("form"));
FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");
feedbackPanel.setOutputMarkupId(true);
queue(feedbackPanel);
queue(new AjaxButton("send"){
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form){
target.prependJavaScript("$('#name').removeClass('input-error');");
Optional<String> valueOptional = Optional.ofNullable(((TextField<String>)form.get("value")).getModelObject());
try{
int value = Integer.parseInt(valueOptional.orElseThrow( ()->new NullPointerException("値が未入力")));
// 数値として受信した処理を実行
}catch(NullPointerException e){
error(e.getMessage());
target.appendJavaScript("$('#name').addClass('input-error');");
}catch(Exception e){
error("数値を入れてください。");
target.appendJavaScript("$('#name').addClass('input-error');");
}finally{
target.add(feedbackPanel);
}
}
});
error(String) を実行することで FeedbackPanel にメッセージを表示する。
CSSには、以下を記述しておく。
.input-error{
background-color: #ffc7c7;
}
ul.feedbackPanel{ list-style: none; padding: 2px 2px; }
Wicket は、ulタグで FeedbackPanle を feedbackPanel クラスで書くからだ。