メンバー追加機能を実装しよう
このページではメンバーの追加機能を実装します。
Mapper
まずはマッパーの設定を追加します。
MemberMapper.java
add
メソッドを追加します。
@Mapper
public interface MemberMapper {
List<Member> all();
List<Member> findByNameLike(String words);
void add(Member member);
}
INSERT 文はクエリ結果を返さないので、戻り値型は void
にしています。
MemberMapper.xml
続いて、add
メソッドに対応する SQL を定義します。
<mapper namespace="com.example.search.mappers.MemberMapper">
<!-- 中略 -->
<insert id="add" parameterType="com.example.search.domains.Member">
INSERT INTO members(name) VALUES (#{name});
</insert>
</mapper>
今回は <select>
の代わりに <insert>
を使用します。
また parameterType
は基本型ではなく Member
型ですので、com
から始まるパッケージ名で指定する必要があります。
もう一点注目してほしいのは、引数の展開方法です。#{name}
というようにプロパティ名で記述します(${member.name}
ではない)。
Controller
// 追加分のみ記載
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class MemberController {
// 中略(変更なし)
@GetMapping("/create")
public String showCreateForm() {
return "create";
}
@PostMapping("/create")
public String create(@RequestParam("member_name") String memberName) {
Member member = new Member(memberName);
memberMapper.add(member);
return "redirect:/";
}
}
showCreateForm メソッド
このメソッドは入力画面を返すだけなのでシンプルです。
create メソッド
このメソッドは POST 送信を受け取るメソッドです。
ポイントは2つあります。
ポイント1:POST データを受け取る
メソッドの引数に @RequestParam
アノテーションを付与します。アノテーションの引数("member_name"
)は POST で送信されるデータのキーです。HTML 的にいうと input 要素の name 属性です。
<input name="member_name" />
で送られてきたデータが、
public String create(@RequestParam("member_name") String memberName) {
という記述で memberName
に格納されて渡されるということです。
ポイント2:リダイレクト
メンバーの追加処理が終わったら、TOP ページにリダイレクト^1します。
リダイレクトの場合の返却値は、下記の形式の文字列です。
redirect:{リダイレクト先のパス}
Domain
コントローラーに new Member(name)
と記述しましたが、Member.java
には name
だけを受け取るコンストラクタがありませんので、追加しましょう。
package com.example.search.domains;
public class Member {
// 中略(変更なし)
public Member(String name) {
this.name = name;
}
// 中略(変更なし)
}
Template
src/main/template
に create.html
を追加します。
このテンプレートは Thymeleaf の機能は使っていませんね。
<!doctype html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Demo</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" />
</head>
<body>
<header class="mb-4">
<nav class="navbar navbar-light bg-light">
<a href="/" class="navbar-brand">Spring Demo</a>
</nav>
</header>
<div class="container">
<div class="row">
<div class="col-md-6 offset-md-3">
<div class="card">
<div class="card-body">
<form action="/create" method="post">
<div class="form-group">
<label for="member_name">名前</label>
<input type="text" class="form-control" id="member_name" name="member_name" required />
</div>
<div class="text-right">
<button class="btn btn-primary" type="submit">追加する</button>
</div>
</form>
</div><!-- .card-body -->
</div><!-- .card -->
<div class="mt-3">
<a href="/">TOP画面へ</a>
</div>
</div><!-- .col -->
</div><!-- .row -->
</div>
</body>
</html>
アプリケーションを再起動する
以上ですべての機能を実装しました。
アプリケーションを再起動して機能を確かめてみましょう。