上一篇文章中我们讲过了处理器的映射,接下来我们来一起学习下springmvc的控制器吧。

首先咱们先创建一个咱们用来测试的实体(model)类:

package cn.cfs.springmvc.domain;

public class User {
//主键
private Integer id;
//用户名
private String username;
//密码
private String password;
/**
* 获取 主键
*
* @return 主键
*/
public Integer getId() {
return id;
}
/**
* 设置 主键
*
* @param id 主键
*/
public void setId(Integer id) {
this.id = id;
}
/**
* 获取 用户名
*
* @return 用户名
*/
public String getUsername() {
return username;
}
/**
* 设置 用户名
*
* @param username 用户名
*/
public void setUsername(String username) {
this.username = username;
}
/**
* 获取 密码
*
* @return 密码
*/
public String getPassword() {
return password;
}
/**
* 设置 密码
*
* @param password 密码
*/
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password="
+ password + "]";
} }

User实体类

springmvc的控制器有很多种,这里只讲最常用的三种:

一、CommandController命令控制器

package cn.cfs.springmvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import cn.cfs.springmvc.domain.User; public class UserCommandController extends AbstractCommandController {
//绑定数据
public UserCommandController() {
this.setCommandClass(User.class);
this.setCommandName("user");
}
@Override
protected ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
User user =(User)command;
System.out.println(user.toString());
return new ModelAndView("index");
}
}

action-servlet.xml配置文件中的代码:

<!-- 采用className的方式去访问 -->
<bean id="userCommandController" class="cn.cfs.springmvc.controller.UserCommandController"></bean>

前台通过访问url:http://192.168.1.253:8082/springmvc_01/usercommandcontroller.action?id=99&username=aaa&password=ssss 来测试

控制台打印语句:User [id=99, username=aaa, password=ssss]

二、SimpleFormController简单表单控制器

package cn.cfs.springmvc.controller;

import org.springframework.web.servlet.mvc.SimpleFormController;
import cn.cfs.springmvc.domain.User; public class UserFormController extends SimpleFormController {
//在构造方法里去绑定
public UserFormController() {
this.setCommandClass(User.class);
this.setCommandName("user");
} @Override
protected void doSubmitAction(Object command) throws Exception {
User user=(User)command;
System.out.println(user.toString());
}
}

action-servlet.xml配置文件中的代码:

<!-- 采用className的方式去访问 -->
<bean id="userFormController" class="cn.cfs.springmvc.controller.UserFormController">
<property name="formView" value="login" />
<property name="successView" value="index" />
</bean>

ps:formView 是通过get方法访问这个请求处理后跳转的页面,successView是通过post方法访问这个请求处理后跳转的页面。举个例子,例如添加用户,肯定先要跳转到添加用户的页面上,然后在表单中填写一些用户信息,点击保存提交按钮跳转到控制器中,处理完自己的业务代码再跳到指定页面,这种简单表单方式就是为了解决这种需求。

访问路径:http://192.168.1.253:8082/springmvc_01/userformcontroller.action 跳转到添加页面的地址,因为是直接在浏览器敲的所以是get方式访问的,会跳转到login.jsp页面上

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/userformcontroller.action" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="保存提交" /></td>
</tr>
</table>
</form> </body>
</html>

login.jsp页面代码

根据上面login.jsp中代码所示,输入完用户名和密码后,点击保存提交按钮,通过form中post的方式将表单内容提交到userformcontroller.action这个请求上,回通过控制器找到doSubmitAction这个方法,在这个方法中处理自己业务逻辑,最后跳转到index.jsp页面上,最后总结一下,这种方式是通过get和post提交方式来区分跳转的页面的,只有post提交方式才会跳转到带有处理自己业务逻辑的后台方法中。

控制台打印语句:User [id=null, username=aaaa, password=123456]

 三、WizardFormController向导控制器

