Help us understand the problem. What is going on with this article?

Springで画面の入力値を受け取る

More than 3 years have passed since last update.

超基本的な内容です(自分の備忘録)。
画面のあるWebアプリを開発していると、画面での入力値をPOSTしてサーバ側で受け取りその値を新規登録・更新・削除、、、なんてのがよくあると思います。本記事は、SpringではPOSTした値をサーバ側で受け取る時にどのような実装になるのか、というお話です。
ちなみにSAStrutsなんかだと、その部分の実装は以下のような感じです。

@ActionForm
@Resource
protected AddForm addForm;

@Execute
public String add() {
    // 何らかの処理
    String id = addForm.id;
    // 何らかの処理
    return "list.jsp?redirect=true";
}

@ActionFormアノテーション、@Resourceアノテーションをつけるだけで、自動的にPOSTされた値がaddFormオブジェクトの各フィールドにマッピングされ、対象のExecuteメソッドの中で利用出来るようになります。

ここでは、画面上に苗字(firstName)、名前(lastName)の2つのテキストボックスがあるものとして、これらをPOSTしてみる、、というのを例にまとめてみます。

Formクラスの作成

まずは、画面上での入力値を保持するFormクラスの作成が必要です(このあたりは他のFWとかも一緒ですね)。ただSAStrutsしかやったことのない人、注意が必要です、このFormクラスはsetter/getterが必要になってきます。

CustomerForm.java
package com.example.form;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

public class CustomerForm {

    @NotNull
    @Size(min = 1, max = 127)
    private String firstName;

    @NotNull
    @Size(min = 1, max = 127)
    private String lastName;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

ちなみに、setter/getterを作ってあげないと、以下みたいな感じで実行時に怒られます。

org.springframework.beans.NotReadablePropertyException: Invalid property 'lastName' of bean class [com.example.form.CustomerForm]: Bean property 'lastName' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

ControllerクラスでFormを受け取る

画面上での入力値を保持するFormクラスをControllerクラスで受け取ってみます。

CustomerController.java
package com.example.web;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.domain.Customer;
import com.example.form.CustomerForm;
import com.example.service.CustomerService;

@Controller
@RequestMapping("customers")
public class CustomerController {

    @Autowired
    CustomerService customerService;

    @ModelAttribute
    CustomerForm setUpForm() {
        return new CustomerForm();
    }

    

    @RequestMapping(value = "create", method = RequestMethod.POST)
    String create(@Validated CustomerForm form, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return list(model);
        }
        Customer customer = new Customer();
        BeanUtils.copyProperties(form, customer);
        customerService.create(customer);
        return "redirect:/customers";
    }
    
}
  1. @ModelAttributeアノテーションを利用して、受け取りたいFormクラスを初期化してreturnします。このアノテーションがついているメソッドは、このクラスのRequestMappingアノテーションがついたいずれかのメソッド実行前に呼ばれます(そのメソッドの中でそのFormを利用している・していないは関係なし)。なお、このアノテーションが付いたメソッドの戻り値は自動でリクエストスコープに設定され(つまり、JSPやThymeleafから参照できる)、Modelオブジェクトに追加されます。Modelオブジェクトに追加される時の属性名はデフォルトで、クラス名の先頭を小文字にした値になります。Modelオブジェクトとは、Springが用意するMapオブジェクトで、Viewに渡すオブジェクトを設定します。
  2. 実際にFormを利用するメソッド(ここではcreateメソッド)の引数でFormクラスのインスタンスを受け取ります(この時点で既にFormには画面上での入力値は入っている状態です)。

以上です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした