2014-04-01 89 views
4

我已经使用Intellij中的Spring Web应用程序创建了一个包含大量字符串的基本输入窗体。当仅使用字符串时,表单成功保存到后端,因此我决定在模型中添加一个日期字段,并尝试修改到controller/jsp以在输入表单中接受此内容(并显示在记录列表中)。我遇到输入表单无法获得价值的问题。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/"; 
} 

我的调试显示截止日期:空,所以没有发送我的日期字段从表格发布时。这意味着日期字段从不保存,然后资源库保存发生。

+0

我不确定为什么截止日期可能为空,但输入元素的值属性具有需要更改的引号t o单引号或逃脱。 – anirudh

回答

10

您必须在您的控制器中注册一个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

尝试使用弹簧输入,如:

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

这是不使用的,您没有提供价值可言。

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。

由于这是一个insert(不更新)的输入表单,我不想在for(yet!)中包含一个值。

0

你不需要在这里的InitBinder: 首先修改你喜欢的jsp中巴苏Rishav说:

<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") 

春将尽的结合。

当然,它只适用于在其他视图中使用相同格式的日期。如果不是,则需要InitBinder。

2

在弹簧

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

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

在你的JSP使用由DateTimeFormat提供注解的日期将自动绑定没有错误模型类

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

注:日期格式必须为DD-MM- yy ie 27-10-2017如果使用其他格式,将导致异常

相关问题