• 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>

     

     

     

     

     

      

     

     

  • 相关阅读:
    几个开源项目实体层实现方式比较
    ASP.NET MVC+LINQ开发一个图书销售站点
    C#流程控制
    用Java实现多线程服务器程序
    C#修饰符
    C#中的转义字符
    自定义实体类简介
    JAVA学习笔记——多线程(并发)
    java 多线程 wait() 以及 notirfy() 简析
    OA系统权限管理设计
  • 原文地址:https://www.cnblogs.com/yixiwenwen/p/2736783.html
Copyright © 2020-2023  润新知