4. コントローラー

コントローラーの基本

コントローラーとは

Springのコントローラーは、HTTPリクエスト&レスポンスを返すコンポーネントクラスです。リクエストではHTTPメソッド、URIマッピング、パラメータなどを指定し、JSONXMLなどのさまざまなデータフォーマットでレスポンスできます。

クラス名

コントローラークラスは xxxxController で作成し、命名規則はパスカルケースとします。

public class SampleController {

}

アノテーションで簡略化

Springのコントローラーはさまざまな機能がありますが、アノテーションを使うと、HTTPリクエストに関するプログラムを簡略化できます。

@Controller
public class SampleController {
    @GetMapping("/hello")
    public String index(@RequestParam String name) {
        //処理
    }
}

@Controller

@Controllerを利用すると、Springのコントローラーとして動作します。 HTMLテンプレートのビュー(JSP、Thymeleafなど)を生成して、クライアントにレスポンスします。

コントローラーの定義方法

@Controller アノテーションは、コントローラークラス全体に定義します。このクラスは基本的にHTMLテンプレートをレスポンスするのに利用します。

@Controller
public class コントローラー名 {

}

@RestController

@RestController アノテーションは、@Controller@ResponseBody を組み合わせたアノテーションで、JSON、XMLなどのデータをレスポンスします。

@RestController
public class コントローラー名 {

}

マッピング

マッピング(Mapping) は、URLとHTTPリクエストメソッドに対応してコントローラのメソッドを実行します。この仕組みはRoutingともいい、Springではメソッドにアノテーションを定義します。

アノテーションの種類

Spring MVCのマッピングは、以下のようなHTTP/2のリクエストメソッドに対応したアノテーションが用意されています。

HTTPリクエスト アノテーション
GET @GetMapping
POST @PostMapping
PUT @PutMapping
DELETE @DeleteMapping
PATCH @PatchMapping
REQUEST @RequestMapping

@GetMapping

GETリクエストのマッピングは、@GetMappingにURLパターンを定義します。URLパターンは、WebアプリケーションのURLからのパスです。

@GetMapping("URLパターン")
public String メソッド() {
    //処理
}

パラメーター

@RequestParam

@RequestParamは、HTTPリクエストのクエリパラメーターをメソッドの引数で取得します。

public String bye(@RequestParam String 引数) {
    //引数を利用できる
}

@RequestParam() の記述で、各パラメーターをカスタマイズできます。

public String bye(@RequestParam(name = "キー", required = false) String 引数) {

}
  • name:キー
  • required:入力必須

コントローラー作成

ファイル構成

controllers/
    └── RestSampleController.java

ルーティング

URLパターン コントローラー アクションメソッド リクエストメソッド パラメータ
/hello RestSampleController index() GET なし
/bye RestSampleController bye() GET 文字列
/users RestSampleController getUserId() GET 整数

controllersパッケージ作成

コントローラーファイルを管理しやすくするために、「src/main/com/example/」に「controllers」パッケージを作成しておきます。

フォルダ表示
パッケージ表示(Java Projects)

コントローラークラス作成

クラスファイル作成

「controllers/」に「RestSampleController」を作成します。

クラスファイル定義

「RestSampleController」クラスを定義します。

controllers/RestSampleController.java
package com.example.demo.controllers;

public class RestSampleController {
    
}

@RestController追加

コントローラークラスの前に、@RestControllerを追加します。

  • 「@Rest」と入力してスニペットを利用すると便利です

@RestController アノテーションを追加できました。

controllers/RestSampleController.java
package com.example.demo.controllers;

import org.springframework.web.bind.annotation.RestController;

@RestController
public class RestSampleController {
    
}
  • org.springframework.web.bind.annotation.RestControllerも自動インポートされます。

アクションメソッド追加

GETメソッド追加

「method」と入力して、「GetMapping」を選択します。

アクションメソッド(GETマッピング)が自動入力されます。

controllers/RestSampleController.java
package com.example.demo.controllers;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RestSampleController {
    @GetMapping(value="path")
    public SomeData getMethodName(@RequestParam String param) {
        return new SomeData();
    }
}

