🙌

Spring FrameworkでWebアプリ作りたい #03 リクエストパラメータ(その2)

2024/02/02に公開

はじめ

前回

画面に値を渡す。フォーム送信値を受け取る。
https://zenn.dev/indonegiyan/articles/5ad475c254b9e8

今回

  • フォーム送信から複数の値をまとめて受け取る(2つの方法)。

1. 環境とプロジェクト作成

環境

  • Windows 10 pro
  • eclipse 2022-12
  • MySQL 8.0.33

プロジェクト作成

前回(#02)の続き。
プロジェクト作成手順は#01を参照。

パッケージエクスプローラーの主な構成
src/main/java
    └ com.example.demo
        ├ test1
        |   └ TestCtrl.java
        └ TestSpringApplication.java

src/main/resources
    ├ templates
    |   └ hello.html
    ├ static
    └ application.propaties

build.gradle

2. 複数の値を1つずつ引数で受け取る

まずは前回の方法で、引数に1つずつ記述して受け取る場合です。

ビュー側

src/main/resources
    └ templates
        └ hello.html
hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	[[${msg}]]
	<form th:action="@{/send}" method="post">
		<input type="text" name="text1"><br>
		<input type="text" name="text2"><br>
		<input type="text" name="text3">
		<input type="submit" value="送信">
	</form>
</body>
</html>

コントローラ側

引数に1つ1つ指定します。
コメントアウト部分はもし引数名とneme属性値が異なっている場合の指定方法です。

src/main/java
    └ com.example.demo
        └ test1
            └ TestCtrl.java
TestCtrl.java
package com.example.demo.test1;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class TestCtrl {

	@GetMapping("/hello")
	public String hello(Model m) {
		String hello = "Hello, World!";
		m.addAttribute("msg", hello);
		return "hello";
	}
	
	@PostMapping("/send")
	public String getForm(Model m, @RequestParam String text1, 
                                    @RequestParam String text2,
                                    @RequestParam String text3) {
	//public String getForm(Model m, @RequestParam("text1") String f1, 
	//                                    @RequestParam("text2") String f2, 
	//                                    @RequestParam("text3") String f3) {
		
		System.out.println(text1+ " " + text2 + " " + text3);
	//	System.out.println(f1 + " " + f2 + " " + f3);

		m.addAttribute("msg", "");
		return "hello";
	}
}

実行結果

http://localhost:8080/helloにアクセス。
フォームに値を入れて送信をクリックします。

コンソールに入力値「aaaa bbbb cccc」が出力され、リクエストパラメータを受け取ることができました。

3. 複数の値をまとめて受け取る

フォームでやり取りするパラメータが多いと、いちいち引数に書くのは面倒だし後々のメンテナンス考えると…そっ閉じ。
引数1つでまとめて受け取りたい!ということでその方法があります。

まずビューのフォーム用クラスを作成します。

フォーム用クラス

TestFrmクラスを新規作成します。

src/main/java
    └ com.example.demo
        └ test1
            └ TestCtrl.java
            └ TestFrm.java

クラスの宣言の上に@Dataアノテーションを付与します。
lombok.Dataをインポートします。
@Dataができることは

  • getter
  • setter
  • toString
  • equals
    などを定義しなくても使えるようになります。

参考:
https://penguinlabo.hatenablog.com/entry/java/lombok/list

変数名は引数で個々に受け取るときと同様に、name属性値に合わせておけば自動で判断してくれます。

TestFrm.java
package com.example.demo.test1;

import lombok.Data;

@Data
public class TestFrm {
	private String text1;
	private String text2;
	private String text3;
}

ビュー側

変更なし。

コントローラ側

TestCtrl.javaのgetFormメソッドを次のように変更します

TestCtrl.java
package com.example.demo.test1;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class TestCtrl {

	@GetMapping("/hello")
	public String hello(Model m) {
		
		String hello = "Hello, World!";
		
		m.addAttribute("msg", hello);
		return "hello";
	}
	
	@PostMapping("/send")
	public String getForm(Model m, TestFrm f) {

		System.out.println(f.getText1() + " " + f.getText2() + " " + f.getText3());
		m.addAttribute("msg", "");
		
		return "hello";
	}
}
ここまでの構成
src/main/java
    └ com.example.demo
        ├ test1
        |   ├ TestCtrl.java
        |   └ TestFrm.java
        └ TestSpringApplication.java

src/main/resources
    ├ templates
    |   └ hello.html
    ├ static
    └ application.propaties

build.gradle

実行結果

http://localhost:8080/helloにアクセスし、次のように入力して送信します。

正しくコンソールに出力されました。

おわり

今回のまとめとか

  • フォームからの値を1つず引数に指定して受け取る。
  • フォーム用のクラスでまとめて受け取る。

Discussion