こちらの記事で、Sprint Boot2を使って文書をポストするだけの簡単なWebアプリケーションを構築しましたが、
今回はそれに編集機能を付けてみたいと思います。
動作イメージはこちら。
既にエントリされている各行に[編集]ボタンが存在しています。例えば三番目の行のボタンをクリックすると・・・

編集画面に遷移します。フォームには既存のデータが表示されています。

内容を書き換え、[送信]ボタンをクリック。

内容が書き変わった状態でトップページに戻ります。

前回のプログラムからの変更点は以下です。
edit.htmlの作成
編集用ページとして、[編集]ボタンを押下して遷移するedit.htmlを新規に作成します。
「名前」「投稿内容」そして「送信」ボタンを設けます。
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>edit page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
table { border-collapse: collapse; }
table th { padding: 10px; border: solid 1px black; }
table td { padding: 3px 10px; border: solid 1px black; }
</style>
</head>
<body>
<h1>sample edit page</h1>
<table>
<form method="post" action="/edit" th:object="${editModel}">
<input type="hidden" name="id" th:value="*{id}" />
<tr>
<td><label for="name">名前</label></td>
<td><input type="text" name="name" th:value="*{name}" /></td>
</tr>
<tr>
<td><label for="post">投稿内容</label></td>
<td><input type="text" name="post" th:value="*{post}" /></td>
</tr>
<tr>
<td><input type="submit" /></td>
</tr>
</form>
</table>
</body>
</html>
index.htmlの修正
index.htmlに[編集]ボタンを付けていきます。
ボタンと共に、新たにformタグも追加します。
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>top page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
table { border-collapse: collapse; }
table th { padding: 10px; border: solid 1px black; }
table td { padding: 3px 10px; border: solid 1px black; }
</style>
</head>
<body>
<h1>sample entry page</h1>
<form method="post" action="/" th:object="${formModel}">
<table>
<tr>
<td><label for="name">名前</label></td>
<td><input type="text" name="name" th:value="*{name}" /></td>
</tr>
<tr>
<td><label for="post">投稿内容</label></td>
<td><input type="text" name="post" th:value="*{post}" /></td>
</tr>
<tr>
<td><input type="submit" /></td>
</tr>
</table>
</form>
<br />
<table>
<tr><th>ID</th><th>名前</th><th>投稿内容</th></tr>
<tr th:each="obj : ${postlist}">
<form method="post" action="/" th:object="${formModel}">
<input type="hidden" name="id" th:value="${obj.id}" />
<td th:text="${obj.id}"></td>
<td th:text="${obj.name}"></td>
<td th:text="${obj.post}"></td>
<td><input type="submit" name="edit" value="編集"/></td>
</form>
</tr>
</table>
</body>
</html>
Repositoryの修正
次にSampleDataRepositoryに編集メソッドを追加します。
RepositoryにはCRUDメソッド自動生成機能があるので、findByIDを定義するだけで、IDをキーにデータベースのテーブルを検索する機能を実装することができます。
package com.example.demo.repositories;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.SampleEntryData;
@Repository
public interface SampleDataRepository extends JpaRepository<SampleEntryData, Long>{
public Optional<SampleEntryData> findById(Long id);
}
Controllerの修正
最後にControllerクラスを修正します。
トップページから[編集]ボタン押下で送られてくるパラメータはPOST送信することにし、実装済みのformメソッドで条件分岐することにしました。
IDがセットされていなければ新規登録、セットされていれば編集というように場合分けを行っています。
また、edit.htmlで編集したデータを処理するのにupdateメソッドを新規作成しました。データ編集後、トップページにリダイレクトしています。
package com.example.demo;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.example.demo.repositories.SampleDataRepository;
@Controller
public class SampleEntryController {
@Autowired
SampleDataRepository repository;
@RequestMapping(value="/", method=RequestMethod.GET)
public ModelAndView index(@ModelAttribute("formModel") SampleEntryData sedata, ModelAndView mav) {
mav.setViewName("index");
Iterable<SampleEntryData> list = repository.findAll();
mav.addObject("postlist", list);
return mav;
}
@RequestMapping(value="/", method=RequestMethod.POST)
@Transactional(readOnly=false)
public ModelAndView form(@ModelAttribute("formModel") SampleEntryData sedata, ModelAndView mav) {
if (sedata.getId() == 0) {
repository.saveAndFlush(sedata);
return new ModelAndView("redirect:/");
} else {
mav.setViewName("edit");
Optional<SampleEntryData> data = repository.findById((long) sedata.getId());
mav.addObject("editModel", data.get());
return mav;
}
}
@RequestMapping(value = "/edit", method = RequestMethod.POST)
@Transactional(readOnly = false)
public ModelAndView update(@ModelAttribute SampleEntryData sedata, ModelAndView mav) {
repository.saveAndFlush(sedata);
return new ModelAndView("redirect:/");
}
}

