Java 输入类型=";日期“;百里香

Java 输入类型=";日期“;百里香,java,hibernate,date,input,thymeleaf,Java,Hibernate,Date,Input,Thymeleaf,我需要将日期添加到我的实体中,并让用户在web表单中进行设置。 默认情况下,此字段需要填写今天的日期 1. <input type="date" value="2016-08-01"> 1。 显示为默认设置的正确日期 2. <input type="date" th:value="${startDate}"> 2。 显示不带任何值的日期选择器(注意:字符串startDate=“2016-08-01”) 3。 生成400错误(错误请求)(注意:Date sta

我需要将日期添加到我的实体中,并让用户在web表单中进行设置。 默认情况下,此字段需要填写今天的日期

1. <input type="date" value="2016-08-01"> 
1。
显示为默认设置的正确日期

2. <input type="date" th:value="${startDate}"> 
2。
显示不带任何值的日期选择器(注意:字符串startDate=“2016-08-01”)

3。
生成400错误(错误请求)(注意:Date startDate=new Date();)

所以,问题是:如何使用thymeleaf作为输入日期

  • 我可以使用Date()数据类型输入和存储这些数据吗
  • 我需要如何在表单中设置“th:field”
  • 我需要如何以相同的形式设置“th:value”
我的控制器:

@RequestMapping(“/project\u new”)
公共字符串createProject(模型){
项目=新项目();
列表角色=mRoleService.findAll();
project.setStart(新日期());
model.addAttribute(“页面标题”,“创建项目”);
model.addAttribute(“角色”,角色);
model.addAttribute(“Status”,Status.values());
model.addAttribute(“项目”,项目);
返回“project_new”;
}
@RequestMapping(value=“/project\u new”,method=RequestMethod.POST)
公共字符串createProject(@ModelAttribute项目,模型模型){
//填写project.RolesRequired的id字段
mRoleService.setRolesId(project.getRolesNeeded());
project.fixCollaboratorsAndRoles();
mProjectService.save(项目);
返回“重定向:/”;
}
我的模板:

<form th:action="@{/project_new}" method="post" th:object="${project}">
  <div class="project-list single">
    <label for="name">Name:</label>
    <input type="text" id="name" required="true" th:placeholder="*{name}" th:value="*{name}" th:field="*{name}"/>
    <label for="description">Description:</label>
    <textarea rows="5" id="description" type="text"  required="true" th:placeholder="*{description}" th:value="*{description}" th:field="*{description}"/>

    <label for="date-started">Date started:</label>
    <input type="date" th:value="${project.start}" th:field="${project.start}" id="date-started"/>

    <div>
      <label for="project_status">Project Status:</label>
      <div class="custom-select">
        <span class="dropdown-arrow"></span>
        <select th:field="*{status}" id="project_status">
          <option th:each="s : ${statuses}" th:value="${s}" th:text="${s}">Active</option>
        </select>
      </div>
    </div>

  <div class="roles-collaborators">
    <ul class="checkbox-list">
      <li th:if="${role.name} ne 'Undefined'" th:each="role : ${roles}">
      <input type="checkbox"  th:value="${role}" th:field="${project.rolesNeeded}" class="checkbox"/>
      <span th:text="${role.name}" th:value="${role}" class="checkbox">Developer</span>
      </li>
    </ul>
  </div>

  <div class="actions">
    <button type="submit" class="button">Save</button>
    <a th:href="@{/}" class="button button-secondary">Cancel</a>
  </div>
</div>
</form>

姓名:
说明:
开始日期:
项目状态:
活跃的
  • 开发商
拯救
项目实体:

@Entity
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Size (min = 3)
private String name;

@Column(columnDefinition="TEXT")
private String description;

@Column
private Status status;

@Column
private Date start;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
private List<Role> rolesNeeded;

@ManyToMany
@LazyCollection(LazyCollectionOption.FALSE)
private List<Collaborator> collaborators;

public Date getStart() {
    return start;
}

public void setStart(Date start) {
    this.start = start;
}
@实体
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@NotNull
@尺寸(最小值=3)
私有字符串名称;
@列(columnDefinition=“TEXT”)
私有字符串描述;
@纵队
私人身份;
@纵队
私人约会开始;
@许多
@LazyCollection(LazyCollectionOption.FALSE)
需要私人列表角色;
@许多
@LazyCollection(LazyCollectionOption.FALSE)
私人名单合作者;
公共日期getStart(){
返回启动;
}
公共作废设置开始(日期开始){
this.start=start;
}

查看带有错误日志的注释,似乎是
String
java.util.Date
之间的转换问题。在Thymeleaf GitHub中搜索了一段时间后,我发现了两个问题,可以解释在这种情况下如何继续:

  • 关于转换的讨论,包括中的日期
  • 解释了转换的实现
从最后一点开始,我为项目类的开始日期添加了一个注释:

// This is "org.springframework.format.annotation.DateTimeFormat"
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date start;
在那之后,我可以通过你的控制器POST方法收到日期


考虑到这一点,您还需要将日期值的模板中的
th:value
th:field
属性从
${project.start}
更改为
*{start}
,正如我在注释中所写的那样,就像您对
name
description
字段所做的那样。

使用字符串而不是日期

@DateTimeFormat(pattern = "yyyy-MM-dd")<br>
private String fromDate;
@DateTimeFormat(pattern=“yyyy-MM-dd”)
私有字符串fromDate;
您能否向我们展示GET和POST操作的控制器方法,以及thymeleaf表单?当然,已将其添加到问题中。请在模板中包含“表单”元素,并在项目类中包含属性“start”以及它的get和set方法。Done,added和Project类与getters/setters可以确认您从浏览器中得到的确切错误代码吗?它是哪个浏览器?谢谢,它可以工作!(我的意思是@DateTimeFormat)。无需将${Project.start}更改为*{start},因为它同样简单,我只喜欢“全名”语法:)然后注意完整语法。例如,如果您正在重构代码并更改“project”变量名,则需要同时更改“${project.start}”和所有其他完整语法;如果使用“*{field}”,则不会发生这种情况方法。要使所有日期返回该格式,您可以使用WebMVCConfiguer.registry.addFormatterForFieldType(Date.class,new DateFormatter(“yyyy-MM-dd”))仍然可以使用日期类型。仅添加@DateTimeFormat注释即可解决此问题。
// This is "org.springframework.format.annotation.DateTimeFormat"
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date start;
@DateTimeFormat(pattern = "yyyy-MM-dd")<br>
private String fromDate;