重点: 掌握常见的Controller 配置及使用方法
控制器: MVC 中 的 C
包括两大类: 控制逻辑(前端控制器) + 功能处理(自定义控制器)
功能处理的作用:
- 收集、验证请求参数并绑定对象
- 处理业务获得模型数据
- 返回视图
几种常见的 Controller
CommandController(命令控制器)
FormController(表单控制器)
MultiActionController(多功能控制器)
CommandController(命令控制器)
:把请求参数绑定到一个命令对象,并提供验证功能
封装:
- 构造方法: this.setCommandClass(User.class);
- 依赖注入
验证:(后面会讲)
配置文件
<!-- 映射处理器(使用默认的 beanNameUrlHandlerMapping) -->
<!-- 自定义控制器 -->
<bean name="/myCommand.do" class="com.kgc.controllers.MyCommandController">
<!-- <property name="commandClass" value="com.kgc.model.UserModel"></property> -->
</bean>
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsps/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
java 代码 如下:
// 无参构造
public MyCommandController() {
// 绑定命令对象
this.setCommandClass(UserModel.class);
// 简单的数据校验器(了解一下就可以)
this.setValidator(new UserValidator());
}
注:验证代码 不作要求 ,后面会专门学
public class UserValidator implements Validator {
/**
* 验证数据模型是否绑定验证对象了
*/
@Override
public boolean supports(Class<?> clazz) {
return UserModel.class.equals(clazz);
}
/**
* 进行数据验证
*/
@Override
public void validate(Object obj, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "userName", "用户名为空了,不OK");
UserModel user = (UserModel) obj;
if(null == user.getPassword() || "".equals(user.getPassword())){
errors.rejectValue("password", "密码为空,异常!");
}
}
}
FormController(表单控制器)
良好的表单支持
- 将数据展示到表单
- 处理表单提交的数据
步骤:
1、继承SimpleFormController类
public class MyFormController extends SimpleFormController {
// 默认的无参构造
public MyFormController() {
// 命令对象的绑定
this.setCommandClass(UserModel.class);
// 指定命令对象的名称
this.setCommandName("user");
}
}
2、重写要实现的方法
- formBackingObject() 通过commandName表单展示数据
- referenceData() 展示表单时需要的数据
- doSubmitAction() 处理表单提交请求
// 处理表单提交请求
@Override
protected void doSubmitAction(Object command) throws Exception {
UserModel user = (UserModel)command;
System.out.println(user.toString());
}
// 提供表单需要的其他数据
@Override
protected Map referenceData(HttpServletRequest request) throws Exception {
// 提供返回对象
Map<String,String> resultMap = new HashMap<String,String>();
resultMap.put("age", "20");
return resultMap;
}
// 进行表单数据回显的
@Override
protected Object formBackingObject(HttpServletRequest request)
throws Exception {
// 组装页面要展示的数据
UserModel user = new UserModel();
user.setUserName("zhangsan");
return user;
}
- 构造方法注入命令类和命令名称
public MyformController(){
setCommandClass(User.class); //命令对象实现类
setCommandName(“user”); //命令对象的名字
}
- 配置文件
<!-- 自定义的表单控制器 -->
<bean name="/myform.do" class="com.kgc.controllers.MyFormController">
<!-- 表单页面显示的视图 -->
<property name="formView" value="kgcForm"></property>
<!-- 表单提交请求处理成功后显示的页面 -->
<property name="successView" value="kgcSuccess"></property>
</bean>
多功能控制器
支持在一个控制器里添加多个功能处理方法
即通过方法名解析器或委托对象将多个请求的处理方法放至到一个控制器里
默认使用InternalPathMethodNameResolver 解析 URL 和方法名的映射
步骤:
1、继承 MultiActionConntroller
public class MyMultiController extends MultiActionController {
// 模拟一个数据库
private Map<String,Object> dataMap = new HashMap<String, Object>();
}
2、提供增删改查的方法(模拟)
// 增加
public ModelAndView add(HttpServletRequest request,HttpServletResponse response,UserModel user){
// 提供一个返回对象
ModelAndView mav = new ModelAndView();
// 如果是get 请求,返回到添加页面
if("GET".equals(request.getMethod())){
mav.setViewName("add");
return mav;
}
// 如果是post 请求,添加数据到dataMap
if("POST".equals(request.getMethod())){
dataMap.put(user.getUserName(), user);
return query(request,response,user);
}
return null;
}
// 删除
public ModelAndView delete(HttpServletRequest request,HttpServletResponse response,UserModel user){
// 删除数据
dataMap.remove(user.getUserName());
return query(request, response, user);
}
// 修改
public ModelAndView update(HttpServletRequest request,HttpServletResponse response,UserModel user){
ModelAndView mav = new ModelAndView();
// 如果是get 请求,那么把要修改的数据显示在修改页面
if("GET".equals(request.getMethod())){
// 要把修改的user 对象拿出来
UserModel targetUser = (UserModel)dataMap.get(user.getUserName());
mav.addObject("targetUser",targetUser);
mav.setViewName("update");
return mav;
}
// 如果是post 请求,将目标数据进行修改,然后调用查询方法进行展示
if("POST".equals(request.getMethod())){
UserModel updateUser = (UserModel) dataMap.get(user.getUserName());
updateUser.setPassword(user.getPassword());
// 将更新后的数据存到map中
dataMap.put(user.getUserName(), updateUser);
return query(request, response, updateUser);
}
return null;
}
// 查询
public ModelAndView query(HttpServletRequest request,HttpServletResponse response,UserModel user){
// 提供一个返回对象
ModelAndView mav = new ModelAndView();
mav.addObject("dataMap", dataMap);
mav.setViewName("query");
return mav;
}
3、配置文件
<bean name=”/user/*” class=”com.kgc.controllers.MyMultiController”/>
<!-- 自定义多功能控制器 -->
<bean name="/user/*" class="com.kgc.controllers.MyMultiController"/>
备注: jsp 中引入c标签 <%@taglib prefix=”c” uri=”http://java.sun.com/jstl/core_rt”%>