【Eclipse】SpringBootのcontrollerを作成する

# はじめに
MVCモデルの内、コントローラーを作成する手順を学習したのでアウトプットします。
コントローラは ブラウザなどから送信されたリクエストに応じて、ModelとViewを制御する役割をもちます。

## Controllerの作り方

Controllerを作成する場合、次のルールが存在します

- `src\main\java`内にパッケージを用意する

- 決まったパッケージの配下にControllerを配置する。

- ファイル名はアッパーキャメルケースで 機能名 + Controller.java とする

### Controllerのクラスを作成する

今回は`src\main\java`にcom.exampleというパッケージを作成しているのでこの下層にクラスを作成します。

Javaのコーディング規則によりパッケージ名は全て小文字で記載します

![スクリーンショット 2023-06-22 15.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/e349797d-f28a-5439-c0ec-e6f95fad6e38.png)

![スクリーンショット 2023-06-22 15.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/ad7164a3-45fc-534e-e7a8-2186d4fc3f80.png)


## Controllerを編集する

次のようにコントローラーが作成できていれば編集することができます
![スクリーンショット 2023-06-22 16.07.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/3226669e-db55-50f7-c13e-6ec637b485f7.png)

### Controllerのコーディングをする
```java:LessonController.java
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になります

```java:アノテーション
@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パスにルーティングされます

```java
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 アプリケーション`を選択します

![スクリーンショット 2023-06-23 9.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/287aa584-ea43-798d-92d1-33b8d953450a.png)

実行することでコンソールに次の表示が出ていれば起動が完了しています

![スクリーンショット 2023-06-23 9.56.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/39fd6205-ca88-bcce-ba30-2fc7023cdf71.png)

ポート番号も`8080`という番号が表示されています。

## ブラウザ確認の前にコードは上書き保存する
コントローラーが正常に動作するかブラウザで確認するためにはまずコードを上書き保存する必要があります。保存せずにブラウザで動作の確認をしてもコードが反映されていない状態で実行されるため404エラーなどが発生します

![スクリーンショット 2023-06-23 8.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/9a1551c5-3647-b2ba-a980-f8fe7901d98e.png)





コードを保存することで初めてブラウザで確認ができます
![スクリーンショット 2023-06-23 8.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/53c4f8a3-cb2d-901b-774e-f450e2d429f8.png)


## 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
```java:引数を渡す
@GetMapping("/パス/{引数名}")
public String 関数名(@PathVariable 型 引数名) {
    // 処理
}
```
```java:引数を渡す
@GetMapping("/users/{userId}")
public String getUser(@PathVariable String userId) {
    // userIdにはURLに含まれる{userId}部分の値が格納されています
    // ...
}
```
URLの引数部分（パス変数）とメソッドに渡す引数の名前が一致していない場合、Springはどのパス変数がどのメソッドの引数にマッピングすべきかを判断できず、エラーが発生します。

### メソッドに引数を渡すための基本構文2

名前が一致していない場合でも、@PathVariableアノテーションにパス変数の名前を指定することでマッピングを明示的に行うことも可能です。

```java:引数の名称が異なる場合
@GetMapping("/users/{id}")
public String getUser(@PathVariable("id") String userId) {
    // ...
}
```

### 全体コードの例
```java:LessonController.java
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

```java:表示結果
おはようございます2
```

## あとがき
今回はcontrollerの作成方法と引数の扱い方を少し学習しました。教本を読むだけでは理解できず、行き詰まるところも存在しましたが、検索して調べることで最後まで進めることができました。この記事が他のユーザーの助長に繋がれば幸いです