January 5, 2018

Tanya Part2: Webアプリ101

Spring Bootの勉強プロジェクトTanya。

今回、学ぶのは……

  • MVC用コントローラ
  • API用コントローラ
  • パス変数(@PathVariable)
  • クエリ文字列パラメータ(@RequestParam)
  • POST/PUTのパラメータ(@RequestBody)
  • 豆知識
    • DevTools
    • curlコマンド

Webアプリ

  • Spring Bootのモジュールorg.springframework.boot.spring-boot-starter-webを使用
  • pom.xmlに追加
  • 起動すると内蔵のHTTPサーバ(デフォルトでTomcat)がリクエスト待ちになる
    • 終了ボタンを押すまで終わらない
  • http://localhost:8080を開くと、デフォルトのエラーページが出る

コントローラ

コントローラクラス

  • MVC用コントローラ ...@Controller
    • リクエストパラメータを受け取り、HTMLページを返す
  • API用コントローラ ...@RestController
    • Jsonを受け取り、Jsonを返す
  • どっちも、@Componentの仲間
    • つまり、コントローラはbean

ルーティング

  • httpリクエストを、コントローラクラスやアクションメソッドへマップする
  • コントローラクラスやそのメソッドに、@RequestMappingを付ける
    • URLパスや、httpメソッド(GET/POST/PUTなど)を指定

MVCコントローラ

@Controller
public class HogeController {
  @RequestMapping("/hoge")
  @ResponseBody
  public String fuga() {
    return "<h2>yeah!</h2>";
  }
}
  • レスポンスボディを返す場合は@ResponseBodyを明示
  • デフォルトでは、テンプレート名を返す(Web102で登場予定)
    • あるいはリダイレクト("redirect:/hoge")

APIコントローラ

@RestController
@RequestMapping("/hogeapi")
public class HogeApiController {
  @RequestMapping(path = "/func1", method = RequestMethod.GET)
    public List<String> func1() {
      return Arrays.asList("apple", "orange", "banana");
    }

  @GetMapping("/func2")
    public Map<String, String> func2() {
      Map<String, String> map =new HashMap<>();
      map.put("name", "Tanichael");
      map.put("rank", "Special agent");
      return map;
    }
}
  • @RequestMappingはクラスに付けてもいい
  • APIコントローラの場合、自動的に@ResponseBody状態
  • 適当な型で返せば、JSONに変換してくれる
  • 独自の型(Catクラスとか)でもいい
  • httpメソッドを限定したいときは
    • method要素に指定
    • あるいは専用のアノテーションを使用
      • @GetMapping, @PostMapping, @PutMapping, ...

パス変数

  • URLパス中の可変部分を変数として受け取る
  • @PathVariable
@RequestMapping("/hoge/{name}")
@ResponseBody
public String piyo(@PathVariable String name) {
  return "<h3>Cool, " + name + "!</h3>";
}
  • パターン指定可能
    • {id:^[&#92;d]+$}

クエリ文字列パラメータ

  • URLのクエリ文字列(?のうしろのやつ)を変数として受け取る
  • @RequestParam
  • defaultValue要素でデフォ値を指定可能
@RequestMapping("/hogeparam")
@ResponseBody
public String piyopiyo(
    @RequestParam(value="p1", defaultValue="") @PathVariable String p1) {
  return "<strong>p1=" + p1 + "</strong>";
}

POSTやPUTのパラメータ

  • @RequestParamで、ひとつずつ受け取るか
  • @RequestBodyで、MultiValueMapにまとめて受け取る
    • 独自の型(Catとか)で受け取ることもできるはずだが……

豆知識

DevTools

  • Webアプリの場合、ソースを変更するたびに再起動が必要
  • それを自動化するのがDevTools
  • ソース変更を監視して、自動再起動

curlコマンド

  • httpリクエストを送るコマンド
  • httpメソッド(GET/POST/PUTなど)を指定可能
$ curl -X POST -d "hoge=abc&fuga=1&piyo=true" http://localhost:8080/api/items
Tags: tanya java spring