メモ > 技術 > フレームワーク: SpringBoot > 値の取得
値の取得
■GETリクエストからの取得
コントローラーに以下のメソッドがあるとする
@GetMapping(value = "/dev/profile")
@ResponseBody
String profile() {
return "太郎さんは20歳です。";
}
ブラウザから以下のようにアクセスすると、画面に「太郎さんは20歳です。」と表示される
http://localhost:8080/dev/profile
コントローラーのメソッドを以下のようにすると
@GetMapping(value = "/dev/profile")
@ResponseBody
String profile(@RequestParam("name") String name, @RequestParam("age") int age) {
return "%sさんは%d歳です。".formatted(name, age);
}
ブラウザから以下のようにアクセスすると、画面に「Taroさんは20歳です。」と表示される
http://localhost:8080/dev/profile?name=Taro&age=20
RequestParamと割り当て先の変数名が同じなら、以下のように書くこともできる
@GetMapping(value = "/dev/profile")
@ResponseBody
String profile(String name, int age) {
return "%sさんは%d歳です。".formatted(name, age);
}
■URLパスからの取得
コントローラーのメソッドを以下のようにすると
@GetMapping(value = "/dev/profile/{name}/{age}")
@ResponseBody
String profile(@PathVariable("name") String name, @PathVariable("age") int age) {
return "%sさんは%d歳です。".formatted(name, age);
}
ブラウザから以下のようにアクセスすると、画面に「Taroさんは20歳です。」と表示される
http://localhost:8080/dev/profile/Taro/20
なお @PathVariable の指定を省略すると500エラーになった
■POSTリクエストからの取得
コントローラーのメソッドを以下のようにすると
@GetMapping(value = "/dev/form")
@ResponseBody
String form() {
return """
<html>
<head>
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<form action="/dev/profile" method="post">
<dl>
<dt>名前</dt>
<dd><input type="text" name="name"></dd>
<dt>年齢</dt>
<dd><input type="text" name="age"></dd>
</dl>
<p><input type="submit" value="表示"></p>
</form>
</body>
</html>
""";
}
@PostMapping(value = "/dev/profile")
@ResponseBody
String profile(@RequestParam("name") String name, @RequestParam("age") int age) {
return "%sさんは%d歳です。".formatted(name, age);
}
ブラウザから以下のようにアクセスすると入力画面が表示され、その入力内容に従って「Taroさんは20歳です。」などと表示できる
http://localhost:8080/dev/form
RequestParamと割り当て先の変数名が同じなら、以下のように書くこともできる
@PostMapping(value = "/dev/profile")
@ResponseBody
String profile(String name, int age) {
return "%sさんは%d歳です。".formatted(name, age);
}
以下のようにして、フォームから各値を取得できる
@GetMapping(value = "/dev/form")
@ResponseBody
String form() {
return """
<html>
<head>
<title>Spring Boot</title>
</head>
<body>
<h1>Spring Boot</h1>
<form action="/dev/profile" method="post">
<dl>
<dt>名前</dt>
<dd><input type="text" name="name"></dd>
<dt>郵便番号</dt>
<dd><input type="text" name="zipcode"> - <input type="text" name="zipcode"></dd>
<dt>職業</dt>
<dd>
<input type="radio" name="job" value="会社員"> 会社員<br>
<input type="radio" name="job" value="自営業"> 自営業<br>
<input type="radio" name="job" value="学生"> 学生<br>
<input type="radio" name="job" value="無職"> 無職
</dd>
<dt>興味のある分野</dt>
<dd>
<input type="checkbox" name="interest" value="HTML"> HTML<br>
<input type="checkbox" name="interest" value="CSS"> CSS<br>
<input type="checkbox" name="interest" value="JavaScript"> JavaScript
</dd>
<dt>お問い合わせ項目</dt>
<dd>
<select name="subject">
<option value="">選択してください</option>
<option value="商品について">商品について</option>
<option value="返品について">返品について</option>
<option value="その他">その他</option>
</select>
</dd>
<dt>お問い合わせ内容</dt>
<dd><textarea name="inquiry" rows="10" cols="50"></textarea></dd>
</dl>
<p><input type="submit" value="表示"></p>
</form>
</body>
</html>
""";
}
@PostMapping(value = "/dev/profile")
@ResponseBody
String profile(String name, String zipcode[], String job, String interest[], String subject, String inquiry) {
return "名前 = %s、郵便番号 = %s、職業 = %s、興味のある分野 = %s、お問い合わせ項目 = %s、お問い合わせ内容 = %s".formatted(
name,
String.join("-", zipcode),
job,
Arrays.toString(interest),
subject,
inquiry
);
}
■POSTリクエストからの取得(@ModelAttributeを使った取得)
上記「POSTリクエストからの取得」の方法は、入力項目の数が多くなると比例して引数が増えて可読性が下がる
このような場合、@ModelAttribute と lombok.Data を使うことで簡潔に記述できる
まずは以下のように src/main/java/com/example/demo/request/ProfileRequest.java として、リクエストを受け取るためのクラスを作成する
package com.example.demo.request;
import lombok.Data;
@Data
public class ProfileRequest {
private String name;
private String[] zipcode;
private String job;
private String[] interest;
private String subject;
private String inquiry;
}
以下のようにして値を受け取ることができる
@PostMapping(value = "/dev/profile")
@ResponseBody
String profile(@ModelAttribute ProfileRequest profileRequest) {
return "名前 = %s、郵便番号 = %s、職業 = %s、興味のある分野 = %s、お問い合わせ項目 = %s、お問い合わせ内容 = %s".formatted(
profileRequest.getName(),
String.join("-", profileRequest.getZipcode()),
profileRequest.getJob(),
Arrays.toString(profileRequest.getInterest()),
profileRequest.getSubject(),
profileRequest.getInquiry()
);
}
■補足
@GetMapping や @PostMapping は、@RequestMapping と書くことでGET/POSTの両方に対応させることができる