springMVC 之 Controller

上篇写了一个简单的关于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>

 

 

 

 

 

  

 

 

posted @ 2012-10-24 11:10  依稀|.мīss.чou  阅读(1537)  评论(0编辑  收藏  举报