package cn.cfs.springmvc.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
import cn.cfs.springmvc.domain.User; public class UserWizardController extends AbstractWizardFormController { //绑定数据
public UserWizardController() {
this.setCommandClass(User.class);
this.setCommandName("user");
} /**
* 完成提交的函数
*/
@Override
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
User user=(User)command;
System.out.println(user.toString());
return new ModelAndView("index");
} /**
* 取消方法,配置点击取消后要跳转的页面
*/
@Override
protected ModelAndView processCancel(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
return new ModelAndView("index");
}
}

action-servlet.xml配置文件中的代码:

<!-- 采用className的方式去访问 -->
<bean id="userwizardcontroller" class="cn.cfs.springmvc.controller.UserWizardController">
<property name="pages">
<list>
<value>/wizard/1</value>
<value>/wizard/2</value>
<value>/wizard/3</value>
</list>
</property>
</bean>

ps: list下的value为跳转的页面,对应的上下文中会创建一个叫wizard的文件夹,以及对应的3个页面文件

访问路径:http://192.168.1.253:8082/springmvc_01/userwizardcontroller.action 会按照list中value的先后顺序去加载页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>向导表单控制器</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
<table>
<tr>
<td>
第一个页面,id
<input type="text" name="id" value="${user.id}" />
</td>
</tr>
<tr>
<td>
<input type="submit" name="_target1" value="下一步" />
<input type="submit" name="_cancel" value="取消" />
</td>
</tr>
</table>
</form> </body>
</html>

wizard/1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>向导表单控制器</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
<table>
<tr>
<td>
第二个页面,用户名
<input type="text" name="username" value="${user.username}"/>
</td>
</tr>
<tr>
<td>
<input type="submit" name="_target0" value="上一步" />
<input type="submit" name="_cancel" value="取消" />
<input type="submit" name="_target2" value="下一步" />
</td>
</tr>
</table>
</form> </body>
</html>

wizard/2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>向导表单控制器</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
<table>
<tr>
<td>
第三个页面,密码
<input type="text" name="password" value="${user.password}" />
</td>
</tr>
<tr>
<td>
<input type="submit" name="_target1" value="上一步" />
<input type="submit" name="_finish" value="完成" />
<input type="submit" name="_cancel" value="取消" />
</td>
</tr>
</table>
</form> </body>
</html>

wizard/3.jsp

ps:上面的jsp文件中主要是通过 提交按钮的 name名称去控制上下页,取消,完成操作的,详细请看下面的表格(1-1);

向导表单控制器属性一览表(1-1)
属性 具体的的含义
_targetN N是可变化的,指具体的页码,从0开始,例如当前为第二页,上一页则为_target0,下一页则为_target1
_cancel 取消,点击后请求发送到后台的取消方法中,根据具体的配置跳转到指定的取消页面
_finish 完成,点击后请求发送到后台的完成方法中,会自动将向导页的表单数据做拼接,根据具体的配置跳转到指定的完成请求处理后的页面

上述为当前springmvc比较常用的控制器,当然还有很多,例如默认的AbstractController这是最简单控制器,很多参数都需要通过原始的方法去获取,后续还待完善。

