【问题标题】:How to pass LocalDateTime from jsp to controller using java8 api(LocalDateTime)?如何使用 java8 api(LocalDateTime)将 LocalDateTime 从 jsp 传递到控制器?
【发布时间】:2017-05-10 20:53:10
【问题描述】:

我需要你的帮助。假设我的 JSP 中有 form:form,而里面 form:form 是 form:input with date.. 如下:

    <form:form modelAttribute="personalTask" method="POST" action="${pageContext.request.contextPath}/taskmgr/add">
    (...)
            <div class="input-group">
                    <form:input path="startDate" type="date" id="startDateTimePicker" name="search_message[displayDateFrom]" placeholder="YYYY-MM-DD hh:mm:ss" class="input-sm form-control"></form:input>
                    <div class="input-group-addon">
                            <span class="glyphicon glyphicon-calendar"> </span>
                    </div>
            </div>  
    (...)
    </form:form>

在控制器中我有方法:

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addProfileTask(@ModelAttribute("personalTask")PersonalTask task, Principal principal){

            return "taskManager";
    }

PersonalTask​​ 看起来像:

    public class PersonalTask{
    (...)
            @Column(name = "START_DATE", columnDefinition="TIMESTAMP", nullable = false)
            private LocalDateTime startDate;
    (...)
            public LocalDateTime getStartDate() {
                    return startDate;
            }
            public void setStartDate(LocalDateTime startDate) {
                    this.startDate = startDate;
            }
    (...)
    }

问题是...如何从 JSP 传递日期时间并与 @ModelAttribute("personalTask​​")PersonalTask​​ 任务绑定??

【问题讨论】:

    标签: java spring jsp controller java-8


    【解决方案1】:

    使用Spring Converters,spring 已经有一个内置转换器@DateTimeFormat 用于DateTime 数据类型,从文档来看,它已经支持java.time.LocalDateTime

    支持按样式模式、ISO 日期时间模式或自定义格式模式字符串格式化。可应用于 java.util.Date、java.util.Calendar、java.lang.Long、Joda-Time 值类型;从 Spring 4 和 JDK 8 开始,也适用于 JSR-310 java.time 类型

    例子:

    public class PersonalTask{
        @DateTimeFormat(pattern="dd/MM/yyyy")  // or any pattern you prefer 
        @Column(name = "START_DATE", columnDefinition="TIMESTAMP", nullable = false)
        private LocalDateTime startDate;
    }
    

    【讨论】:

    • 当我添加这个注释 @DateTimeFormat(pattern = "YYY-MM-DD HH:MM:SS") private LocalDateTime startDate;我正在尝试: PersonalTask​​ p= new PersonalTask​​(); p.setStartDate(LocalDateTime.now()); System.out.println(p.getStartDate());它打印:2017-05-11T01:07:14.902 我做错了什么?
    • @CSource 打印是另一回事,您的问题是关于将给定的字符串用户请求输入解析为 LocalDateTime 实例,而不是相反
    • 好的,我明白了,您的解决方案非常有帮助 @DateTimeFormat(iso = ISO.DATE_TIME) - 不起作用 @DateTimeFormat(pattern = "yyyy-MM-dd' 'HH:mm:ss" ) - 不起作用 @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") - 不起作用 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - 有效就我而言
    【解决方案2】:

    可以使用格式化字符串创建新的 LocalDateTime 对象:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    LocalDateTime dateTime = LocalDateTime.parse(dateInitializer, formatter);
    

    使用从您的 JSP 表单中获取的日期来实例化一个新的 LocalDateTime 对象并将其传递给您的 PersonTask 对象

    将日期输入中的字符串绑定到 PersonTask 中的字段并使用它来实例化 LocalDateTime 对象:

    public class PersonalTask{
    (...)
            private String dateInitializer;
    
            @Column(name = "START_DATE", columnDefinition="TIMESTAMP", nullable = false)
            private LocalDateTime startDate;
    
            public PersonalTask(){
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                startTime = LocalDateTime.parse(dateInitializer, formatter);
            }
    (...)
            public LocalDateTime getStartDate() {
                    return startDate;
            }
            public void setStartDate(LocalDateTime startDate) {
                    this.startDate = startDate;
            }
    (...)
    }
    

    在 JSP 中:

    <form:input path="dateInitializer" type="date" id="startDateTimePicker" name="search_message[displayDateFrom]" placeholder="YYYY-MM-DD hh:mm:ss" class="input-sm form-control"></form:input>
    

    【讨论】:

    • 如果我想直接传递整个 PersonalTask​​ 对象,并在控制器中拦截 PersonalTask​​ 对象怎么办?我不想划分数据..
    • 我不确定是否可以直接将日期输入转换为 localdatetime 但如果将日期输入中的字符串绑定到 PersonTask 中的字段并使用它来创建 localdatetime 对象
    • 加载类时执行静态块,并且是放置静态变量初始化的好地方......这个解决方案不起作用。但可能我会使用您提出的解决方案的一部分。
    • 好点。也许将静态块内容移动到构造函数?
    猜你喜欢
    • 1970-01-01
    • 2015-08-04
    • 2016-02-09
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多