第4章 初めてのSpringアプリケーション
4.6 簡易ログインアプリケーションの説明(@PathVariable版)
4.5で作成したアプリケーションをもとに、Springの処理が実際どのような流れで動作しているのかを説明していきます。
4.6.1 LoginParamControllerクラス
仕組みとしては4.3の「@RequestParam版」とほとんど同じです。ただ今度は「パス変数」を利用したパラメータの受け取り方法となります。
// 「/loginParam2/{id}/{pass}」へアクセスがあった場合 @GetMapping("/loginParam2/{id}/{pass}") // GETパラメータ(必須)を受け取る public String loginParam2(@PathVariable String id, @PathVariable String pass) { … }
「パス変数」とは、URLのパス部分に渡された値を変数として取り出して利用する機能です。
@GetMappingアノテーションを見てみると、
@GetMapping("/loginParam2/{id}/{pass}")
このようになっていますね。この{id} {pass}の部分が、パス変数の指定です。これは、”/loginParam2/”というアドレスの後にあるパスの値をid , passという変数として受け取ることを示します。
loginParam2メソッドを見ると、パラメータと同じ名前で引数が指定されているのは4.3の「@RequestParam版」と同じですが、今回はアノテーションが「@PathVariable」となっています。
public String loginParam2(@PathVariable String id, @PathVariable String pass) {
これは、「この引数が、パス変数によって値を渡されるものだ」ということを示しています。つまり、”/loginParam2/{id}/{pass}”で指定されたidとpassが、引数のidとpassに渡されるのです。
後は、受け取った変数を使って判定処理を行なって、結果をreturnするだけです。実に簡単ですね。
4.6.2 パラメータが送信されない場合のエラー対策
これも基本的な仕組みとしては4.3の「@RequestParam版」と同じです。@PathVariableアノテーションの引数として(required = false)を指定するだけです。
ただ、パス変数の場合にはもう一工夫必要なので、下記の内容を追記して、再度アクセスし直してみましょう。
■ソースコード
【ファイル名:LoginParamController.java】
アプリケーションにアクセス(パラメータが送信されない場合)
以下のアドレスから簡易ログインアプリケーションにアクセスします。
URL:http://localhost:8080/loginParam2
図 4.6 1:アプリケーションアクセス画面(エラーにならなくなる)
アプリケーションにアクセス(パラメータが1つだけ送信された場合)
以下のアドレスから簡易ログインアプリケーションにアクセスします。
URL:http://localhost:8080/loginParam2/001
図 4.6 2:アプリケーションアクセス画面(パラメータが1つだけ送信された場合)
アプリケーションにアクセス(パラメータが2つ送信された場合)
以下のアドレスから簡易ログインアプリケーションにアクセスします。
URL:http://localhost:8080/loginParam2/001/aaa
図 4.6 3:アプリケーションアクセス画面(パラメータが2つ送信された場合)
今回も合わせて29行目にエラー処理を追加してもらいましたが、ここで重要なのは@GetMappingの引数に複数のURLが指定されたことです。
// 「/loginParam2」または「/loginParam2/{id}」または「/loginParam2/{id}/{pass}」へアクセスがあった場合 @GetMapping({"/loginParam2", "/loginParam2/{id}", "/loginParam2/{id}/{pass}"})
このようにリクエストマッピングには複数のURLを指定することもできます。この内のどれか一つのURLに該当すれば関連付けたメソッドが自動で実行されるようになるのです。
// GETパラメータ(任意)を受け取る public String loginParam2(@PathVariable(required = false) String id, @PathVariable(required = false) String pass) { ... }
今回は「パス変数」で受け取るパラメータの送信を任意としたため、送信されるパラメータの数が「0~2個」ではURLも変わってしまいますよね。そのため、リクエストマッピングするURLもその分用意してあげる必要があった、というわけです。