郑玄对应劭翻译:SimpleFormController 工作流

来源:百度文库 编辑:九乡新闻网 时间:2024/05/05 19:29:20
由于SimpleFormController是继承 AbstractFormController,在该AbstractFormController中的handleRequestInternal方法 需要判断当前提交的方法是Get还是Post,如果是Get则是New一个View,如果是Post则是运行客户端业务逻辑,然后跳转到成功页面。
通过Get 方式请求一个View
1、Controller受到一个Get请求;
2、formBackingObject()方法,如果需要读取数据库,这里是一个比较好的地 方去做这件事情。然后将Object通过request.setAttribute来传递到页面;如果页面表单需要绑定多个Object,可以在这里读取 数据库取得,然后设置到页面上。
3、initBinder() 这里是用来进行数据格式化转换的;如果在页面上显示某些类型需要进行格式化显示,那么需要在XXXXFormController中重载该方法,指定特定 的转换器完成对特定Object的设置。如对于日期格式需要在本方法中增加如下代码:
binder.registerCustomEditor(Date.class, null, new CustomDateEditor(
new SimpleDateFormat("MM/dd/yyyy"),true));
4、调用 AbstractFormController.handleRequestInternal方法,在该方法中判断,如果是新建一个Form View,则调用ShowNewForm方法,在ShowNewForm方法中调用了ShowForm方法,SimpleFormController实 现了此方法,指向的url是Controller中注册的formView参数。
6、View 模块完成,显示给用户。由于SimpleFormController是继承 AbstractFormController,在该AbstractFormController中的handleRequestInternal方法 需要判断当前提交的方法是Get还是Post,如果是Get则是New一个View,如果是Post则是运行客户端业务逻辑,然后跳转到成功页面。 通过Get 方式请求一个View1、Controller受到一个Get请求;2、formBackingObject()方法,如果需要读取数据库,这里是一个比较好的地 方去做这件事情。然后将Object通过request.setAttribute来传递到页面;如果页面表单需要绑定多个Object,可以在这里读取 数据库取得,然后设置到页面上。3、initBinder() 这里是用来进行数据格式化转换的;如果在页面上显示某些类型需要进行格式化显示,那么需要在XXXXFormController中重载该方法,指定特定 的转换器完成对特定Object的设置。如对于日期格式需要在本方法中增加如下代码:binder.registerCustomEditor(Date.class, null, new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"),true));4、调用 AbstractFormController.handleRequestInternal方法,在该方法中判断,如果是新建一个Form View,则调用ShowNewForm方法,在ShowNewForm方法中调用了ShowForm方法,SimpleFormController实 现了此方法,指向的url是Controller中注册的formView参数。6、View 模块完成,显示给用户。
通过Post方式提交一个Form
1、  提交后根据Action指向的URL在urlMapping配置中找到指定的Controller;
2、  如果配置了Validator则使用该Validator(见applicationContext-validation.xml)进行相关的验证;缺 省是beanValidator。错误信息写入到errors参数里。
3、  调用AbstractFormController.handleRequestInternal方法,在该方法中判断是通过Post来调用此方法,则调 用processFormSubmission方法,该方法会先判断errors中是否有验证错误,如果有则返回到原表单页面,显示错误信息。
4、  验证通过后进入onSubmit方法,该方法的command参数对应绑定到页面的对象,
如果在表单中有多个对象需要进行绑定,那么其它对象可以通过 this.bindAndValidate(HttpServletRequest request, Object command);方法来进行绑定。
5、  做相关的业务操作。
6、  往返回界面上输出结果提示信息,通过getText和saveMessage()方法完成。getText()第一个参数是在资源文件中的信息代码,第二 个参数是发给该信息的参数,在该信息中通过{0}来读取,第三个参数是当前使用的Locale。saveMessage()的信息显示是通过 common\messages.jsp来进行。
7、  返回一个ModelAndView(new RedirectView(success)),success对应action-servlet.xml文件该Controller所配置 successView,跳转路径是相对路径。
而对于MultiActionController来说,要么继承这个类,要么给它设个 delegate,注意不能类中出现方法多态。相对简单一些
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SimpleFormController 流程 引用
SimpleFormController往 上继承自AbstractFormController,而又继承自AbstractController,
这是开始实作Controller介 面的基底类別,再往上的两个类別各司WebApplicationContext与Http response的资源。
对于简单的表单需求,我们通常透过继承SimpleFormController, 并复写其onSumit()方法来完成表单功能,
而实际上真正的表单处理流程定义在AbstractFormController
这边说明三个我觉得比較常用且不复杂的方法,在继承了SimpleFormController(AbstractFormController) 之后,
您可以覆写这些方法:formBackingObject()、referenceData()、 onBindAndValidate()。
当浏览器使用GET方法向Action发出请求时,会调用formBackingObject()方 法,您可以在这个方法中预先设定好表单物件,在表单网页中就会显示表单的预设值,例如:
java 代码
protected Object formBackingObject(HttpServletRequest request) throws Exception {
LoginForm loginForm = new LoginForm();
loginForm.setUsername("guest");
loginForm.setPassword("guest");
return loginForm;
}
在使用者送出资料之后,如果sessionForm为false,则会再呼叫 formBackingObject()方法取得表单物件,若sessionForm设定为true,则会试着有session中找寻表单物件。
您可以在referenceData()中定义一些JSP页面可以参考到的参数,例如:
ava 代码
protected Map referenceData(HttpServletRequest request) throws Exception {
Map ref = new HashMap();
ref.put("defalutUser", "guest");
return ref;
}
onBindAndValidate()就如其名所示,当表单物件的资料已经绑定,并且还没开始验证之前, 您可以试着在这个方法中作一些预处理,例如进行字母大小写转换,附带一些額外的资讯等等:
java 代码
protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors) throws Exception {
}
url请求来到时,这样处理:
a) 请求传递给一个controller对象
b) 调用formBackingObject()方法,创建一个command对象的实例。
c) 调用initBinder(),注册需要的类型转换器
d) 调用showForm()方法,返回准备呈现给用户的视图
e) 调用referenceData()方法,准备给用户显示相关的数据。如用户登录需要选择的年度信息
f) 返回formView指定的视图
表单请求来到时,这样处理:
a) 调用formBackingObject()方法,创建一个command对象的实例。
b) 将请求传来的参数写入command对象
c) 如果设置为要求验证,则调用validator类进行数据验证
d) 调用onBindAndValidate()方法,该方法允许自定义数据绑定和校验处理
e) 调用onSubmit()方法,进行业务逻辑处理