SpringMVC(二十):Controller接收多种类型的数据

star2017 1年前 ⋅ 352 阅读

Spring MVC 接收多种类型的数据,及多种传参方式。

日期时间转换

form表单提交的日期时间数据是字符串,在Controller层如果直接用Date类型接收是会报错的,需要将String类型的日期时间转换为Date类型。
SpringMVC提供了一种非常方便的转换方式,在springmvc.xml文件配置了注解驱动,就默认启用了转换器。
注解驱动:<mvc:annotation-driven />
转换器:FormattingConversionServiceFactoryBean

@DateTimeFormat

该注解是对传入的字符串类型的日期时间参数或包含日期时间类型属性的Json 对象进行格式化为Date类型。

  1. 如果Controller方法里使用的是日期类型参数接收,则给每个Date类型参数前面加上 @DateTimeFormat()注解。
  2. 如果Controller方法里使用的是对象接收Json 对象,则给实体类日期类型的属性上加上 @DateTimeFormat()注解。
  3. 如果Controller方法里使用的是对象接收Json 字符串,方法里的对象参数前面加了 @RequestBody注解,则给实体类日期类型的属性只能使用 @JsonFormat()注解。

@JsonFormat

@ResponseBody输出的日期时间是个长整型,JSP可以在页面端进行格式化,也可以在先在后台格式化后发送。
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
该注解是对传出的Date类型参数格式化成指定格式的字符串。

//Controller 方法
/**
 * 接收日期类型数据
 * @param model
 * @param username
 * @param id
 * @return
 */
@RequestMapping("dateType")
public String dateType(@DateTimeFormat(pattern = "yyyy-MM-dd") 
        @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") Date birthday, 
        Model model) {
    model.addAttribute("birthday", birthday);        
    return "success";
}


//实体类
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;

