Spring MVCでフォームやAjaxリクエストから、リストなどのコレクション型パラメータを受け取る方法を2つ紹介します。
方法1:POJOラッパーを使用する
コレクションをプロパティとして持つラッパーオブジェクトを定義し、そのオブジェクトをコントローラの引数で受け取ります。
ラッパークラス
public class RequestForm {
private List<Member> members;
// getter / setter
public List<Member> getMembers() { return members; }
public void setMembers(List<Member> members) { this.members = members; }
}
注意:メンバークラスのフィールドにはラッパー型ではなく、基本型(intなど)を使用しないとエラーになる場合があります。
コントローラ
@PostMapping("/submit")
@ResponseBody
public ModelAndView handleList(RequestForm form) {
List<Member> members = form.getMembers();
members.forEach(m -> System.out.println(m));
ModelAndView mv = new ModelAndView("result");
mv.addObject("memberList", members);
return mv;
}
フォーム(JSP)
<form action="/submit" method="post">
名前1: <input type="text" name="members[0].name"><br>
年齢1: <input type="text" name="members[0].age"><br>
名前2: <input type="text" name="members[1].name"><br>
年齢2: <input type="text" name="members[1].age"><br>
<input type="submit" value="送信">
</form>
結果表示(JSP)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table border="1">
<thead>
<tr>
<td>名前</td>
<td>年齢</td>
</tr>
</thead>
<tbody>
<c:forEach var="m" items="${memberList}">
<tr>
<td>${m.name}</td>
<td>${m.age}</td>
</tr>
</c:forEach>
</tbody>
</table>
方法2:@RequestBody + Ajax(JSON)
JavaScriptからJSON形式で配列を送信し、コントローラ側で@RequestBodyアノテーションを使って直接受け取る方法です。
コントローラ
@PostMapping("/ajax-receive")
@ResponseBody
public void receiveList(@RequestBody List<Member> members) {
members.forEach(m -> System.out.println(m.getName() + " : " + m.getAge()));
}
クライアント側(JavaScript/jQuery)
<script>
let users = [
{ name: "田中太郎", age: 25 },
{ name: "鈴木花子", age: 30 }
];
$(function() {
$("#sendBtn").click(function() {
$.ajax({
url: "/ajax-receive",
type: "POST",
data: JSON.stringify(users),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(res) {
console.log("送信成功");
}
});
});
});
</script>
contentTypeにapplication/jsonを指定することが重要です。また、JacksonなどのJSONライブラリがクラスパスに存在する必要があります。