上篇写了一个简单的关于springmvc 的 helloworld 程序, 那么现在来说说springmvc中几种常用的Controller吧。
1. CommandController
命令控制器之一,可以实现该控制器来创建命令控制器,该控制器能把自动封装请求参数到一个命令对象,而且提供了验证功能。
a、创建命令类(就是普通的JavaBean类/POJO)
1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3
4 /**
5 * @author yixi
6 *
7 */
8 public class Emp {
9
10 private int id;
11 private String name;
12 private String phone;
13 private Date date;
14 public String getName() {
15 return name;
16 }
17 public void setName(String name) {
18 this.name = name;
19 }
20 public String getPhone() {
21 return phone;
22 }
23 public void setPhone(String phone) {
24 this.phone = phone;
25 }
26
27 public int getId() {
28 return id;
29 }
30 public void setId(int id) {
31 this.id = id;
32 }
33 public Date getDate() {
34 return date;
35 }
36 public void setDate(Date date) {
37 this.date = date;
38 }
39 @Override
40 public String toString() {
41 return "Emp [id= " + id + " name=" + name + ", phone=" + phone + " , date = " + new SimpleDateFormat("yyyy-MM-dd").format(date) + "]";
42 }
43
44
45 }
b、实现控制器
1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3
4 import javax.servlet.http.HttpServletRequest;
5 import javax.servlet.http.HttpServletResponse;
6
7 import org.springframework.beans.propertyeditors.CustomDateEditor;
8 import org.springframework.validation.BindException;
9 import org.springframework.web.bind.ServletRequestDataBinder;
10 import org.springframework.web.servlet.ModelAndView;
11 import org.springframework.web.servlet.mvc.AbstractCommandController;
12
13 import com.yixi.model.Emp;
14
15 public class EmpController extends AbstractCommandController {
16
17 @Override
18 protected ModelAndView handle(HttpServletRequest request,
19 HttpServletResponse response, Object command, BindException exception)
20 throws Exception {
21 Emp emp = (Emp) command;
22 System.out.println(emp);
23 return new ModelAndView("success");
24 }
25
26 //对Date的格式的属性进行转换
27 @Override
28 protected void initBinder(HttpServletRequest request,
29 ServletRequestDataBinder binder) throws Exception {
30 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
31 }
32
33
34 }
c、在配置文件的配置
1 <!-- 映射解释器 -->
2 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
3 <property name="mappings">
4 <props>
5 <prop key="add_emp_command.test">addEmpController</prop>
6 <prop key="add.test">addEmpsuccessController</prop>
7 </props>
8 </property>
9 </bean>
10 <!-- 视图解释器 -->
11 <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
12 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
13 <property name="prefix" value="/WEB-INF/jsp/"></property>
14 <property name="suffix" value=".jsp"></property>
15 </bean>
16 <bean id="addEmpController" class="org.springframework.web.servlet.mvc.UrlFilenameViewController">
17 </bean>
18
19 <!-- 这是用commandController的配置方法 -->
20 <bean id="addEmpsuccessController" class="com.yixi.controller.EmpController">
21 <property name="commandClass" value="com.yixi.model.Emp"></property>
22 </bean>
在commandController的配置中多了一个commandClass的属性 它用于指定要注入的实体 是必须的
d、相应的jsp页面:
add_emp_command.jsp
1 <body>
2 <form action="add.test" method="post">
3 id :<input type="text" name="id"><br>
4 name: <input type="text" name="name"/><br>
5 phone: <input type="text" name="phone"/><br>
6 date : <input type="text" name="date" /><br>
7 <input type="submit" value="add">
8 </form><br>
9 </body>
success.jsp
1 <body>
2 add emp success!<br>
3 </body>
e、现在在url中输入:http://localhost:8080/项目名/add_emp_command.test 即可进入add_emp_command.jsp 再点击提交 即可执行相应的操作 在提交到EmpController 控制器时 表单中提交的数据就会自动注入到command对象中 并进入success.jsp页面。
在Emp类中有一个属性是java.util.Date类型的 在注入command对象时由于不能直接将string类型的转化成Date类型的 所以要覆写protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder)方法。
2、FormController
用于支持带步骤的表单提交的命令控制器基类,使用该控制器可以完成:
1、定义表单处理(表单的渲染),并从控制器获取命令对象构建表单;
2、提交表单处理,当用户提交表单内容后,AbstractFormController可以将用户请求的数据绑定到命令对象,并可以验证表单内容、对命令对象进行处理。
a、实现控制器
1 package com.yixi.controller;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Date;
5 import java.util.HashMap;
6 import java.util.Map;
7
8 import javax.servlet.http.HttpServletRequest;
9 import javax.servlet.http.HttpServletResponse;
10
11 import org.springframework.beans.propertyeditors.CustomDateEditor;
12 import org.springframework.validation.BindException;
13 import org.springframework.web.bind.ServletRequestDataBinder;
14 import org.springframework.web.servlet.ModelAndView;
15 import org.springframework.web.servlet.mvc.SimpleFormController;
16
17 import com.yixi.model.Emp;
18
19 public class EmpFormController extends SimpleFormController {
20
21 @Override
22 protected ModelAndView onSubmit(HttpServletRequest request,
23 HttpServletResponse response, Object command, BindException errors)
24 throws Exception {
25 Emp emp = (Emp) command;
26 System.out.println(emp);
27 return new ModelAndView("success");
28 }
29
30 @Override
31 protected Map referenceData(HttpServletRequest request) throws Exception {
32 Map<String, Object> map = new HashMap<String, Object>();
33 map.put("likeList", new Object[]{"apple","sina", "qq","google"});
34 return map;
35 }
36
37 @Override
38 protected void initBinder(HttpServletRequest request,
39 ServletRequestDataBinder binder) throws Exception {
40 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
41 }
42
43
44 }
formController的onSubmit方法只能接收post方式提交的数据 get方式提交formController不会响应 。注意这里的 protected Map referenceData(HttpServletRequest request) throws Exception 方法 他是在get方式下响应的方法 在这里的作用是把要用的数据给要提交的页面(add_emp_form.jsp)
b、配置文件
1 <!-- 映射解释器 -->
2 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
3 <property name="mappings">
4 <props>
5 <prop key="add_emp_form.test">addEmpFormController</prop>
6 </props>
7 </property>
8 </bean>
9 <!-- 视图解释器 -->
10 <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
11 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
12 <property name="prefix" value="/WEB-INF/jsp/"></property>
13 <property name="suffix" value=".jsp"></property>
14 </bean>
15 <!-- 这是用formController的配置方式 -->
16 <bean id="addEmpFormController" class="com.yixi.controller.EmpFormController">
17 <property name="formView" value="add_emp_form"></property>
18 <property name="commandClass" value="com.yixi.model.Emp"></property>
19 <property name="successView" value="success"></property>
20 </bean>
在formController配置的时候 又多了formView和successView两个属性 formView属性指定的是在get提交的方式下要跳转到的页面 这是必须的 successView属性指定的是在post提交后要转到的页面 不是必须的 因为可以在controller中指定
c、页面
add_emp_form.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
2 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title> add emp </title>
7 </head>
8
9 <body>
10 <form action="" method="post">
11 id :<input type="text" name="id"><br>
12 name: <input type="text" name="name"/><br>
13 phone: <input type="text" name="phone"/><br>
14 date : <input type="text" name="date" /><br>
15 like:<select name="likes">
16 <c:forEach items="${likeList }" var="like">
17 <option value="${like}">${like}</option>
18 </c:forEach>
19 </select>
20 <input type="submit" value="add">
21 </form><br>
22 </body>
23 </html>
注意在form表单中的action是空的 那么它将默认提交给自己 所以EmpFormController才能接收的到post提交的数据 才会调用onSubmit方法
d、现在在url中输入http://localhost:8080/项目名/add_emp_form.test即可跳转到add_emp_form.jsp页面 再点提交 即可注入表单中的数据到command对象中完成相应的业务 然后跳转到success.jsp
3.MultiActionController
多动作控制器MultiActionController,开发人员藉此可以将多个动作聚合在同一个控制器之内,实现功能集成,从而不必为控制器定义多个入口点。例如对商品信息进行查询、增删改等操作,这个动作可以用一个Contoller来实现。
a、控制器实现:
1 package com.yixi.controller;
2
3 import java.text.SimpleDateFormat;
4 import java.util.Date;
5
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8
9 import org.springframework.beans.propertyeditors.CustomDateEditor;
10 import org.springframework.web.bind.ServletRequestDataBinder;
11 import org.springframework.web.servlet.ModelAndView;
12 import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
13
14 import com.yixi.model.Emp;
15
16 public class EmpMultiActionController extends MultiActionController {
17
18 public ModelAndView addView(HttpServletRequest request,HttpServletResponse response) {
19 ModelAndView mv = new ModelAndView();
20 mv.setViewName("add_emp_multiAction");
21 mv.addObject("likeList",new Object[]{"apple","sina", "qq","google"});
22 return mv;
23 }
24
25 public String addEmp(HttpServletRequest request,HttpServletResponse response,Emp emp) {
26 System.out.println(emp);
27 return "success";
28 }
29
30 @Override
31 protected void initBinder(HttpServletRequest request,
32 ServletRequestDataBinder binder) throws Exception {
33 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
34 }
35
36
37 }
b、配置文件
1 <!-- 映射解释器 -->
2 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
3 <property name="mappings">
4 <props>
5 <prop key="addView.test">addEmpMultiActionController</prop>
6 <prop key="addEmp.test">addEmpMultiActionController</prop>
7 </props>
8 </property>
9 </bean>
10 <!-- 视图解释器 -->
11 <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
12 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
13 <property name="prefix" value="/WEB-INF/jsp/"></property>
14 <property name="suffix" value=".jsp"></property>
15 </bean>
16 <!-- 采用MultiActionController的配置方式 -->
17 <bean id="addEmpMultiActionController" class="com.yixi.controller.EmpMultiActionController">
18 <property name="methodNameResolver">
19 <!-- 按路径解析相应的方法 根据请求名找方法 即 addView.test 就会映射到addView 方法上-->
20 <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean>
21 <!-- 这个是根据你在提交时在url上要带的一个指定的param(在这里是func)的值 根据值找相应的方法
22 <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver" >
23 <property name="paramName" value="func"></property>
24 </bean>
25 -->
26 </property>
27 </bean>
c、页面
add_emp_multiAction.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
2 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4 <html>
5 <head>
6 <title> add emp </title>
7 </head>
8
9 <body>
10 <form action="addEmp.test" method="post">
11 id :<input type="text" name="id"><br>
12 name: <input type="text" name="name"/><br>
13 phone: <input type="text" name="phone"/><br>
14 date : <input type="text" name="date" /><br>
15 like:<select name="likes">
16 <c:forEach items="${likeList }" var="like">
17 <option value="${like}">${like}</option>
18 </c:forEach>
19 </select>
20 <input type="submit" value="add">
21 </form><br>
22 </body>
23 </html>