本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~

赠人玫瑰,手留余香.人生最大的乐快不在于有占什么而在于求追什么的进程.

参考文章:http://fhd001.iteye.com/blog/1131713  http://blog.sina.com.cn/s/blog_4b8677cd0100089t.html

http://www.cnblogs.com/hibernate3-example/archive/2011/10/26/2492534.html

SimpleFormController是AbstractFormController的详细现实,许允你在置配文件里通过successView和formView属性来置配功成图视(表单功成提交后要转向的页面)和表单图视(示显表单的页面);如果提交不法合(有三种可能:1.validator犯错。2.bind错误,也就是说从请求中取提参数封装到command的进程当中现出了型类转化错误,比如将一个含字母字符串转换为Integer。3.onBindAndValidate()方法犯错),则会新重返回到表单图视;如果提交法合,onSubmit()方法的认默现实会转向功成页面,当然你可以覆写该方法在转向之前充填一些你想返回的信息。
 
    SimpleFormController的任务流与AbstractFormController差不多,独一的不同是你不必自己去现实showForm()和processFormSubmission()。showForm()这个方法经已被类SimpleFormController现实了并被限定为final,你不可以在承继SimpleFormController的子类里覆写这个类。processFormSubmission()这个方法尽管可以去覆写但由于它几乎可以满意全部的要求,因此一般也不会有人去写重它。

它的处置流程是这样的:
get请求来到时,这样处置:
1) 请求传递给一个controller对象
2) 用调formBackingObject()方法,创立一个command对象的实例。
3) 用调initBinder(),册注要需的型类转换器
4) 用调showForm()方法,返回备准呈现给户用的图视 ,如果“bindOnNewForm”属性设为true,则ServletRequestDataBinder会将初始请求参数填入一个新的表单对象,并且执行onBindOnNewForm()方法。
5) 用调referenceData()方法,备准给户用示显关相的数据。如户用登录要需选择的年度信息
6) 返回formView指定的图视

对应的活动图如下:

post请求来到时,这样处置:
1) 如果sessionForm属性没有设定,则用调formBackingObject()方法,创立一个command对象的实例。否则从session中得取表单对象
2) 将请求传来的参数入写command对象,看它的源代码,会发明它是这样来做的:

ServletRequestDataBinder binder = createBinder(request, command);
binder.bind(request);

3)执行onBind()方法,在绑定数据以后,验证数据之前对表单数据停止一些自制的改修作动。 
4) 如果设置为要求验证(validateOnBinding属性被设定),则用调validator类停止数据验证
5) 用调onBindAndValidate()方法,该方法许允自定义数据绑定和验校处置
6)执行processFormSubmission()验检 Errors对象中含不含错误,如果含有错误则执行showForm()返回到填写表单页面;否则执行onSubmit()方法,停止提交表单,然后转向功成页面。
响应的活动图如下:

即:1.当表单控制器接收到GET请求时,它用调formBackingObject()方法,创立表单对象。该方法可以被子类覆盖,对于编辑操纵的表单说来,你可以通过该方法从数据库中加载表单对象,当表单页面示显时,表单示显出待编辑的数据了;

2.表单对象和页面表单数据之间要需通过属性编辑器现实向双转化,对于非基本数据型类或String型类的属性说来,你可能要需册注一些自定义编辑器。你可以通过覆盖initBinder()方法,通过用调binder.registerCustomEditor()的方法册注编辑器;

3.表单对象通过bindOnNewForm属性(可以通过置配设置,认默为false)判断是不是要需将GET请求参数绑定到formBackingObject()方法创立的表单对象中。如果bindOnNewForm为true,执行绑定操纵,在绑定成完后,还将用调onBindOnNewForm()回调方法(子类可以供提详细现实)。否则到下一步。不过一般情况下,GET请求参数是于用加载等编辑表单对象的ID值,如topicId、forumId等,一般无需停止绑定;

4.用调referenceData()方法(子类可供提详细现实)备准一些关联的数据,如性别下拉框数据,学历下拉框数据等。一般采取ModelMap创立图视务业中要需用到的请求属性数据,键为属性名,值为属性值,如ModelMap("param1", "paramValue1");

5.应用控制器formView定义的图视染渲表单对象;

6.户用填写或变动表单后,提交表单,向表单控制器起发一个POST请求;

7.接收到POST请求时,表单控制器晓得这是一个表单数据提交的操纵,所以启动表单提交处置流程;

8.首先通过sessionForm属性判断表单控制器是不是启用了Session。如果启用了Session,直接从Session中掏出原表单对象,否则再次用调formBackingObject()方法构造出一个表单对象。sessionForm认默为false,可以通过置配停止整调,启用Session可能高提运行能性,但会占用定一的内存;

9.将POST请求参数充填到表单对象中;

10.用调onBind()方法,该方法许允你在表单充填成完后,法合性验校之前执行一些特定的操纵;

11.如果validateOnBinding属性设置为true,册注在控制器中的验校器开始任务,对表单对象的属性值执行法合性验校。如果有法合性错误,将被册注到Errors对象中(关于如何册注验校器,我们将稍后分析);

