Memo

メモ > 技術 > フレームワーク: 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の両方に対応させることができる

Advertisement