后端控制器之CommondController、 FormController(一)
来源:互联网 发布:codol武器大全数据 编辑:程序博客网 时间:2024/05/04 14:36
以注册过程为例,我们可能会选择继承AbstractController来实现表单的显示,
继承AbstractCommandController来实现表单的处理 ,这样是可行的,但必须要维护两个控制器。在这种情况下,我们应该使用SimpleFormController,他接受GET请求时显示表单,接受POST请求时处理表单;如果发生错误,控制器会知道重新显示这个表单,这样用户就可以修改错误,重新提交。
创建表单控制器
在web应用程序中,经常要处理表单。表单控制器既要为用户显示表单,又要处理表单提交。表单处理可能是件非常复杂且充满变数的任务。如果从头开始构建表单控制器,会牵涉到太多的表单处理细节。
Spring MVC提供的SimpleFormController类定义了基本的表单处理流程。它支持命令对象的概念,并且可以将表单域的值绑定到命令对象的同名属性上。通过扩展SimpleFormController类,控制器就可以继承处理表单的能力。
当HTTP GET请求SimpleFormController显示表单时, 它会将表单视图呈现给用户。当HTTP POST请求提交该表单时,SimpleFormController就会将表单域的值绑定到命令对象上,并调用onSubmit()方法,以这种方式来处理表单提交。如果表单处理成功,会呈现success视图。否则,呈现带错误信息的表单视图。
为了适应不同的表单需求,SimpleFormController允许你覆盖其中的生命周期方法,以此定制表单处理流程。
创建表单控制器
通过扩展SimpleFormController类,可以为这个控制器指定命令类(在本例中是User),然后表单域的值将被绑定到命令对象的同名属性中。你还可以指定视图要访问的命令对象的名称(在本例中是user),但这是可选的,默认名称为command。
- <span>package com.wy.controller;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- 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.mvc.SimpleFormController;
- import com.wy.pojo.User;
- /**
- * 封装表单参数的后端控制类
- *
- * 如果只需在命令对象上执行一个动作,并在这个动作完成时返回成功视图,
- * 可以覆盖doSubmitAction()方法,它的返回类型为void,默认呈现成功视图。
- *
- * @author Administrator
- * @version 2011-10-5
- */
- public class RegistrationControllerextends SimpleFormController{
- /**
- * @param registrationController
- */
- @SuppressWarnings("deprecation")
- public RegistrationController(){
- setCommandClass(User.class);//为控制器类指定命名类
- setCommandName("user"); //指定视图要访问的命名类对象的名称
- }
- protected Object formBackingObject(HttpServletRequest request)throws Exception{
- System.out.println("formBackingObject方法执行-->01");
- return super.formBackingObject(request);
- }
- /**
- * 由于表单域的值都是作为字符串提交的,为了将这些绑定到命令对象上,表单控制器可能需要进行类型转换。
- * 类型转换实际是由注册在这个控制器中的属性编辑器来执行的。
- * Spring预先注册了几个属性编辑器,用来转换大家熟知的数据类型,如数字类型和布尔类型。
- * 你必须为其他的数据类型注册定制的编辑器,,如java.util.Date。
- * 定制的属性编辑器都被注册到initBinder()方法的ServletRequestDataBinder参数中。
- * 在绑定表单域值时如果发生任何错误,SimpleFormController会自动呈现带有错误信息的表单视图。
- */
- protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)throws Exception{
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- dateFormat.setLenient(false);
- binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat, true));
- System.out.println("initBinder方法执行-->02");
- }
- protected void onBind(HttpServletRequest request, Object command)throws Exception{
- System.out.println("onBind方法执行-->03");
- }
- protected void onBindAndValidate(HttpServletRequest request, Object command, BindException errors)throws Exception
- {
- System.out.println("onBindAndValidate方法执行-->04");
- }
- @Override
- protected void doSubmitAction(Object command)throws Exception{
- User user = (User)command;
- System.out.println("doSubmitAction方法执行-->05");
- //拿到封装的表单对象,可以和数据库操作
- System.out.println("======SimpleFormController");
- //默认呈现成功视图
- }
- }
- </span>
由于表单域的值都是作为字符串提交的,为了将这些绑定到命令对象上,表单控制器可能需要进行类型转换。类型转换实际是由注册在这个控制器中的属性编辑器来执行的。Spring预先注册了几个属性编辑器,用来转换大家熟知的数据类型,如数字类型和布尔类型。你必须为其他的数据类型注册定制的编辑器,如java.util.Date。定制的属性编辑器都被注册到initBinder()方法的ServletRequestDataBinder参数中。
在绑定表单域值时如果发生任何错误,SimpleFormController会自动呈现带有错误信息的表单视图。如果一切顺利,则会
调用onSubmit()方法来处理表单提交。在 onSubmit()方法中,可以通过参数获取绑定了表单域值的命令对象。对于这个控制器而言,它是个User对象,因为你将命令类设置为 User。
onSubmit()方法的三个变体可供覆盖。为了访问符合你需要的方法参数,应该覆盖它们中最简单的那个。
- <span>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;</span>
在覆盖onSubmit()方法时,必须返回ModelAndView对象。如果只需在命令对象上执行一个动作,并在这个动作完成时返回成功视图,可以覆盖doSubmitAction()方法,它的返回类型为void,默认呈现成功视图。
在声明这个控制器时,为了进行预订,还需要一个指向服务层中的reservationService Bean的引用。此外,还必须为这个表单控制器设置表单视图和成功视图,分别是formView和successView属性。
- <?xml version="1.0"encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="simpleUrlMapping"
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <propertyname="mappings">
- <props>
- <propkey="/register.do">registrationController</prop>
- </props>
- </property>
- </bean>
- <!-- 映射处理器 -->
- <bean id="registrationController"
- class="com.wy.controller.RegistrationController">
- <propertyname="formView"value="login"/>
- <propertyname="successView"value="list"/>
- </bean>
- <!-- 视图解析器 -->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <propertyname="prefix"value="/WEB-INF/page/"/>
- <propertyname="suffix"value=".jsp"/>
- </bean>
- </beans>
- 后端控制器之CommondController、 FormController(一)
- 后端控制器之CommondController、 FormController(二)
- 后端控制器之CommandController、 FormController(三)
- FormController控制器的使用
- 后端控制器之MultiActionController
- Spring MVC(五)封装表单参数的控制器(FormController)
- spring mvc基础篇(三):后端控制器之SimpleFormController
- spring mvc基础篇(四):后端控制器之MultiActionController
- 后端开发实践之路(一)--概要
- springMVC-后端控制器
- ThinkPHP 控制器(一)
- spring-mvc入门(二):后端控制器(上)
- spring-mvc入门(二):后端控制器(下)
- 前后端分离(一)
- 跟我学Kafka之Controller控制器详解(一)
- Jmeter之二:逻辑控制器学习(一)
- Struts2 入门(一) 之 控制器与执行步骤
- Oculus学习笔记之控制器输入初步(一)
- java 基础5 抽象类 接口 final
- new/delete和malloc/free的使用场合和区别
- 后端控制器之MultiActionController
- 深度优先算法和广度优先算法
- 游戏中自动寻路通用算法
- 后端控制器之CommondController、 FormController(一)
- 几种常见容器的比较:vector,map,hashmap,list,set
- 后端控制器之CommondController、 FormController(二)
- LeetCode 题解(24): Subsets II
- STL中的map和hashmap数据结构
- 常用的排序算法
- 线程和进程
- What are the __init* and __exit* macros ?
- 游戏开发中内存泄露的一些防范措施