12.用调onBindAndValidate()方法,该方法许允你在数据绑定及法合性验校后,执行一些额定的自定义操纵,你也可以在这里,执行一些额定的法合性验校;

13.用调processFormSubmission()方法处置提交任务,该方法部内又包括后续几步任务;

14.判断方法入参传入errors是不是包括错误,如果包括错误返回到formView对应的表单页面中,否则到下一步;

15.通过isFormChangeRequest()方法(认默为false)判断请求是不是为表单变动请求,如果为true,用调onFormChange()方法,然后返回到formView对应的表单页面,否则到下一步;

16.如果子类覆盖了onSubmit()方法,执行之,否则执行子类的doSubmitAction()方法。通过这两者之一成完务业的处置,然后返回successView属性指定的功成页面。

每日一道理
无知者为梦想中的虚幻而苦苦等待,换回的不是所求的,而是岁月在脸上留下的印痕,一事无成的人一生便是虚度。生活中,与其花时间去等待,不如加快步伐去追寻理想,试着与时间赛跑,也许身躯、心理会感到劳累,但这样的生活毕竟是充实的。

在web应用程序中,经常要处置表单。表单控制器既要为户用示显表单,又要处置表单提交。表单处置多是件非常复杂且满充变数的任务。如果从头开始构建表单控制器,会牵涉到太多的表单处置细节。

Spring MVC供提的SimpleFormController类定义了基本的表单处置流程。它支撑令命对象的观点,并且可以将表单域的值绑定到令命对象的同名属性上。通过扩展SimpleFormController类,控制器以可就承继处置表单的能力。

当HTTP GET请求SimpleFormController示显表单时, 它会将表单图视呈现给户用。当HTTP POST请求提交该表单时,SimpleFormController就会将表单域的值绑定到令命对象上,并用调onSubmit()方法,以这类式方来处置表单提交。如果表单处置功成,会呈现success图视。否则,呈现带错误信息的表单图视。

为了应适不同的表单需求,SimpleFormController许允你覆盖其中的生命周期方法,以此定制表单处置流程。

创立表单控制器

通过扩展SimpleFormController类,可为以这个控制器指定令命类(在本例中是Reservation),然后表单域的值将被绑定到令命对象的同名属性中。你还可以指定图视要问访的令命对象的名称(在本例中是reservation),但这是可选的,认默名称为command。

