かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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";
    }
}

お手軽お手軽。