🙌
Spring FrameworkでWebアプリ作りたい #03 リクエストパラメータ(その2)
はじめ
前回
画面に値を渡す。フォーム送信値を受け取る。
今回
- フォーム送信から複数の値をまとめて受け取る(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
などを定義しなくても使えるようになります。
参考:
変数名は引数で個々に受け取るときと同様に、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