在java Web项目中处理前后端日期字段自动匹配绑定

简介: 在java开发中,经常会遇到前后端交互日期格式,一般我们都会用日期格式化来处理,但时间久了,你是否感觉到繁琐而且冗余呢,本文给出一种全新的解决思路。通过正则提取出日期数字,自动将前端传的日期字符串绑定到对象的日期格式属性上去,省去一切繁琐步骤。

在java开发中,经常会遇到前后端交互日期格式,一般我们都会用日期格式化来处理,但时间久了,你是否感觉到繁琐而且冗余呢,本文给出一种全新的解决思路。通过正则提取出日期数字,自动将前端传的日期字符串绑定到对象的日期格式属性上去,省去一切繁琐步骤。闲话少说,文归正传。

定义BaseController

public class BaseController implements ServletContextAware{
/**
     * 日志
     **/
    protected final Logger log = LoggerFactory.getLogger(BaseController.class);


    public HttpServletRequest request;
    public HttpServletResponse response;
    public HttpSession session;
    public ServletContext application;
    /**
     * 文件
     **/
    @Autowired(required = false)
    protected MultipartResolver multipartResolver;

    /**
     * @param code
     * @return
     */
    public static String respJson(CodeEnum code) {
        return respJson(code, null);
    }

    /**
     * @param code
     * @param data
     * @return
     */
    public static String respJson(CodeEnum code, Object data) {
        JSONObject jsono = new JSONObject();
        jsono.put("code", code.getCode());
        jsono.put("message", code.getMessage());
        if (data != null) {
            jsono.put("data", data);
        }
        return jsono.toJSONString();
    }

    /**
     *
     * @param code 错误码
     * @param message 内容
     * @return
     */
    public static String respJson(String code , String message ) {
        return respJson(code,message,null);
    }

    /**
     *
     * @param code
     * @param message
     * @param data
     * @return
     */
    public static String respJson(String code , String message , Object data){
        JSONObject jsono = new JSONObject();
        jsono.put("code",code);
        jsono.put("message",message);
        if (data != null) {
            jsono.put("data", data);
        }
        return JSON.toJSONString(jsono);
    }

    @ModelAttribute
    public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
        this.request = request;
        this.response = response;
        this.session = request.getSession();
    }

    public void setServletContext(ServletContext arg0) {
        this.application = arg0;
    }

    /**
     * 获取传递过来的参数
     */
    public String getParameter(String key) {
        return request.getParameter(key);
    }

    /**
     * 分页对象
     */
    public <T> Page<T> getPage(Class<T> clazz) {
        Page<T> page = new Page<T>();
        String pageNo = getParameter("pageNo");
        String pageSize = getParameter("pageSize");
        pageNo = pageNo == null || "".equals(pageNo) ? "1" : pageNo;
        pageSize = pageSize == null || "".equals(pageSize) ? "10" : pageSize;
        page.setSearchCount(true);
        page.setSize(Integer.valueOf(pageSize));
        page.setCurrent((Integer.valueOf(pageNo)));
        return page;
    }

    protected String redirectOuter(String url) {
        return "redirect:" + url;
    }

    /**
     * binder用于bean属性的设置
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, new DateEditor());
        binder.registerCustomEditor(String.class, new StringEscapeEditor());
    }

    /**
     * 获取传递过来的str参数,并给默认值
     */
    public String getStrParameter(String key, String defaultValue) {
        String str = getParameter(key);
        if (org.apache.commons.lang3.StringUtils.isEmpty(str)) {
            return defaultValue;
        }
        return str.trim();
    }

}

上述代码中initBinder方法上添加了一个@InitBinder注解,该方法会在请求时被调用,改方法中有个DateEditor类,日期的处理就是在这个里处理完的。

DateEditor类

class DateEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isEmpty(text)) {
            return;
        }
        text = text.trim();
        Pattern pattern = Pattern.compile("[^0-9]");
        Matcher matcher = pattern.matcher(text);
        text = matcher.replaceAll("");

        int length = text.length();
        Date date;
        switch(length){
            case 14:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmmss")).toDate();
                break;
            case 12:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmm")).toDate();
                break;
            case 10:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHH")).toDate();
                break;
            case 8:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMdd")).toDate();
                break;
            case 6:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMM")).toDate();
                break;
            case 4:
                date = DateTime.parse(text,DateTimeFormat.forPattern("yyyy")).toDate();
                break;
            default: return;
        }
        setValue(date);
    }
}

如何使用

上面准备完成后,在需要用到的controller中继承BaseController即可!
一般网上的例子仅支持如下格式的日期:

  • yyyyMMdd HH:mm:ss
  • yyyyMMdd HH:mm
  • yyyyMMdd HH
  • yyyyMMdd
  • yyyyMM
  • yyyy
    本文的方法,支持包含14、12、10、8、6、4个数字的所有字符串。
相关文章
|
21天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
8天前
|
Kubernetes Java 持续交付
小团队 CI/CD 实践:无需运维,Java Web应用的自动化部署
本文介绍如何使用GitHub Actions和阿里云Kubernetes(ACK)实现Java Web应用的自动化部署。通过CI/CD流程,开发人员无需手动处理复杂的运维任务,从而提高效率并减少错误。文中详细讲解了Docker与Kubernetes的概念,并演示了从创建Kubernetes集群、配置容器镜像服务到设置GitHub仓库Secrets及编写GitHub Actions工作流的具体步骤。最终实现了代码提交后自动构建、推送镜像并部署到Kubernetes集群的功能。整个过程不仅简化了部署流程,还确保了应用在不同环境中的稳定运行。
41 9
|
17天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
68 17
|
25天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
15天前
|
Java API 调度
Java 日期与时间处理:精准掌控时间流转
Java 8引入了全新的日期和时间API,解决了旧版`java.util.Date`和`Calendar`类设计不佳、操作繁琐的问题。新API包括`LocalDate`、`LocalTime`和`LocalDateTime`类,操作简洁直观,符合日常思维习惯。同时提供了`Period`和`Duration`处理时间间隔,以及`DateTimeFormatter`进行格式化输出。这些改进使开发者能更高效、准确地处理日期和时间,极大提升了开发效率与代码质量。 (239字符)
52 6
|
1月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
146 26
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
73 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
67 26
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
77 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
缓存 JSON 监控
如何在项目中保证 Web 组件化的性能
保证 Web 组件化的性能需要从多个方面入手,综合运用各种优化方法和策略。通过持续的优化和改进,能够提高组件化的整体性能,为用户提供更好的体验,同时也有助于提高项目的开发效率和质量。
53 8