menu
書いてる野郎
orebike@gmail.com
外部からの入力パラメータをどのようにして受け取るのかという話
このへんはルーティングとも密接に関わってくるのでそちらも参照 Spring Boot/Controller/ルーティング
Controller としては受け付ける形式は関係無く、なんらかの key value の組み合わせとして解釈するので、プログラマがやることはどの名前でどのような形式で受けるかを決めることになる。
取得するには RequestParam
アノテーションを使う。name
に対して受け付けたいキーの名前を設定する。
@RestController @RequestMapping("/hoge") public class HogeRestController { @RequestMapping("/param1") public String param1(@RequestParam(name="a1") String p1) { return p1; } }
複数なら複数書けばいい
@RestController @RequestMapping("/hoge") public class HogeRestController { @RequestMapping("/param2") public String param2(@RequestParam(name="a1") String p1, @RequestParam(name="a2") String p2) { return p1 + p2; } }
同一キーで複数値を送るやつがある。
書き方はそのままに List で受けるようにすると受けてくれる。
@RestController @RequestMapping("/hoge") public class HogeRestController { @RequestMapping("/param3") public String param3(@RequestParam(name="a1") List<String> p1) { return p1.toString(); } }
ちなみにフレームワークにありがちな、配列風に書くと受け取れるは通用しない
http://localhost:8080/hoge/param3?a1[0]=aabb&a1[1]=ccdd
有りげな、外部からくるパラメータをひとまとめにしたFormクラスを作っておいてそいつで全部一発で受けるという方法
ModelAttribute
アノテーションを使ってそのクラスを指定する。
Form クラスは流用性が低いので内部クラスで実装してもよいだろう
http://localhost:8080/hoge/param4?a1=abc&a2=def
@RestController @RequestMapping("/hoge") public class HogeRestController { @RequestMapping("/param4") public String param4(@ModelAttribute Param4Form p1) { return p1.getAll(); } public class Param4Form{ private String a1; private String a2; public void setA1(String a1) { this.a1 = a1; } public void setA2(String a2) { this.a2 = a2; } public String getAll() { return this.a1 + this.a2; } } }
これのヨイところは、明示的にキーを書かなくても setter と一致するならばそれが自動的にセットされるというところだ。
つまり setA2
メソッドを実装しておけば、自動的に a2 キーの値がそこにセットされるということになる。
RequestMapping にパラメータとなる部分に中括弧付きで名前をつけておく。 そしてメソッドの引数に同じ名前の変数を作ってそれに、PathVariable アノテーションをつける
@Controller @RequestMapping("/hoges") public class HogesController { @RequestMapping("/{id}") public String piyo(@PathVariable String id, Model model) { model.addAttribute("id", id); return "hoges/piyo"; } }
このようにすると
http://localhost/hoges/12345
でパラメータが取れる。
RequestMapping 記述と Form の中の setter と名前を一致させても取ることができる。
@Controller @RequestMapping("/hoges") public class HogesController { @RequestMapping("/{id}") public String piyo(@ModelAttribute Param4Form p1, Model model) { model.addAttribute("id", p1.getId()); return "hoges/piyo"; } }