package com.sunshine.controller;import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.validation.BindException;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;import com.sunshine.pojo.UserModel;public class RegisterController extends SimpleFormController {/*** 可以通过依赖注入 注入令命现实类 ,也可以在类的构造方法中应用父类的方法 setCommandClass(Class) public* LoginCommandController(){ setCommandClass(UserModel.class); }*/@Overrideprotected Object formBackingObject(HttpServletRequest request)throws Exception {UserModel user = new UserModel();user.setName("请输入户用名");return user;}@Overrideprotected Map<String, Object> referenceData(HttpServletRequest request)throws Exception {Map<String, Object> map = new HashMap<String, Object>();map.put("cityList", Arrays.asList("山东", "北京", "上海"));return map;}/** @Override protected void doSubmitAction(Object command) throws Exception* { UserModel userModel = (UserModel) command;* System.out.println(userModel); }*/@Overrideprotected ModelAndView onSubmit(Object command, BindException errors)throws Exception {System.out.println("RegisterController.onSubmit()");UserModel userModel = (UserModel) command;ModelAndView modelAndView = new ModelAndView();modelAndView.setViewName(getSuccessView());modelAndView.addObject("user", userModel);return modelAndView;}protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {System.out.println("RegisterController.initBinder()");binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
//      binder.registerCustomEditor(Date.class,"birthday", new DateEditor());}/*@Overrideprotected void onBind(HttpServletRequest request, Object command)throws Exception {// TODO Auto-generated method stubsuper.onBind(request, command);System.out.println("RegisterController.onBind()");}*/}

由于表单域的值都是作为字符串提交的,为了将这些绑定到令命对象上,表单控制器可能要需停止型类转换。型类转换现实是由册注在这个控制器中的属性编辑器来执行的。Spring先预册注了几个属性编辑器,用来转换大家熟知的数据型类,如数字型类和尔布型类。你必须为其他的数据型类册注定制的编辑器,,如java.util.Date。定制的属性编辑器都被册注到initBinder()方法的ServletRequestDataBinder参数中。在绑定表单域值时如果产生任何错误,SimpleFormController会动自呈现带有错误信息的表单图视。如果一切顺利,则会用调onSubmit()方法来处置表单提交。在onSubmit()方法中,可以通过参数获得绑定了表单域值的令命对象。对于这个控制器而言,它是个Reservation对象,因为你将令命类设置为Reservation。onSubmit()方法的三个变体可供覆盖。为了问访符合你要需的方法参数,该应覆盖它们中最简略的那个。

protected ModelAndView onSubmit(Object command)throws Exception;
protected ModelAndView onSubmit(Object command,BindException errors)throws Exception;
protected ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors)throws Exception;

在覆盖onSubmit()方法时,必须返回ModelAndView对象。如果只要在令命对象上执行一个作动,并在这个作动成完时返回功成图视,可以覆盖doSubmitAction()方法,它的返回型类为void,认默呈现功成图视。

在声明这个控制器时,为了停止预订,还要需一个指向服务层中的reservationService Bean的用引。此外,还必须为这个表单控制器设置表单图视和功成图视,分别是formView和successView属性。

<bean id="registerController" class="com.sunshine.controller.RegisterController"><!-- 可以通过依赖注入 注入令命现实类 ,也可以在类的构造方法中应用父类的方法setCommandClass(Class)--> <property name="commandClass" value="com.sunshine.pojo.UserModel"/><property name="commandName" value="user"></property><property name="formView" value="register"></property><property name="successView" value="success"></property></bean>

文章结束给大家分享下程序员的一些笑话语录: 关于编程语言
如果 C++是一把锤子的话,那么编程就会变成大手指头。
如果你找了一百万只猴子来敲打一百万个键盘,那么会有一只猴子会敲出一 段 Java 程序,而其余的只会敲出 Perl 程序。
一阵急促的敲门声,“谁啊!”,过了 5 分钟,门外传来“Java”。
如果说 Java 很不错是因为它可以运行在所有的操作系统上,那么就可以说 肛交很不错,因为其可以使用于所有的性别上。

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/05/3061618.html

方法对象Spring MVC SimpleFormController相关推荐

  1. java的人patch方法_java – Spring MVC PATCH方法:部分更新

    我有一个项目,我使用Spring MVC Jackson构建REST服务.让我们说我有以下java实体 public class MyEntity { private Integer id; priv ...

  2. 在Spring MVC中处理域对象

    最近,我惊讶于一个代码库在其所有域实体中都具有公共默认构造函数(即零参数构造函数),并且所有字段都具有getter和setter. 当我深入研究时,我发现域实体之所以如此,主要是因为该团队认为Web ...

  3. Spring MVC对象转换说明

    在Spring MVC之前我们需要在Servlet里处理HttpServletRequest参数对象,但这个对象里的属性都是通用类型的对象(如字符串),处理起来很繁琐并且容易出错,而Spring MV ...

  4. Spring 2.5 基于注解驱动的 Spring MVC

    基于注解的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,为 Spring MVC 提供了完全基于注解的配置.本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如 ...

  5. 使用 Spring 2.5 基于注解驱动的 Spring MVC(二)

    我们在 ② 处添加了一个 ModelMap 属性,其属性名为 currUser,而 ① 处通过 @SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 ...

  6. 【转载】spring mvc 使用session

    http://home.51.com/gaoyangboy/diary/item/10036382.html Spring2.5 访问 Session 属性的四种策略 Posted on 2008-1 ...

  7. 编写 Spring MVC 控制器的 14 个技巧

    欢迎关注方志朋的博客,回复"666"获面试宝典 通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户 ...

  8. 14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 译文:blog.csdn.net/Summer_Lyf/a ...

  9. 分享 14 个 Spring MVC 顶级技巧!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 通常,在Spring MVC中,我们编写一个控制器类来处理来自客户 ...

最新文章

  1. LDD3源码分析之ioctl操作 .
  2. 全国计算机等级考试题库二级C操作题100套(第60套)
  3. 用.NET模拟天体运动
  4. iOS用workspace和cocoapods管理多个项目
  5. Elasticsearch分布式机制探究
  6. 【Elasticsearch】Elasticsearch的IndexSorting:一种查询性能优化利器
  7. PHP编写增功能思路,php ztree如何实现增 删 改
  8. 金蝶云php webapi,K/3 Cloud Web API销售出库单PHP完整示例【分享】
  9. [Noi2010]航空管制
  10. 2021 Hexo+Next7最全搭建个人网站(合集)
  11. PMP备考之路 - 汪博士第十二章(项目采购管理)
  12. 车辆搜索 -使用triplet loss 训练车辆识别模型
  13. Oracle实现递归查询
  14. 当我们聊策略的时候,我们在聊什么?策略 Strategy。
  15. 一场云端的“神仙打架”:BAT加华为的影响未来之争
  16. php获取客户端真实ip
  17. 四川麻将必胜攻略笔记(入门篇1)
  18. (38)Shell脚本【字符串运算:相等判断】
  19. ko 绑定html,WeX5的正确打开方式(3)——绑定机制
  20. 使用计算机帮助各类设计人员,关于应用计算机辅助艺术设计的探讨

热门文章

  1. CSS浏览器兼容性的4个解决方案:浏览器CSS样式初始化、浏览器私有属性,CSS hack语法和自动化插件...
  2. Excel 求差集和并集
  3. Spring mvc 中 DispatcherServlet 的学习和理解
  4. 【CodeForces】947 D. Picking Strings
  5. 【云和恩墨大讲堂】从执行计划洞察ORACLE优化器的“小聪明”
  6. “霸王级”寒潮来袭 通信业紧急部署确保网络安全
  7. Python实现用户登录
  8. 如何安装CocoaPods,以便在Xcode中快速添加第三方库
  9. java spring orm jbpm_spring整合jbpm4
  10. sd卡测速工具_怎样恢复SD卡数据?教你两招轻松恢复