JSP表单日期输入字段

时间:2014-04-01 13:44:01

标签: spring jsp tomcat intellij-idea

我使用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/";
}

我的调试显示截止日期:null,因此在发布时,表单中的日期字段没有发送任何内容。这意味着永远不会保存日期字段,然后发生存储库保存。

5 个答案:

答案 0 :(得分:11)

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

 @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" />"/>

答案 1 :(得分:3)

在模型类中使用DateTimeFormat by spring提供的注释

import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

@DateTimeFormat(pattern = "MM-dd-yyyy")
private Date birthdate;

在你的jsp中,日期将自动绑定而不会出现错误

<form:input path="birthdate" cssClass="form-control" />

注意:日期格式必须为dd-mm-yy,即27-10-2017如果使用其他格式则会导致异常

答案 2 :(得分:1)

尝试使用弹簧输入,如:

<div class="control-group">
   <form:label cssClass="control-label" path="dueDate">Due Date:</form:label>
    <div class="controls">
      <form:input path="dueDate" class="date" />
    </div>
</div>

并在dueDate输入中:

value="<fmt:formatDate value="" pattern="MM-dd-yyyy" />"

这是未使用的,你根本没有提供任何价值。

答案 3 :(得分:0)

我已经使用了上述解决方案的组合,它似乎有效(保持并将值正确返回到屏幕)。我的jsp是:

   <div class="control-group">
        <form:label cssClass="control-label" path="dueDate">Due Date:</form:label>
        <div class="controls">
            <form:input path="dueDate" class="date" />
        </div>
    </div>

我已经添加了上述的Initbinder。

由于这是插入的输入表单(不是更新),我不想在for上包含值(还有!)。

答案 4 :(得分:0)

这里不需要InitBinder: 首先修改你的jsp像Rishav Basu说:

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

因为你没有给你的输入任何价值。

然后在您的实体中更改@DateTimeFormat,如下所示:

@DateTimeFormat(pattern = "MM-dd-yyyy")

Spring会做绑定。

当然,只有在其他视图中使用相同的日期格式时,它才有效。如果没有,则需要InitBinder。