springmvc基础篇—掌握三种控制器的更多相关文章

  1. springmvc基础篇—掌握三种处理器

    随着springmvc的广泛使用,关于它的很多实用有效的功能应该更多的被大家所熟知,下面就介绍一下springmvc的三种处理器: 一.BeanName处理器(默认) <?xml version ...

  2. python+selenium基础篇,三种等待方式,显示、隐式、强制等待

    1.显示等待: from selenium import webdriver from time import sleep from selenium.webdriver.support.ui imp ...

  3. 小猪猪逆袭成博士之C++基础篇(三)字符串

    小猪猪逆袭成博士之C++基础篇(三)字符串 String 写在题外的话: 非常感谢在我发了第一篇随笔以后有很多人看还评论了,这大概就是一种笔记性质的,也不一定全对,如果不对的地方请指出来让我加以改正. ...

  4. python基础篇(三)

    PYTHON基础篇(三) 装饰器 A:初识装饰器 B:装饰器的原则 C:装饰器语法糖 D:装饰带参数函数的装饰器 E:装饰器的固定模式 装饰器的进阶 A:装饰器的wraps方法 B:带参数的装饰器 C ...

  5. Qt入门之基础篇(三):掌握Qt4的静态编译基本方法

    转载载请注明出处:CN_Simo. 导语: 前两章都提到过“静态编译”(Static Compilation),在Windows下一次静态编译差不多需要长达三个小时才能完成,而且还非常容易由于各种原因 ...

  6. CSS【03】:CSS 基础选择器与三种引入方式

    基础选择器 选择器:css 选择 html 标签的一个工具,是将 css 与 html 建立起联系,那么 css 就可以控制 html 样式 选择器其实就是给 html 标签起名字 标签选择器 作用: ...

  7. Android自己定义View基础篇(三)之SwitchButton开关

    自己定义View基础篇(二) 自己定义View基础篇(一) 自己定义View原理 我在解说之前,先来看看效果图,有图有真相:(转换gif图片效果太差) 那来看看真实图片: 假设你要更改样式,请改动例如 ...

  8. Sencha 基础Demo测试,三种showView的方法

    直接贴代码吧 Ext.define("build.controller.MainController",{ extend:"Ext.app.Controller" ...

  9. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 三 Linux磁盘与文件系统管理

    一.认识EXT2文件系统:     a.硬盘的组成:转动小马达+存储的磁盘+读写的机械臂     b.磁盘的一些概念              扇区为最小的物理储存单位,每个扇区为512B       ...

随机推荐

  1. POJ 3020 Antenna Placement 【最小边覆盖】

    传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total ...

  2. POJ 3233 Matrix Power Series 【经典矩阵快速幂+二分】

    任意门:http://poj.org/problem?id=3233 Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K To ...

  3. javascript运算符——条件、逗号、赋值、()和void运算符 (转载)

    原文出自 作者:小火柴的蓝色理想   javascript中运算符总共有46个,除了前面已经介绍过的算术运算符.关系运算符.位运算符.逻辑运算符之外,还有很多运算符.本文将介绍条件运算符.逗号运算符. ...

  4. 实现虚拟(Virtual)DOM

    Virtual DOM算法 把一个div元素的属性打印出来,如下: 可以看到仅仅是第一层,真正DOM的元素是非常庞大的,这也是DOM加载慢的原因. 相对于DOM对象,原生的JavaScript对象处理 ...

  5. Object C学习笔记20-结构体(转)

    在学习Object C中的过程中,关于struct的资料貌似非常少,查阅了C方面的资料总结了一些学习心得! 一. 定义结构 结构体是一种数据类型的组合和数据抽象.结构体的定义语法如下: struct ...

  6. JavaScript 基础(五) 函数 变量和作用域

    函数定义和调用 定义函数,在JavaScript中,定义函数的方式如下: function abs(x){ if(x >=0){ return x; }else{ return -x; } } ...

  7. 编写可维护的JavaScript---事件处理

    在JavaScript应用中事件处理是非常重要的,所有的JavaScript都是通过事件绑定到UI上的. 1. 典型用法 当事件触发的时候,事件对象event会最为回调参数传入到事件处理程序中.eve ...

  8. npm ERR! code: 'EPERM' (权限问题 errro permit)

    PS C:\Users\user\Desktop\test\my-project> npm run iview --save npm ERR! missing script: iview npm ...

  9. jzoj100029. 【NOIP2017提高A组模拟7.8】陪审团(贪心,排序)

    Description 陪审团制度历来是司法研究中的一个热议话题,由于陪审团的成员组成会对案件最终的结果产生巨大的影响,诉讼双方往往围绕陪审团由哪些人组成这一议题激烈争夺. 小 W 提出了一个甲乙双方 ...

  10. [HNOI2003]操作系统(优先队列,堆排序)

    题目描述 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高. 如果一个进程到达的时 ...