示例代码

  1. 实体类:user,QueryVo

    import java.io.Serializable;
    import java.util.Date;
    
    import org.springframework.format.annotation.DateTimeFormat;
    
    public class User implements Serializable {
    
        private static final long serialVersionUID = 3538997579072069352L;
    
        private int id;
        private String username;
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date birthday;
        private String sex;
        private String address;
    
        //set/get方法
        ........
    }
    
    import java.util.List;
    
    public class QueryVo
    {
        //接收User对象参数
        private User user;
    
        //封装集合类型参数
        private List<User> uList;
    
        //set/get方法
        ........
    
  2. Controller 代码

     import java.util.Date;
    
     import org.springframework.format.annotation.DateTimeFormat;
     import org.springframework.stereotype.Controller;
     import org.springframework.ui.Model;
     import org.springframework.web.bind.annotation.RequestMapping;
    
     import com.ssm.springmvc.entity.QueryVo;
     import com.ssm.springmvc.entity.User;
    
     @Controller
     public class ReceiveReqParam {
         /**
          * 需求:页面跳转,跳转到form表单页面
          */
         @RequestMapping("tform")
         public String showForm() {
             return "tform";
         }
    
         /**
          * springmvc如何接受参数: 
          * 1、struts2基于属性封装 
          * 2、springmvc,默认是单例的,基于方法进行封装
          * springmvc需要何种参数,只需往方法添加即可,方法执行完毕,参数内存即释放。 
          * 需求:接受基本类型参数:string,int,long等等
          * 参数:int 
          * 返回值:success 
          * 映射器注解:可带也可不带扩展名,与方法名不一定要相同,通常这样便于直观理解
          */
         @RequestMapping("recieveInt")
         public String recieveInt(Model model, Integer id) {
             System.out.println("接收参数:" + id);
             // 参数回显
             model.addAttribute("id", id);
             return "success";
         }
    
         /**
          * 需求:接受String类型参数 
          * model: 封装参数
          * 乱码解决: get请求配置Servlet容器
          * <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol
          * ="HTTP/1.1" redirectPort="8443"/> 
          * post:spring编码过滤器,在web.xml处理编码过滤器
          * 
          */
         @RequestMapping("recieveStr")
         public String recieveStr(Model model, String username, String id) {
             model.addAttribute("username", username);
             model.addAttribute("id", id);
             return "success";
         }
    
         /**
          * 接收日期类型数据
          * @param model
          * @param username
          * @param id
          * @return
          */
         @RequestMapping("dateType")
         public String dateType(@DateTimeFormat(pattern = "yyyy-MM-dd")Date birthday, Model model) {
             model.addAttribute("birthday", birthday);        
             return "success";
         }
    
         /**
          * 需求:接受数组参数
          */
         @RequestMapping("recieveArray")
         public String recieveStr(String[] hobes) {
             for (String hobe : hobes) {
                 System.out.println(hobe);
             }
             // System.out.println("数组参数:"+hobes[0]+"-----"+hobes[1]);
             return "success";
         }
    
         /**
          * 封装对象类型数据
          * form表单提交的日期是字符串类型,jackson默认是没有做日期转换的。
          * SpringMVC整合fastJson,开启日期转换
          */
         @RequestMapping("recieveUser")
         public String recieveUser(User user, Model model) {
             System.out.println(user);
             model.addAttribute("user", user);
             return "success";
         }
    
         /**
          * 接受包装类型数据
          */
         @RequestMapping("recieveVo")
         public String recieveVo(QueryVo vo, Model model) {
             model.addAttribute("user", vo.getUser());
             return "success";
         }
    
         /**
          * 接收集合类型数据
          */
         @RequestMapping("recieveList")
         public String recieveList(Model model, QueryVo vo) {
             model.addAttribute("user", vo.getuList().get(1));
             return "success";
         }
     }
    
  3. form表单页面和回显页面:tform.jsp
    提交各种数据类型的form表单页面。

    <%@ 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>Insert title here</title>
    </head>
    
    <body>
        <h3>封装基本类型参数:int</h3>
        <form action="${pageContext.request.contextPath}/recieveInt" method="post">
            编号:<input name="id" type="text" id="id"> 
            <input type="submit" value="提交表单">
        </form>
        <hr color="blue">        
        <h3>封装String类型参数:String</h3>
        <form action="${pageContext.request.contextPath}/recieveStr" method="post">
            编号:<input name="id" type="text" id="id"> 
            姓名:<input name="username" type="text" id="username">
            <input type="submit" value="提交表单">
        </form>
        <hr color="blue">        
        <h3>封装Date类型参数:Date</h3>
        <form action="${pageContext.request.contextPath}/dateType" method="post">
            生日:<input name="birthday" type="text" id="birthday">
            <input type="submit" value="提交表单">
        </form>
        <hr color="blue">
        <h3>封装数组类型参数:String[] ids</h3>
        <form action="${pageContext.request.contextPath}/recieveArray" method="post">
            <!-- 数组常用在复选框,多选框 -->
            <input name="hobes" type="checkbox" value="1">旅游 
            <input name="hobes" type="checkbox" value="2">音乐
            <input name="hobes" type="checkbox" value="3">运动 
            <input type="submit" value="提交表单">
        </form>
        <hr color="blue">
        <h3>封装对象参数:User</h3>
        <form action="${pageContext.request.contextPath}/recieveUser" method="post">
            编号:<input name="id" type="text" id="id"> 
            姓名:<input name="username" type="text" id="username"> 
            生日:<input name="birthday" type="text" id="birthday"> 
            性别: <input name="sex" type="radio" value="男"><input name="sex" type="radio" value="女">女 
            地址:<input name="address" type="text" id="address"> 
            <input type="submit" value="提交表单">
        </form>
        <hr color="blue">
        <h3>封装包装类参数:QueryVo</h3>
        <form action="${pageContext.request.contextPath}/recieveVo" method="post">
            编号:<input name="user.id" type="text" id="id"> 
            姓名:<input name="user.username" type="text" id="username"> 
            生日:<input name="user.birthday" type="text" id="birthday"> 
            性别:<input name="user.sex" type="radio" value="男"><input name="user.sex" type="radio" value="女">女 
            地址:<input name="user.address" type="text" id="address"> 
                <input type="submit" value="提交表单">
        </form>
        <hr color="blue">
        <h3>封装集合类参数:List</h3>
        <form action="${pageContext.request.contextPath}/recieveList" method="post">
            编号:<input name="uList[0].id" type="text" id="id"> 
            姓名:<input name="uList[0].username" type="text" id="username"> 
            生日:<input name="uList[0].birthday" type="text" id="birthday"> 
            性别:<input name="uList[0].sex" type="radio" value="男"><input name="uList[0].sex" type="radio" value="女">女 
            地址:<input name="uList[0].address" type="text" id="address"> 
                <br> 
            编号:<input name="uList[1].id" type="text" id="id"> 
            姓名:<input name="uList[1].username" type="text" id="username"> 
            生日:<input name="uList[1].birthday" type="text" id="birthday"> 
            性别:<input name="uList[1].sex" type="radio" value="男"><input name="uList[1].sex" type="radio" value="女">女 
            地址: <input name="uList[1].address" type="text" id="address"> 
            <input type="submit" value="提交表单">
        </form>
    </body>
    
    </html>
    

    表单提交回显示面:success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <!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>Insert title here</title>
    </head>
    <body>
    
        <h3>回显int类型:${id}</h3>
        <hr color="blue">
        <h3>回显String类型,编号:${id} 姓名:${username }</h3>
        <hr color="blue">
        <h3>回显Date类型: <fmt:formatDate value="${birthday}" pattern="yyyy-MM-dd" /></h3>
        <hr color="blue">
        <h3>回显数组类型:</h3>
        <hr color="blue">
        <h3>编号:${user.id}</h3>
        <h3>用户名:${user.username}</h3>
        <h3>生日: <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd HH:mm:ss" /></h3>
        <h3>性别:${user.sex}</h3>
        <h3>地址:${user.address}</h3>
    </body>
    </html>
    
更多内容请访问:IT源点

全部评论: 0

    我有话说: