前回までで登録ボタンを押してタスクを登録しようとしても、エラーになってしまいます。
HomeControllerクラスに、タスクを登録するためのエンドポイントが作られていないためです。
なので、タスクを登録するためのエンドポイントをHomeControllerクラスに追加します。
@GetMapping("/add")
String addItem(@RequestParam("task") String task,
@RequestParam("deadline") String deadline) {
String id = UUID.randomUUID().toString().substring(0, 8);
TaskItem item = new TaskItem(id, task, deadline, false);
taskItems.add(item);
return "redirect:/list";
}
まず@GetMapping("/add")のaddItemメソッドは、
以下のhome.htmlの入力フォームのリクエスト先としてされています。
<div class="task_form">
<h2>タスクの登録</h2>
<form action="/add">
<label>タスク</label>
<input name="task" type="text" />
<label>期限</label>
<input name="deadline" type="date" />
<input type="submit" value="登録" />
</form>
</div>
メソッド内については、以前記事にしたので省略します。
【Spring Boot】@GetMapping、@RequestParamについて - たなかのJava日記
ただ、戻り値が大きく異なることに注意してください。
■listItemsメソッドの戻り値
return "home";
HTMLテンプレートの名称を返していた
■addItemメソッドの戻り値
return "redirect:/list";
"redirect:/〇〇"とした場合には、
○○の部分には表示するWebページを指定のパスにリダイレクトするという意味になります。
今回はパスの部分を"/list"としているので、listItemsメソッドのエンドポイントにリダイレクトされることを意味しているわけです。
それでは、この状態でプロジェクトを再実行しブラウザでアクセスします。
http://localhost:8888/home
※ポート番号は自分で指定した値を使用する
タスクも登録できて反映されたら成功です。
ここまで追加してきたHomeControllerクラスは以下になります。
package jp.gihyo.projava.tasklist;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Controller
public class HomeController {
record TaskItem(String id, String task, String deadline, boolean done) {}
private List<TaskItem> taskItems = new ArrayList<>();
@GetMapping("/list")
String listItems(Model model) {
model.addAttribute("taskList", taskItems);
return "home";
}
@GetMapping("/add")
String addItem(@RequestParam("task") String task,
@RequestParam("deadline") String deadline) {
String id = UUID.randomUUID().toString().substring(0, 8);
TaskItem item = new TaskItem(id, task, deadline, false);
taskItems.add(item);
return "redirect:/list";
}
}