アクションメソッド定義

アクションメソッド名を「index」として、引数を削除します。

controllers/RestSampleController.java
@RestController
public class RestSampleController {
    @GetMapping(value="path")
    //メソッド修正
    public String index() {
        return new SomeData();
    }
}

レスポンス処理

任意の文字列をレスポンスします。

controllers/RestSampleController.java
    @GetMapping("/hello")
    public String index() {
        //文字列をレスポンス
        return "This is Sample Controller!!";
    }

マッピング修正

@GetMappingvalueプロパティに「/hello」指定して、マッピングします。

@RestController
public class RestSampleController {
    //URLマッピング
    @GetMapping(value = "/hello")
    public String index() {
        return "This is Sample Controller!!";
    }
}

ブラウザで確認

http://localhost:8080/hello にアクセスして、レスポンスした文字列が表示されるか確認してみましょう。

パラメータ取得

URLのクエリパラメーターparamの値を取得します。

http://localhost:8080/bye?param=Tokyo

nameパラメータを取得し、メッセージをレスポンスします。

controllers/RestSampleController.java
    @GetMapping(value = "/bye")
    public String bye(@RequestParam String param) {
        String message = "Bye!" + param;
        return message;
    }
結果

@RequestParamでエラーになる場合

@RequestParamでエラーに場合、RequestParamアノテーションがインポートされていないのが原因です。

クイックフィックスを使ってインポートします。

RequestParamアノテーションがインポートされました。

import org.springframework.web.bind.annotation.RequestParam;

パラメータのカスタマイズ

URLのクエリパラメーターのキーをnameとし、パラメータは任意とします。

http://localhost:8080/bye?param=Tokyo

@RequestParam() のパラメーターのキーを「name」、入力必須「なし」にします。

    public String bye(@RequestParam(name = "name", required = false) String param) {
        String message = "Bye!" + param;
        return message;
    }

パラメータのキーは「name」となり、パラメータがなくても動作します。

結果(パラメーターあり)
結果(パラメーターなし)

@PathVariable

@PathVariable アノテーションは、HTTPリクエストのURLパスをメソッドの引数として取得します。

    @GetMapping("/users/{userId}")
    public String getUserById(@PathVariable Long userId) {
        String message = "User id is " + userId + "!";
        return message;
    }

ブラウザ確認

URLパス「/users/」に任意の数値を指定して結果を確認してみましょう。

http://localhost:8080/users/3
結果

トップページ

ファイル構成

controllers/
    └── HomeController.java

ルーティング

URLパターン コントローラー アクションメソッド リクエストメソッド
/ HomeController index GET

HomeControllerクラス作成

「controllers/」に「HomeController」を作成します。

controllers/HomeController.java
package com.example.demo.controllers;

import org.springframework.stereotype.Controller;

@Controller
public class HomeController {
    
}

アクションメソッド追加

index() メソッドを追加し、 @GetMappingで「 / 」をマッピングします。

controllers/HomeController.java
@Controller
public class HomeController {

    @GetMapping("/")
    public String index() {
        return "This is Top Page";
    }

}

ブラウザで確認

http://localhost:8080 (Webルート)にアクセスすると、エラーになります。@ControllerHTMLテンプレートをレスポンスする仕様で、文字列を直接レスポンスできません。

@ResponseBody

@Controller は基本的にHTMLをレスポンスするため、文字列を強制的にレスポンスするには @ResponseBody の定義が必要です。

controllers/HomeController.java
@GetMapping("/")
@ResponseBody
public String index() {
    return "This is Top Page";
}

コンパイルエラーの場合

アノテーションでエラーになる場合は、対象のクラスをインポートする必要があります。これを対処するには、エラー箇所をマウスオーバーし、【クイックフィックス】をクリックします。

対象のクラスをインポートします。

ブラウザ確認

トップページにアクセスすると、「HomeController」のindex() のレスポンスが表示されます。

Spring超入門