4.5、ServletForwardingController

将接收到的请求转发到一个命名的servlet,具体示例如下:

java代码:

Java代码 
  1. package cn.javass.chapter4.web.servlet;
  2. public class ForwardingServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  5. throws ServletException, IOException {
  6. resp.getWriter().write("Controller forward to Servlet");
  7. }
  8. }
java代码:

Java代码 
  1. <servlet>
  2. <servlet-name>forwarding</servlet-name>
  3. <servlet-class>cn.javass.chapter4.web.servlet.ForwardingServlet</servlet-class>
  4. </servlet>
java代码:

Java代码 
  1. <!— 在chapter4-servlet.xml配置处理器 -->
  2. <bean name="/forwardToServlet"
  3. class="org.springframework.web.servlet.mvc.ServletForwardingController">
  4. <property name="servletName" value="forwarding"></property>
  5. </bean>

当我们请求/forwardToServlet时,会被转发到名字为“forwarding”的servlet处理,该sevlet的servlet-mapping标签配置是可选的。

4.6、BaseCommandController

命令控制器通用基类,提供了以下功能支持:

1、数据绑定:请求参数绑定到一个command object(命令对象,非GoF里的命令设计模式),这里的命令对象是指绑定请求参数的任何POJO对象;

commandClass:表示命令对象实现类,如UserModel;

commandName:表示放入请求的命令对象名字(默认command),request.setAttribute(commandName, commandObject);

2、验证功能:提供Validator注册功能,注册的验证器会验证命令对象属性数据是否合法;

validators:通过该属性注入验证器,验证器用来验证命令对象属性是否合法;

该抽象类没有没有提供流程功能,只是提供了一些公共的功能,实际使用时需要使用它的子类。

4.7、AbstractCommandController

命令控制器之一,可以实现该控制器来创建命令控制器,该控制器能把自动封装请求参数到一个命令对象,而且提供了验证功能。

1、创建命令类(就是普通的JavaBean类/POJO)

java代码:

Java代码 
  1. package cn.javass.chapter4.model;
  2. public class UserModel {
  3. private String username;
  4. private String password;
  5. //省略setter/getter
  6. }

2、实现控制器

java代码:

Java代码 
  1. package cn.javass.chapter4.web.controller;
  2. //省略import
  3. public class MyAbstractCommandController extendsAbstractCommandController {
  4. public MyAbstractCommandController() {
  5. //设置命令对象实现类
  6. setCommandClass(UserModel.class);
  7. }
  8. @Override
  9. protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {
  10. //将命令对象转换为实际类型
  11. UserModel user = (UserModel) command;
  12. ModelAndView mv = new ModelAndView();
  13. mv.setViewName("abstractCommand");
  14. mv.addObject("user", user);
  15. return mv;
  16. }
  17. }
java代码:

Java代码 
  1. <!— 在chapter4-servlet.xml配置处理器 -->
  2. <bean name="/abstractCommand"
  3. class="cn.javass.chapter4.web.controller.MyAbstractCommandController">
  4. <!-- 也可以通过依赖注入 注入命令实现类 -->
  5. <!-- property name="commandClass"value="cn.javass.chapter4.model.UserModel"/-->
  6. </bean>
java代码:

Java代码 
  1. <!— WEB-INF/jsp/abstractCommand.jsp视图下的主要内容 -->
  2. ${user.username }-${user.password }

当我们在浏览器中输入“http://localhost:9080/springmvc-chapter4/abstractCommand?username=123&password=123”,会自动将请求参数username和password绑定到命令对象;绑定时按照JavaBean命名规范绑定;

4.8、AbstractFormController

用于支持带步骤的表单提交的命令控制器基类,使用该控制器可以完成:

1、定义表单处理(表单的渲染),并从控制器获取命令对象构建表单;

2、提交表单处理,当用户提交表单内容后,AbstractFormController可以将用户请求的数据绑定到命令对象,并可以验证表单内容、对命令对象进行处理。

java代码:

