かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Spring Bootでリクエストパラメータをオブジェクトで受け取る

@RequestParam("hoge")をメソッドの引数に使って1つ1つ受け取るのもいいですが、数が増えてくると1つのクラスにまとめたくなったりしますよね。そんな時に使えるのが@ModelAttributeアノテーション。

こんな入力フォームがあるとして

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>Insert title here</title>
</head>
<body>
    <form method="post" action="/">
        <label for="name">名前:</label><input name="name" type="text" /><br />
        <label for="age">年齢:</label><input name="age" type="text" /><br /> 
        <input type="submit" value="送信" />
    </form>

    <div th:if="${person} != null">
        <span>入力情報</span>
        <div>
            <span th:text="${person.name}">ほげほげ</span> 
            <span th:text="${person.age}">99</span> 
            <span></span>
        </div>
    </div>
</body>
</html>

nameとageという入力項目があるので、こんなクラスの入れ物を用意します。

package helloboot.modelattr.controllers;

public class PersonForm {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}

あとは、このPersonFormクラスをModelAttributeアノテーションをつけてメソッドの引数に渡すだけでOK。

package helloboot.modelattr.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HelloController {
    @RequestMapping(name = "/", method = { RequestMethod.GET })
    public String get() {
        return "index";
    }
    
    @RequestMapping(name = "/", method = { RequestMethod.POST })
    public String post(@ModelAttribute PersonForm form, Model model) {
        model.addAttribute("person", form);
        return "index";
    }
}

お手軽お手軽。