小编典典

JSP表单日期输入字段

jsp

我已经使用Intellij中的Spring
Web应用程序创建了一个带有许多字符串的基本输入表单。仅使用字符串时,表单成功保存到了后端,因此我决定在模型中添加一个日期字段,并尝试修改为controller
/ jsp以在输入表单中接受它(并显示在记录列表中)。输入表单无法获取值时出现问题。

实体:

@Temporal(TemporalType.DATE)
@DateTimeFormat(pattern="dd.MM.yyyy")
private Date dueDate;

public Date getDueDate() {
    return dueDate;
}

public void setDueDate(Date dueDate) {
    this.dueDate = dueDate;
}

JSP(我假设这里的值应该为空,因为我是从一个空字段开始填写?):

    <div class="control-group">
        <form:label cssClass="control-label" path="dueDate">Due Date:</form:label>
        <div class="controls">
            <input type="text" path="dueDate" class= "date" name = "dueDate" value = "<fmt:formatDate value="" pattern="MM-dd-yyyy" />"/>
        </div>
    </div>

控制器:

@RequestMapping(value = "/todos/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute("todo") Todo todo, BindingResult result) {
    System.err.println("Title:"+todo.getTitle());
    System.err.println("Due Date:"+todo.getDueDate());
    todoRepository.save(todo);
    return "redirect:/todos/";
}

我的调试显示Due Date:null,所以发布时表单中的date字段没有任何发送。这意味着永远不会保存日期字段,然后进行存储库保存。


阅读 906

收藏
2020-06-08

共1个答案

小编典典

您必须在控制器中注册一个InitBinder,以便spring将日期字符串转换为java.util.Date对象并在command对象中进行设置。在您的控制器中包括以下内容:

 @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
        sdf.setLenient(true);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }

使用以下命令修改您的jsp:

<input type="text" path="dueDate" class= "date" name = "dueDate" value = "<fmt:formatDate value="${cForm.dueDate}" pattern="MM-dd-yyyy" />"/>
2020-06-08