2016-08-01 14 views
7

Muszę dodać datę do mojej jednostki i pozwolić użytkownikowi ustawić ją w formularzu internetowym. To pole musi być domyślnie wypełnione dzisiejszą datą.Typ wejściowy = "data" thymeleaf

1. <input type="date" value="2016-08-01"> 

pokazuje prawidłową datę setted dla domyślnie

2. <input type="date" th:value="${startDate}"> 

pokazuje wyboru daty bez wartości (uwaga: String startDate = "01.8.2016";)

3. <input type="date" th:field="${startDate}"> 

generuje 400 error (Bad request) (note: Date startDate = new Date();)

Pytanie brzmi: jak użyć thymeleaf do wprowadzenia daty ?

  • Czy mogę użyć danych typu Date() do wprowadzania i przechowywania takich danych?
  • Jak ustawić "th: field" w formularzu?
  • Jak ustawić "th: value" w tej samej formie?

Mój sterownik (s):

@RequestMapping("/project_new") 
public String createProject(Model model) { 
    Project project = new Project(); 
    List<Role> roles = mRoleService.findAll(); 

    project.setStart(new Date()); 

    model.addAttribute("page_title", "create project"); 
    model.addAttribute("roles", roles); 
    model.addAttribute("statuses", Status.values()); 
    model.addAttribute("project", project); 
    return "project_new"; 
} 

@RequestMapping(value = "/project_new", method = RequestMethod.POST) 
public String createProject(@ModelAttribute Project project, Model model) { 
    // Fill id field for project.rolesNeeded 
    mRoleService.setRolesId(project.getRolesNeeded()); 
    project.fixCollaboratorsAndRoles(); 

    mProjectService.save(project); 
    return "redirect:/"; 
} 

Mój szablon:

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

jednostka Projekt:

@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; 
} 
+0

Czy możesz pokazać nam metody kontrolerów dla twoich akcji GET i POST, a także formularz thymeleaf? – BitExodus

+0

Pewnie, dodałem to do pytania – zzheads

+0

Proszę uwzględnić element "formularz" w szablonie i klasie Projektu za pomocą właściwości "start" oraz metody pobierania i ustawiania dla niej. – BitExodus

Odpowiedz

9

Przyjrzeniu komentarzu z błędem logowania go wydaje się być problemem konwersji między String do java.util.Date. Po poszukiwaniach na chwilę w Thymeleaf GitHub Widziałem dwie kwestie, które mogą wyjaśnić, jak postępować w tym przypadku:

  • dyskusji o konwersji w tym dniu w this issue.
  • Implementacja konwersji została wyjaśniona here.

Od ostatniego punktu, dodałem adnotację datą rozpoczęcia swojej klasie projektu:

// This is "org.springframework.format.annotation.DateTimeFormat" 
@DateTimeFormat(pattern = "yyyy-MM-dd") 
private Date start; 

A potem udało mi się otrzymać datę w swojej metodzie kontroler POST.

Uwzględnić trzeba także zmienić „th: wartość” i „th: pola” atrybuty z szablonu do wartości daty z $ {project.start} do * {start} jak ja pisał w komentarzach, tak jak w polach o nazwach i opis.

+1

Dzięki, to działa! (mam na myśli @DateTimeFormat). Nie trzeba zmieniać $ {project.start} na * {start}, ponieważ jest tak samo proste, ja po prostu preferuję składnię "pełnej nazwy" :) – zzheads

+1

Po prostu zachowaj ostrożność, korzystając z pełnej składni. Jeśli np. Refaktoryzujesz swój kod i zmienisz nazwę projektu "projekt", musisz zmienić także "$ {project.start}" i wszystkie inne pełne wystąpienia składni; tak się nie stanie, jeśli użyjesz metody "* {field}". – BitExodus

Powiązane problemy