• SpringMVC 06: 日期类型的变量的注入和显示


    日期处理和日期显示

    日期处理

    • 此时SpringMVC的项目配置和SpringMVC博客集中(指SpringMVC 02)配置相同
    • 日期处理分为单个日期处理和类中全局日期处理
    • 单个日期处理:
    • 使用@DateTimeFormat注解 + < mvc:annotation-driven />注解驱动
    • webapp/index.jsp:网站的首页,用来选定时间并提交给服务器
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        index.jsp
    
    
    

    单个日期处理

    "${pageContext.request.contextPath}/date.action"> 日期:"date" name="date"> "submit" value="提交">
    • webapp/admin/date.jsp:请求的响应页面
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        date.jsp
    
    
    

    date......page......

    • 在springmvc.xml配置文件中新增注解驱动:解析用来进行日期注入的注解
        
        <mvn:annotation-driven/>
    
    • 新增SpringMVC控制器:DateAction,其中action方法的Date类型参数用@DateTimeFormat(pattern = "yyyy-MM-dd")标识
    • 注解后面的pattern参数指定了前端传来的日期(实际上以字符串的形式传递到后端),以什么样的格式注入到date参数中
    • 但是在输出date变量时如果要更加直观的显示日期格式,必须另外再用SimpleDateFormat修改日期格式
    • 所以"yyyy-MM-dd"会出现两次
    package com.example.controller;
    
    import org.springframework.format.annotation.DateTimeFormat;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    public class DateAction {
        @RequestMapping("/date")
        public String data(
            @DateTimeFormat(pattern = "yyyy-MM-dd")
            Date date){
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            System.out.println(sf.format(date));
            return "date";
        }
    }
    
    • 部署并启动tomcat测试
    • 网站首页(left),响应页面(mild),控制台输出(right)见下:可见通过注解和注册注解驱动可以实现日期类型变量的注入

    image

    • 关于单个日期类型注入处理的补充:如果要注入的单个变量不是简单的Date类型,而是含有Date类型属性的对象
    • 需要在该对象的Date类型的属性上或者在该属性的setter方法上使用@DateTimeFormat(pattern = "yyyy-MM-dd")
    • 更特殊的,如果是json类型的数据对象,需要在该属性的getter方法上添加@DateTimeFormat(pattern = "yyyy-MM-dd")
    • 类中全局日期处理:
    • 如果一个action方法有多个日期类型的变量要注入值,或者多个类中有多个action方法需要注入日期类型的变量,挨个使用@DateTimeFormat注解的方式无疑显得非常繁琐
    • 可以通过在类中声明自定义注解的方式,来帮助解析本类中的所有日期类型,完成类中全局日期处理,简化日期类型转换和注入操作
    • 删除springmvc中的注解驱动:< mvc:annotation-driven />
    • 修改DateAction控制器如下:注册全局日期处理注解
    package com.example.controller;
    
    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.InitBinder;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Controller
    public class DateAction {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    
        //注册全局日期处理注解
        @InitBinder
        public void initBinder(WebDataBinder webDataBinder){
            //注册自定义的编辑器,对日期类型进行自定义配置,指定日期注入时的格式,并允许日期为空
            webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sf, true));
        }
    
        //每个方法上不用添加日期注入的注解,只要在类中注册全局日期处理注解即可
        @RequestMapping("/date")
        public String data(Date date){
            System.out.println(sf.format(date));
            return "date";
        }
    }
    
    • 部署并启动tomcat测试
    • 网站首页(left),响应页面(mild),控制台输出(right)见下:可见通过注册全局日期处理注解,也可以完成日期类型变量的注入,并简化挨个添加单个注解的繁琐操作

    image

    日期显示

    • 将后端传来的含有日期类型属性的用户信息列表展示在响应页面中
    • 需要使用jstl标签库,在pom.xml中新增jstl依赖
        
        <dependency>
          <groupId>jstlgroupId>
          <artifactId>jstlartifactId>
          <version>1.2version>
        dependency>
    
    • webapp/index.jsp:网站的首页,并用于发送请求,从后端请求用户信息
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        index.jsp
    
    
    "${pageContext.request.contextPath}/date.action">显示用户信息列表,包含日期类型的属性
    
    
    
    • webapp/admin/date.jsp:请求的响应页面,并将请求来的用户信息列表展示在该页面上
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    <%-- 导入jstl核心标签库--%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%-- 导入jstl格式化标签库--%>
    <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    
    
    
        date.jsp
    
    
    

    显示用户信息列表,包含日期类型的属性

    "800px" border="1"> "${list}" var="user">
    用户名 生日
    ${user.name} "${user.birthday}" pattern="yyyy-MM-dd"/>
    • DateAction控制器
    package com.example.controller;
    
    import com.example.pojo.User;
    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.InitBinder;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletRequest;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    @Controller
    public class DateAction {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    
        //注册全局日期处理注解
        @InitBinder
        public void initBinder(WebDataBinder webDataBinder){
            //注册自定义的编辑器,对日期进行自定义配置,指定日期注入时格式,允许日期为空
            webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sf, true));
        }
    
        //User实体类含有属性:name(String),birthday(Date)。无参构造方法。全参的有参构造方法,getter,setter,toString方法
        @RequestMapping("/date")
        public String data(HttpServletRequest request) throws ParseException {
            User u1 = new User("荷包蛋", sf.parse("2002-08-23"));
            User u2 = new User("饺子", sf.parse("2001-08-28"));
            User u3 = new User("橘子", sf.parse("2001-03-14"));
            List list = new ArrayList<>();
            list.add(u1);
            list.add(u2);
            list.add(u3);
            request.setAttribute("list", list);
            return "date";
        }
    }
    
    • 部署并启动tomcat测试
    • 不用jstl格式化标签库处理时:网站首页(left),响应页面(right)

    image

    • 使用jstl格式化标签库处理时:网站首页(left),响应页面(right)

    image

  • 相关阅读:
    SQL 在PostgreSQL中使用SQL将多行连接成数组
    将有序数组转化为平衡二叉搜索树
    Unity中Shader的Pass的复用
    2022.7.31记录
    分享一款嵌入式开源按键框架代码工程MultiButton
    Unity使用c#开发遇上的问题(十)(unity中使用自带体获得预制体阴影)
    开发上门按摩系统对技师如何管理,薪资结构怎么设计
    什么是MQ和认识RabbitMQ
    高防CDN:网络安全的锁与钥匙
    julia笔记:复数
  • 原文地址:https://www.cnblogs.com/nefu-wangxun/p/16651320.html