2007年6月11日月曜日

SimpleFormController

Form を使ったページを作成しようとして昔のソースを見て困った。
ど忘れしている、というかよく覚えていない。

protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws HttpSessionRequiredException {


command って何だっけ?
答えは config ファイルで設定していた。

<bean id="htmlEscapeFormController" class="yt.uxtool.presentation.HtmlEscapeController">
<property name="commandClass"><value>yt.uxtool.domain.HtmlEscapeEntry</value></property>
<property name="formView"><value>htmlEscapeView</value></property>
<property name="successView"><value>htmlEscapeView</value></property>
</bean>


次のメソッドもオーバーライドしているがなぜやっているのか思い出せない。

protected Object formBackingObject(HttpServletRequest request)
throws Exception {
log.debug("invoke: session[" + request.getSession(false) + "]");

request.setAttribute("htmlEscape", "true");

return super.formBackingObject(request);
}


答えは AbstractFormController の API ref にあった。onSubmit() は bind,
validate にエラーがなかった場合にのみ呼ばれる。そのため、エラーにかかわらず
リクエストプロパティをビューに渡したいときなどに formBackingObject()
でセットしてやるとよい。忘れずに super.formBackingObject() を呼ぶこと。

納得して POJO を作ってみる。int フィールドがいるのだが、validation
は自前でする必要があるのだろうか...

validator は Validator を implement して inject してやればよい。
validator, controller は Errors の参照が渡される場所ではこれに
reject* する事でエラーを登録する。

0 件のコメント: