はじめに
MVCモデルの内、コントローラーを作成する手順を学習したのでアウトプットします。
コントローラは ブラウザなどから送信されたリクエストに応じて、ModelとViewを制御する役割をもちます。
Controllerの作り方
Controllerを作成する場合、次のルールが存在します
-
src\main\java
内にパッケージを用意する -
決まったパッケージの配下にControllerを配置する。
-
ファイル名はアッパーキャメルケースで 機能名 + Controller.java とする
Controllerのクラスを作成する
今回はsrc\main\java
にcom.exampleというパッケージを作成しているのでこの下層にクラスを作成します。
Javaのコーディング規則によりパッケージ名は全て小文字で記載します
Controllerを編集する
次のようにコントローラーが作成できていれば編集することができます
Controllerのコーディングをする
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/lesson")
public class LessonController {
@GetMapping("/sample")
@ResponseBody
public String sample() {
return "Hello World!";
}
}
// 実行結果
// http://localhost:8080/lesson/sampleにアクセスすると
// sample()メソッドによって処理され、"Hello World!"という文字列が
// 出力されます
// 実行結果(その2)
// http://localhost:8080/lessonにアクセスすると
// GETリクエストを処理するメソッドは定義されていないため
// サーバーは404 Not Foundエラーを返すことになります。
アノテーションクラスを追加する
Javaでは@から始まるものをアノテーション(注釈)と言います。
アノテーションはコードに特別な処理を追加させます
上記のControllerファイルに追加した4つのインポートは
@を含んだコード
を使用できるようにするためのAPIになります
@Controller
// 特定のクラスがSpring MVCのコントローラーとして動作することを示します
@RequestMapping("/lesson")
// http://localhost:8080/lesson というURLでリクエストを受けた時の
// 実行するメソッドを記述することができます
@GetMapping("/sample")
// /sampleを指定しているので、http://localhost:8080/lesson/sample に
// リクエストするとsample()にアクセスできます。
@ResponseBody
// メソッドの戻り値が直接レスポンスのボディとして使用されるようになります。
コントローラーで3つのリクエストを分岐する例
@GetMappingにURLパス
を設定しない場合、@RequestMappingに設定したURLパスにルーティングされます
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/lesson")
public class LessonController {
@GetMapping
@ResponseBody
public String hello() {
return "おはようございます";
}
// 結果: "/lesson" にリクエストした場合
// ”おはようございます"と出力される
@GetMapping("/sample")
@ResponseBody
public String sample() {
return "こんにちは";
}
// 結果: "/lesson/sample" にリクエストした場合
// ”こんにちは"と出力される
@GetMapping("/sample2")
@ResponseBody
public String sample2() {
return "こんばんは";
}
// 結果: "/lesson/sample2" にリクエストした場合
// ”こんばんは"と出力される
}
アプリケーションを実行する
プロジェクト内のプログラムを動かすためにはアプリケーションの実行をする必要があります
アプリケーションを実行することによりWebサーバーが起動し、リクエストに応じたプログラムが動くようになります。
今回作成した対象のプロジェクトを右クリックで選択し、
実行
→Spring Boot アプリケーション
を選択します
実行することでコンソールに次の表示が出ていれば起動が完了しています
ポート番号も8080
という番号が表示されています。
ブラウザ確認の前にコードは上書き保存する
コントローラーが正常に動作するかブラウザで確認するためにはまずコードを上書き保存する必要があります。保存せずにブラウザで動作の確認をしてもコードが反映されていない状態で実行されるため404エラーなどが発生します
URLパスのマッピングについて
マッピングとは
Webアプリケーションにおいて検索されたURLとそれに対応する処理(メソッド)が関連付けられるように設定することです。つまり、特定のURLへのアクセスが行われた際に、対応する処理が実行されるようになります。これにより、Webアプリケーションは要求された機能を提供することができます。
パスについて
http://localhost:8080 以降の部分(/sampleなど)をパスといいます。
Spring Bootではパスのパターンに対して、どのメソッドが処理されるかを振り分け(マッピング)します。
ルーティングとマッピング
PHPのフレームワークであるLaravelではこのマッピングのことを「ルーティング」と呼びますがSpring Bootにおいて、URLと処理(メソッド)の関連付けを行う機能は「マッピング」と呼ばれます。
Spring Bootでは、Laravelのような独立した「ルーター(Router)」という専用の機能は存在しません。Spring Bootでは代わりに、アノテーションを使用して、URLと処理(メソッド)のマッピングを定義します。
ルーティングの定義はコントローラークラス内で行われ、各メソッドに対してアノテーションを適用することでURLパスと処理を関連付けます。
メソッドに引数を渡す
@PathVariableというアノテーションを使うことで、パスに指定した値をメソッドへ渡すことができます
メソッドに引数を渡すための基本構文1
@GetMapping("/パス/{引数名}")
public String 関数名(@PathVariable 型 引数名) {
// 処理
}
@GetMapping("/users/{userId}")
public String getUser(@PathVariable String userId) {
// userIdにはURLに含まれる{userId}部分の値が格納されています
// ...
}
URLの引数部分(パス変数)とメソッドに渡す引数の名前が一致していない場合、Springはどのパス変数がどのメソッドの引数にマッピングすべきかを判断できず、エラーが発生します。
メソッドに引数を渡すための基本構文2
名前が一致していない場合でも、@PathVariableアノテーションにパス変数の名前を指定することでマッピングを明示的に行うことも可能です。
@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") String userId) {
// ...
}
全体コードの例
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/lesson")
public class LessonController {
@GetMapping("/{num}")
@ResponseBody
public String hello(@PathVariable Integer num) {
return "おはようございます"+num;
}
// 結果: "/lesson" にリクエストした場合
// ”おはようございます"と出力される
@GetMapping("/sample")
@ResponseBody
public String sample() {
return "こんにちは";
}
// 結果: "/lesson/sample" にリクエストした場合
// ”こんにちは"と出力される
@GetMapping("/sample2")
@ResponseBody
public String sample2() {
return "こんばんは";
}
// 結果: "/lesson/sample2" にリクエストした場合
// ”こんばんは"と出力される
}
http://localhost:8080/lesson/2
おはようございます2
あとがき
今回はcontrollerの作成方法と引数の扱い方を少し学習しました。教本を読むだけでは理解できず、行き詰まるところも存在しましたが、検索して調べることで最後まで進めることができました。この記事が他のユーザーの助長に繋がれば幸いです