Java代码 
  1. @Override
  2. rotected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
  3. throws Exception {
  4. //1、是否是表单提交? 该方法实现为("POST".equals(request.getMethod())),即POST表示表单提交
  5. if (isFormSubmission(request)) {
  6. try {
  7. Object command = getCommand(request);
  8. ServletRequestDataBinder binder = bindAndValidate(request, command);
  9. BindException errors = new BindException(binder.getBindingResult());
  10. //表单提交应该放到该方法实现
  11. return processFormSubmission(request, response, command, errors);
  12. }
  13. catch (HttpSessionRequiredException ex) {
  14. //省略部分代码
  15. return handleInvalidSubmit(request, response);
  16. }
  17. }
  18. else {
  19. //2、表示是表单展示,该方法又转调showForm方法,因此我们需要覆盖showForm来完成表单展示
  20. return showNewForm(request, response);
  21. }

bindOnNewForm:是否在进行表单展示时绑定请求参数到表单对象,默认false,不绑定;

sessionForm:session表单模式,如果开启(true)则会将表单对象放置到session中,从而可以跨越多次请求保证数据不丢失(多步骤表单常使用该方式,详解AbstractWizardFormController),默认false;

Object formBackingObject(HttpServletRequest request) :提供给表单展示时使用的表单对象(form object表单要展示的默认数据),默认通过commandName暴露到请求给展示表单;

Map referenceData(HttpServletRequest request, Object command, Errors errors):展示表单时需要的一些引用数据(比如用户注册,可能需要选择工作地点,这些数据可以通过该方法提供),如:

java代码:

Java代码 
  1. protected Map referenceData(HttpServletRequest request) throws Exception {
  2. Map model = new HashMap();
  3. model.put("cityList", cityList);
  4. return model;
  5. }

这样就可以在表单展示页面获取cityList数据。

SimpleFormController继承该类,而且提供了更简单的表单流程控制。

4.9、SimpleFormController

提供了更好的两步表单支持:

1、准备要展示的数据,并到表单展示页面;

2、提交数据数据进行处理。

第一步,展示:

第二步,提交表单:

接下来咱们写一个用户注册的例子学习一下:

(1、控制器

java代码:

Java代码 
  1. package cn.javass.chapter4.web.controller;
  2. //省略import
  3. public class RegisterSimpleFormController extends SimpleFormController {
  4. public RegisterSimpleFormController() {
  5. setCommandClass(UserModel.class); //设置命令对象实现类
  6. setCommandName("user");//设置命令对象的名字
  7. }
  8. //form object 表单对象,提供展示表单时的表单数据(使用commandName放入请求)
  9. protected Object formBackingObject(HttpServletRequest request) throwsException {
  10. UserModel user = new UserModel();
  11. user.setUsername("请输入用户名");
  12. return user;
  13. }
  14. //提供展示表单时需要的一些其他数据
  15. protected Map referenceData(HttpServletRequest request) throws Exception {
  16. Map map = new HashMap();
  17. map.put("cityList", Arrays.asList("山东", "北京", "上海"));
  18. return map;
  19. }
  20. protected void doSubmitAction(Object command) throws Exception {
  21. UserModel user = (UserModel) command;
  22. //TODO 调用业务对象处理
  23. System.out.println(user);
  24. }
  25. }

setCommandClass和setCommandName:分别设置了命令对象的实现类和名字;

formBackingObject和referenceData:提供了表单展示需要的视图;

doSubmitAction:用于执行表单提交动作,由onSubmit方法调用,如果不需要请求/响应对象或进行数据验证,可以直接使用doSubmitAction方法进行功能处理。

(2、spring配置(chapter4-servlet.xml)

java代码:

Java代码 
  1. <bean name="/simpleForm"
  2. class="cn.javass.chapter4.web.controller.RegisterSimpleFormController">
  3. <property name="formView" value="register"/>
  4. <property name="successView" value="redirect:/success"/>
  5. </bean>
  6. <bean name="/success"class="cn.javass.chapter4.web.controller.SuccessController"/>

formView:表示展示表单时显示的页面;

successView:表示处理成功时显示的页面;“redirect:/success”表示成功处理后重定向到/success控制器;防止表单重复提交;

“/success” bean的作用是显示成功页面,此处就不列举了。

(3、视图页面

java代码:

Java代码 
  1. <!-- register.jsp 注册展示页面-->
  2. <form method="post">
  3. username:<input type="text" name="username" value="${user.username}"><br/>
  4. password:<input type="password" name="username"><br/>
  5. city:<select>
  6. <c:forEach items="${cityList }" var="city">
  7. <option>${city}</option>
  8. </c:forEach>
  9. </select><br/>
  10. <input type="submit" value="注册"/>
  11. </form>

此处可以使用${user.username}获取到formBackingObject设置的表单对象、使用${cityList}获取referenceData设置的表单支持数据;

到此一个简单的两步表单到此结束,但这个表单有重复提交表单的问题,而且表单对象到页面的绑定是通过手工绑定的,后边我们会学习spring标签库(提供自动绑定表单对象到页面)。

4.10、CancellableFormController

一个可取消的表单控制器,继承SimpleFormController,额外提供取消表单功能。

1、表单展示:和SimpleFormController一样;

2、表单取消:和SimpleFormController一样;

3、表单成功提交:取消功能处理方法为:onCancel(Object command),而且默认返回cancelView属性指定的逻辑视图名。

那如何判断是取消呢?如果请求中有参数名为“_cancel”的参数,则表示表单取消。也可以通过cancelParamKey来修改参数名(如“_cancel.x”等)。

示例:

(1、控制器

复制RegisterSimpleFormController一份命名为CanCancelRegisterSimpleFormController,添加取消功能处理方法实现:

java代码:

Java代码 
  1. @Override
  2. protected ModelAndView onCancel(Object command) throws Exception {
  3. UserModel user = (UserModel) command;
  4. //TODO 调用业务对象处理
  5. System.out.println(user);
  6. return super.onCancel(command);
  7. }

onCancel:在该功能方法内实现取消逻辑,父类的onCancel方法默认返回cancelView属性指定的逻辑视图名。

(2、spring配置(chapter4-servlet.xml)

java代码:

Java代码 
  1. <bean name="/canCancelForm"
  2. class="cn.javass.chapter4.web.controller.CanCancelRegisterSimpleFormController">
  3. <property name="formView" value="register"/>
  4. <property name="successView" value="redirect:/success"/>
  5. <property name="cancelView" value="redirect:/cancel"/>
  6. </bean>
  7. <bean name="/cancel"class="cn.javass.chapter4.web.controller.CancelController"/>

cancelParamKey:用于判断是否是取消的请求参数名,默认是_cancel,即如果请求参数数据中含有名字_cancel则表示是取消,将调用onCancel功能处理方法;

cancelView:表示取消时时显示的页面;“redirect:/cancel”表示成功处理后重定向到/cancel控制器;防止表单重复提交;

“/cancel” bean的作用是显示取消页面,此处就不列举了(详见代码)。

(3、视图页面(修改register.jsp)

java代码:

Java代码 
  1. <input type="submit" name="_cancel" value="取消"/>

该提交按钮的作用是取消,因为name="_cancel",即请求后会有一个名字为_cancel的参数,因此会执行onCancel功能处理方法。

(4、测试:

在浏览器输入“http://localhost:9080/springmvc-chapter4/canCancelForm”,则首先到展示视图页面,点击“取消按钮”将重定向到“http://localhost:9080/springmvc-chapter4/cancel”,说明取消成功了。

实际项目可能会出现比如一些网站的完善个人资料都是多个页面(即多步),那应该怎么实现呢?接下来让我们看一下spring Web MVC提供的对多步表单的支持类AbstractWizardFormController。

Controller接口控制器(2)相关推荐

  1. 第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC

    2019独角兽企业重金招聘Python工程师标准>>> 原创内容,转载请注明iteye http://jinnianshilongnian.iteye.com/ 4.15.Multi ...

  2. Controller接口控制器(7)

    4.16.2.数据验证 1.数据绑定失败:比如需要数字却输入了字母: 2.数据不合法:可以认为是业务错误,通过自定义验证器验证,如用户名长度必须在5-20之间,我们却输入了100个字符等: 3.错误对 ...

  3. Controller接口控制器(5)

    4.15.MultiActionController 之前学过的控制器如AbstractCommandController.SimpleFormController等一般对应一个功能处理方法(如新增) ...

  4. Controller接口控制器详解(1)

    4.1.Controller简介 Controller控制器,是MVC中的部分C,为什么是部分呢?因为此处的控制器主要负责功能处理部分: 1.收集.验证请求参数并绑定到命令对象: 2.将命令对象交给业 ...

  5. (三)Controller接口控制器详解(二)

    一.AbstractController(简单控制器) AbstractController使用方法: 首先让我们使用AbstractController来重写第二章的HelloWorldContro ...

  6. Controller接口控制器(6)

    4.16.数据类型转换和数据验证 流程: 1.首先创建数据绑定器,在此此会创建ServletRequestDataBinder类的对象,并设置messageCodesResolver(错误码解析器): ...

  7. Controller接口控制器(3)

    4.11.AbstractWizardFormController 向导控制器类提供了多步骤(向导)表单的支持(如完善个人资料时分步骤填写基本信息.工作信息.学校信息等) 假设现在做一个完善个人信息的 ...

  8. Controller接口控制器(4)

    4.12.ParameterizableViewController 参数化视图控制器,不进行功能处理(即静态视图),根据参数的逻辑视图名直接选择需要展示的视图. Java代码  <bean n ...

  9. 实现接口Controller定义控制器

    实现接口Controller定义控制器 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含 ...

最新文章

  1. mysql sql 事务写作_mysql中的事务
  2. 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数...
  3. html重复标题,在HTML中重复表标题
  4. golang管道channel的遍历和关闭:应该使用for...range来遍历
  5. 深入理解JVM—性能调优
  6. python迭代器和生成器_Python之迭代器和生成器
  7. 使用FizzBu​​zz和JUnitParams进行单元测试
  8. 设置vim默认显示行号
  9. c语言gga字符串校验和代码,NEMA-0183(GPGGA,GPRMC,GPGSA,GPGSV,GPVTG)详解,并附解析代码(C语言版)...
  10. input获取焦点vue_在Vue中输入框自动获取焦点的三种方式
  11. 2022年最新配置:Eslint+Prettier+Volar
  12. @sequencegenerator oracle,SequenceGenerator注解的使用
  13. 计算机的储存器包括内存储器和外存储器,内存储器和外存储器的分类与区别
  14. 如何做自己开发一个app
  15. C语言运算符优先级及结合性
  16. python 发红包import random用redenv_python 发红包
  17. STC89C52RC - 2 - 开发环境搭建
  18. 集成方法-随机森林和AdaBoost
  19. cPanel主机空间安装Magento规范准确详细教程
  20. Java(Spring)学习笔记--->自动装配(autowire)

热门文章

  1. 重复文件查找_Duplicate File Remover PRO for mac(Mac文件重复查找软件)
  2. matlab 求向量的交集_MATLAB矩阵列向量单位化的最快代码
  3. matlab端到端仿真中基站功率,基于matlab的cdma通信系统分析及仿真
  4. win10 中午未使用 内存占用增高_清理磁盘空间【win10篇】
  5. OpenShift 4 之进入到集群节点内执行sosreport收集故障信息
  6. C#中反射和动态关键字有什么区别?
  7. 微软官方上线 Python 教程
  8. 谈判失败:Oracle 杀死 Java EE
  9. 用于CRUD和更多的模型驱动的RESTful API
  10. c# rar解压大小_Linux压缩解压指令-bzip2、xz、compress、rar