MyDataの更新
MyDataを更新する機能を追加する。
まず、HTMLテンプレートとして edit.html を用意した(前回)。
次にリポジトリに findById() メソッドを追加する。
package jp.abc.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import jp.abc.MyData;
@Repository
public interface MyDataRepository extends JpaRepository<MyData, Long> {
public Optional<MyData> findById(Long id);
}
コントローラに URL /edit/ を受け付けるメソッドを追加する。
@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
public ModelAndView edit(@ModelAttribute MyData mydata,
@PathVariable int id,
ModelAndView mav) {
mav.setViewName("edit");
mav.addObject("title", "edit mydata");
Optional<MyData> data = repository.findById((long)id);
mav.addObject("formModel", data.get());
return mav;
}
@RequestMapping(value = "/edit/{id}", method = RequestMethod.POST)
@Transactional(readOnly = false)
public ModelAndView update(@ModelAttribute MyData mydata,
ModelAndView mav) {
repository.saveAndFlush(mydata);
return new ModelAndView("redirect:/mydata");
}
エンティティの削除
HTMLテンプレート delete.html を追加する。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>top page</title>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<style type="text/css">
h1 {
font-size: 18pt;
font-weight: bold;
color: gray;
}
body {
font-size: 13pt;
color: gray;
margin: 5px 25px;
}
pre {
border: solid 3px #ddd;
padding: 10px;
}
tr {
margin: 5px;
}
th {
padding: 5px;
color: white;
background: darkgray;
}
td {
padding: 5px;
color: black;
background: #f0f0f0;
}
</style>
</head>
<body>
<h1>MyData delete page</h1>
<form method="post" action="/delete" th:object="${formModel}">
<input type="hidden" name="id" th:value="*{id}" />
<table>
<tr><td><p th:text="|名前 : *{name}|"></p></td></tr>
<tr><td><p th:text="|年齢 : *{age}|"></p></td></tr>
<tr><td><p th:text="*{mail}"></p></td></tr>
<tr><td><p th:text="*{memo}"></p></td></tr>
<tr><td><input type="submit" value="削除" /></td></tr>
</table>
</form>
</body>
</html>
コントローラに、削除関連のリクエストを受け取るメソッドを追加する。
@RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
public ModelAndView delete(@PathVariable int id,
ModelAndView mav) {
mav.setViewName("delete");
mav.addObject("title", "delete mydata");
Optional<MyData> data = repository.findById((long)id);
mav.addObject("formModel", data.get());
return mav;
}
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@Transactional(readOnly = false)
public ModelAndView remove(@RequestParam long id,
ModelAndView mav) {
repository.deleteById(id);
return new ModelAndView("redirect:/mydata");
}
エンティティのバリデーション
バリデーションは、エンティティのフィールドにアノテーションを追加することで入力値の制限ができる。
package jp.abc;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.Email;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Entity
public class MyData {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
@NotNull
private long id;
@Column(length = 50, nullable = false)
@NotEmpty
private String name;
@Column(length = 200, nullable = true)
@Email
private String mail;
@Column(nullable = true)
@Min(0)
@Max(200)
private Integer age;
@Column(nullable = true)
private String memo;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
}
コントローラの引数でバリデーションの結果を受け取る。
@RequestMapping(value = "/mydata", method = RequestMethod.POST)
public ModelAndView form(
@ModelAttribute("formModel") @Validated MyData mydata,
BindingResult result,
ModelAndView mav) {
if (!result.hasErrors()) {
repository.saveAndFlush(mydata);
return new ModelAndView("redirect:/mydata");
}
mav.setViewName("mydata");
mav.addObject("msg", "sorry, error is occured...");
Iterable<MyData> list = repository.findAll();
mav.addObject("datalist", list);
return mav;
}
HTMLテンプレートでエラーメッセージを表示する。
td {
padding: 5px;
color: black;
background: #f0f0f0;
}
.err {
color: red;
}
</style>
</head>
<body>
<h1>MyData page</h1>
<p th:text="${msg}"></p>
<form method="post" action="/mydata" th:object="${formModel}">
<ul>
<li th:each="error : ${#fields.detailedErrors()}" class="err"
th:text="${error.message}" />
</ul>
<table>
<tr>
<td><label for="name">名前</label></td>
<td><input type="text" name="name" th:value="*{name}" /></td>
</tr>