サーブレット&JSPの基本|Springコントローラの基本と使い方

サーブレットで学んだリクエスト処理を、Springらしくシンプルに。普通のJavaクラスでコントローラを作り、画面表示までの流れをつかもう

Spring Frameworkを使ったWebアプリケーション開発では、コントローラがとても大切な役割を持ちます。

これまでServletとJSPで学習してきたMVCモデルでは、サーブレットがコントローラの役割を担当していました。

サーブレットは、ブラウザから送られてきたリクエストを受け取り、リクエストパラメータを取得し、必要な処理をモデルに依頼し、最後にJSPへフォワードしたり、別のURLへリダイレクトしたりしていました。

Spring MVCでも、コントローラが行うことは大きく変わりません。

リクエストを受け取る。

必要な値を取得する。

サービスに処理を依頼する。

ビューに表示を依頼する。

この基本の流れは、ServletとJSPで学んだ内容とつながっています。

ただし、Spring MVCでは、開発者がコントローラをサーブレットとして作るのではなく、通常のJavaクラスとして作成します。

ここが大きな違いです。

サーブレットの場合は、HttpServletを継承し、doGetやdoPostをオーバーライドし、RequestDispatcherやHttpServletRequestなどを直接扱う場面が多くありました。

一方、Springのコントローラでは、@Controllerや@GetMapping、@PostMappingなどのアノテーションを使って、リクエストとメソッドの対応を分かりやすく指定できます。

さらに、リクエストパラメータも@RequestParamを使えば、ハンドラメソッドの引数として受け取れます。

Springが必要な値を自動的に渡してくれるため、サーブレットよりも短く、読みやすく書ける場面が増えます。

この記事では、Springにおけるコントローラの役割、コントローラクラスの作成方法、リクエストマッピングアノテーション、ハンドラメソッドの引数、戻り値、フォワード、リダイレクト、フォームクラスによるパラメータ取得までを順番に学習します。

プロジェクト名はspring_studyとします。

ベースパッケージはcom.example.demoとし、コントローラクラスはcom.example.demo.controller、フォームクラスなどのデータを扱うクラスはcom.example.demo.modelに配置します。

Springにおけるコントローラとは

Spring MVCにおけるコントローラは、ブラウザから送られてきたリクエストを受け取り、その後の処理の流れを決めるクラスです。

ServletとJSPで学んだMVCモデルでは、サーブレットがコントローラでした。

Spring MVCでは、開発者が作成する通常のJavaクラスがコントローラになります。

コントローラの主な役割

役割内容
リクエストを受け取るブラウザから送信されたGETリクエストやPOSTリクエストを処理する
リクエストパラメータを取得するフォームから送信された値を受け取る
サービスに処理を依頼するアプリケーションの主な処理を担当するクラスへ処理を渡す
ビューを選ぶ処理結果を表示するJSPなどのビュー名を返す
リダイレクトを指示する必要に応じて別のURLへ再リクエストさせる

つまり、Springのコントローラも、これまでのサーブレットと同じように、リクエスト処理の入口になります。

違うのは、書き方です。

サーブレットでは、HttpServletを継承し、doGetやdoPostを使って処理を分けていました。

Springでは、通常のJavaクラスに@Controllerを付け、メソッドに@GetMappingや@PostMappingを付けて処理を分けます。

サーブレットとの違い

Springのコントローラは、サーブレットと役割は似ています。

しかし、作り方はかなりシンプルになります。

サーブレットとSpringコントローラの違い

項目サーブレットSpringコントローラ
クラスの作り方HttpServletを継承する通常のJavaクラスとして作る
GET処理doGetに書く@GetMappingを付けたメソッドに書く
POST処理doPostに書く@PostMappingを付けたメソッドに書く
URLとの対応@WebServletで指定する@GetMappingや@PostMappingで指定する
パラメータ取得request.getParameterを使う@RequestParamで引数として受け取れる
ビューへの遷移RequestDispatcherでフォワードする戻り値でビュー名を返す

Springでは、サーブレット特有の記述が少なくなります。

そのため、リクエストを受け取ったあと、何をしたいのかが見えやすくなります。

Springコントローラを通常のクラスとして作れるメリット

Springのコントローラは、通常のJavaクラスとして作成できます。

これには大きなメリットがあります。

通常のクラスとして作れるメリット

メリット内容
サーブレット特有の記述が減るHttpServletの継承やdoGet、doPostの記述を意識しすぎなくてよい
読みやすくなるアノテーションでリクエストとの対応が分かりやすい
テストしやすいJUnitなどを使って単体テストしやすい
チームで統一しやすいSpringの決まった形に沿って作れる
処理に集中しやすい低レベルなサーブレット処理より、アプリケーションの処理に集中できる

特に大規模なアプリケーションでは、コントローラの数も多くなります。

そのとき、サーブレット特有の記述が多いと、全体の見通しが悪くなりやすいです。

Springのコントローラなら、どのURLに対してどのメソッドが動くのかをアノテーションで表せます。

そのため、チーム開発でも作り方をそろえやすくなります。

図1:サーブレットとSpringコントローラの役割の違い

この図から分かること

サーブレットとSpringコントローラは、どちらもリクエストを受け取って処理の流れを決める役割を持っています。

ただし、サーブレットではHttpServletを継承し、doGetやdoPostを使って処理を書きます。

Springコントローラでは、通常のJavaクラスに@Controllerを付け、@GetMappingや@PostMappingでURLとメソッドの対応を指定します。

Spring MVCの裏側ではDispatcherServletが動いており、開発者が作成したコントローラを呼び出します。

そのため、開発者はサーブレットの細かい処理よりも、アプリケーションの処理に集中しやすくなります。

コントローラクラスを作成する準備

Springでコントローラを作成するには、Springプロジェクトspring_studyの中にクラスを作成します。

コントローラクラスは、controllerパッケージに配置します。

今回のベースパッケージはcom.example.demoなので、コントローラクラスの配置先はcom.example.demo.controllerになります。

コントローラクラスの配置

項目内容
プロジェクト名spring_study
ベースパッケージcom.example.demo
コントローラのパッケージcom.example.demo.controller
クラス名の例GreetingController
役割リクエストを受け取り、ビュー名を返す

Springでは、コントローラクラスの名前の末尾にControllerを付けるのが一般的です。

たとえば、あいさつ画面に関する処理を担当するならGreetingController、会員登録に関する処理を担当するならMemberControllerのようにします。

名前を見るだけで役割が分かるようにしておくと、プロジェクト全体が読みやすくなります。

コントローラクラスの作成手順

Eclipseでコントローラクラスを作成するときは、通常のJavaクラスを作成する流れとほとんど同じです。

コントローラクラス作成の流れ

手順操作
1spring_studyプロジェクトを選択する
2右クリックする
3新規を選択する
4クラスを選択する
5パッケージにcom.example.demo.controllerを指定する
6クラス名にGreetingControllerを指定する
7完了をクリックする

作成したクラスに@Controllerを付けることで、Springがこのクラスをコントローラとして認識できるようになります。

@Controllerを使うには、org.springframework.stereotype.Controllerをインポートします。

コントローラークラスの作成方法

コントローラを作成するSpringプロジェクトを選択して、右クリック→「新規」→「クラス」を選択します。

コントローラクラスが所属するパッケージとクラス名を指定して、「完了」をクリックします。

パッケージは「com.example.demo.controller」、クラス名に「GreetingController」を指定します。

「src/main/java」内にクラスが作成され、エディタには作成したクラスの内容が表示されます。
クラスに「@Controller」アノテーションを付与し、ハンドラメソッドを必要に応じて追加していきます。

「org.springframework.stereotype.Controller」をインポートします。

以下のコードを追加します。

import org.springframework.stereotype.Controller;

@Controllerアノテーション

@Controllerは、このクラスがSpring MVCのコントローラであることを示すアノテーションです。

@Controllerの基本

項目内容
書く場所コントローラクラスの直前
役割Springにコントローラであることを知らせる
必要なimportorg.springframework.stereotype.Controller
効果DispatcherServletから呼び出される対象になる

@Controllerを付けないと、Springはそのクラスをコントローラとして認識できません。

そのため、Spring MVCのコントローラクラスには必ず@Controllerを付けます。

基本的なコントローラの例

ファイル名: GreetingController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class GreetingController {

    @GetMapping("/Greeting")
    public String showGreeting() {
        // リクエストによって実行する処理を記述する
        return "greeting";
    }
}

GreetingController.javaは、com.example.demo.controllerパッケージに作成します。

@Controllerを付けることで、このクラスはSpring MVCのコントローラとして扱われます。

showGreetingメソッドには@GetMapping("/Greeting")を付けています。

これにより、ブラウザから/GreetingへGETリクエストが送られたときに、showGreetingメソッドが実行されます。

戻り値のgreetingは、表示を依頼するビュー名です。

Springは、このビュー名をもとにJSPファイルを探し、フォワードします。

ハンドラメソッドとは

Spring MVCでは、リクエストを処理するメソッドのことをハンドラメソッドと呼びます。

サーブレットでいうdoGetやdoPostに相当する処理を書く場所です。

ただし、メソッド名はdoGetやdoPostに固定されません。

開発者が自由に分かりやすい名前を付けられます。

ハンドラメソッドの特徴

項目内容
役割リクエストを処理する
名前開発者が自由に決められる
GETとの対応@GetMappingを付ける
POSTとの対応@PostMappingを付ける
戻り値ビュー名やリダイレクト先を返す

サンプルではshowGreetingという名前を付けています。

実際の開発では、showLoginForm、registerMember、confirmProfileのように、何をするメソッドなのかが分かる名前にすると読みやすくなります。

リクエストマッピングアノテーション

Spring MVCでは、どのURLに対してどのメソッドを実行するかを、リクエストマッピングアノテーションで指定します。

代表的なものが@GetMappingと@PostMappingです。

リクエストマッピングアノテーション

アノテーション対応するリクエスト用途
@GetMapping("/URLパターン")GETリクエスト画面表示や検索画面の初期表示など
@PostMapping("/URLパターン")POSTリクエストフォーム送信後の登録、更新、ログイン処理など

@GetMappingを使うには、org.springframework.web.bind.annotation.GetMappingをインポートします。

@PostMappingを使うには、org.springframework.web.bind.annotation.PostMappingをインポートします。

たとえば、/GreetingへのGETリクエストを処理したい場合は、@GetMapping("/Greeting")を付けます。

会員登録フォームの送信など、/MemberRegisterへのPOSTリクエストを処理したい場合は、@PostMapping("/MemberRegister")を付けます。

図2:@GetMappingと@PostMappingでリクエストとメソッドを結び付ける

この図から分かること

Spring MVCでは、DispatcherServletがリクエストを受け取り、URLパターンとHTTPメソッドに合うハンドラメソッドを探します。

GET /Greetingであれば、@GetMapping("/Greeting")が付いたメソッドが実行されます。

POST /MemberRegisterであれば、@PostMapping("/MemberRegister")が付いたメソッドが実行されます。

サーブレットではdoGetやdoPostで処理を分けていましたが、Springではアノテーションでリクエストとメソッドを結び付けます。

ハンドラメソッドの引数

ハンドラメソッドには、引数を定義できます。

この引数を使うと、リクエストパラメータやHttpSessionなどを受け取れます。

Servletでは、request.getParameterを使って値を取得していました。

Springでは、@RequestParamを使うことで、リクエストパラメータをメソッドの引数として受け取れます。

@RequestParamの基本

項目内容
役割リクエストパラメータをハンドラメソッドの引数で受け取る
書く場所引数の前
必要なimportorg.springframework.web.bind.annotation.RequestParam
ポイント引数名とリクエストパラメータ名を一致させる

たとえば、リクエストパラメータとしてnicknameとgradeが送られてくる場合、ハンドラメソッドの引数にも同じ名前を用意します。

リクエストパラメータを取得する例

ファイル名: ProfileController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ProfileController {

    @GetMapping("/ProfileConfirm")
    public String confirmProfile(
            @RequestParam String nickname,
            @RequestParam int grade) {

        // nicknameにリクエストパラメータnicknameの値が代入される
        // gradeにリクエストパラメータgradeの値が代入される
        return "profileConfirm";
    }
}

この例では、/ProfileConfirmへGETリクエストが送られたときにconfirmProfileメソッドが実行されます。

リクエストにnicknameとgradeというパラメータが含まれている場合、Springが自動的に値を代入します。

たとえば、nickname=haru、grade=2という値が送られてきた場合、nicknameにはharuが入り、gradeには2が入ります。

gradeの型はintなので、Springは文字列として送られてきた値をintに変換して渡します。

パラメータ名を指定して取得する

リクエストパラメータ名とJavaの変数名を同じにできない場合があります。

たとえば、リクエストパラメータ名がuser_nameで、Javaの変数名をuserNameにしたい場合です。

このようなときは、@RequestParamにパラメータ名を指定します。

リクエストパラメータ名を指定して取得する例

ファイル名: AccountController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class AccountController {

    @PostMapping("/AccountCheck")
    public String checkAccount(
            @RequestParam("user_name") String userName) {

        // userNameにリクエストパラメータuser_nameの値が代入される
        return "accountCheck";
    }
}

この例では、リクエストパラメータ名はuser_nameです。

しかし、Javaの変数名はuserNameです。

そのため、@RequestParam("user_name")のように書き、どのリクエストパラメータを受け取るのかを明示しています。

このように書くことで、HTMLフォーム側のname属性と、Java側の変数名が違っていても値を受け取れます。

@RequestParamで指定できる型

@RequestParamで受け取る引数の型は、リクエストパラメータの値を代入できる型にします。

リクエストパラメータの値と引数の型

リクエストパラメータの値ハンドラメソッドの引数型
文字列の値String
整数の値int、Integer
小数の値double、Double
trueまたはfalseboolean、Boolean
2025-09-18のような日付LocalDate

リクエストパラメータは、ブラウザから送られる時点では基本的に文字列です。

Springは、引数の型に合わせて値を変換して渡してくれます。

たとえば、grade=2のように送られた値をint gradeとして受け取ることができます。

ただし、数値として変換できない値をintで受け取ろうとすると、エラーの原因になります。

引数の型は、送られてくる値の内容に合わせて決めましょう。

HttpServletRequestやHttpSessionを受け取る

Springのハンドラメソッドでは、リクエストパラメータだけでなく、HttpServletRequestやHttpServletResponse、HttpSessionなども引数として受け取れます。

受け取りたい型を引数に定義しておけば、Springが自動的に渡してくれます。

Servletで使っていたオブジェクトを、そのまま必要に応じて使えるのは便利です。

HttpServletRequestとHttpSessionを受け取る例

ファイル名: SessionCheckController.java

package com.example.demo.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class SessionCheckController {

    @GetMapping("/SessionCheck")
    public String checkSession(
            HttpServletRequest request,
            HttpSession session) {

        request.setAttribute("message", "リクエストを確認しました");
        session.setAttribute("visitStatus", "確認済み");

        return "sessionCheck";
    }
}

この例では、checkSessionメソッドの引数にHttpServletRequestとHttpSessionを定義しています。

Springは、メソッドが実行されるときに、対応するオブジェクトを自動的に渡します。

そのため、サーブレットと同じようにrequest.setAttributeやsession.setAttributeを使えます。

ただし、Springでは@RequestParamやフォームクラスなど便利な仕組みもあるため、必要な場面で使い分けるとよいでしょう。

図3:ハンドラメソッドの引数に値が渡される流れ

この図から分かること

Spring MVCでは、ハンドラメソッドの引数を用意しておくと、DispatcherServletが実行時に必要な値を渡してくれます。

@RequestParamを付けた引数には、対応するリクエストパラメータの値が代入されます。

intなどの型を指定した場合は、Springが値を変換して渡します。

HttpSessionのようなオブジェクトも、引数に定義しておけば自動的に受け取れます。

ハンドラメソッドの戻り値

ハンドラメソッドの戻り値には、表示したいビューの名前を指定します。

ビューとしてJSPを使う場合、戻り値にはJSPファイル名から拡張子.jspを除いた名前を返します。

たとえば、greeting.jspに表示を依頼したい場合は、return "greeting"; と書きます。

戻り値によるフォワード

戻り値意味
return "greeting";greeting.jspへフォワードする
return "profileConfirm";profileConfirm.jspへフォワードする
return "accountCheck";accountCheck.jspへフォワードする

サーブレットでは、RequestDispatcherを使ってフォワードしていました。

Spring MVCでは、ハンドラメソッドの戻り値としてビュー名を返すことで、DispatcherServletが該当するビューへフォワードします。

リダイレクトする場合

フォワードではなくリダイレクトしたい場合は、戻り値の先頭にredirect:を付けます。

たとえば、/Greetingへリダイレクトしたい場合は、次のように書きます。

return "redirect:/Greeting";

フォワードとリダイレクトの指定

処理戻り値の例内容
フォワードreturn "greeting";greeting.jspへ処理を渡す
リダイレクトreturn "redirect:/Greeting";ブラウザに/Greetingへ再リクエストさせる

フォワードは、サーバ内部でビューへ処理を渡します。

リダイレクトは、ブラウザに別のURLへアクセスし直してもらう仕組みです。

ログイン後にメイン画面へ移動させる場合や、登録完了後に一覧画面へ移動させる場合などに使われます。

フォームクラスを使ったリクエストパラメータの取得

@RequestParamを使うと、リクエストパラメータを簡単に受け取れます。

ただし、フォームの入力項目が多くなると、ハンドラメソッドの引数も増えてしまいます。

たとえば、名前、年齢、メールアドレス、住所、電話番号などをすべて@RequestParamで受け取ると、メソッドの宣言が長くなります。

そのようなときに便利なのがフォームクラスです。

フォームクラスとは、フォームから送信された値をまとめて受け取るための専用クラスです。

フォームクラスの例

ファイル名: MemberForm.java

package com.example.demo.model;

public class MemberForm {
    private String name;
    private int age;
    private String email;

    public MemberForm() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

MemberForm.javaは、com.example.demo.modelパッケージに作成します。

このクラスには、フォームから送信されるname、age、emailに対応するフィールドを用意しています。

フォームクラスでは、引数なしのコンストラクタとsetterメソッドを用意します。

Springは、フォームから送信されたリクエストパラメータを、対応するフィールドに自動的に設定します。

たとえば、フォームからname、age、emailという名前で値が送られてきた場合、SpringはMemberFormのsetName、setAge、setEmailを使って値を設定します。

フォームクラスをハンドラメソッドで受け取る例

ファイル名: MemberFormController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;

import com.example.demo.model.MemberForm;

@Controller
public class MemberFormController {

    @PostMapping("/MemberConfirm")
    public String confirmMember(MemberForm memberForm) {
        String name = memberForm.getName();
        int age = memberForm.getAge();
        String email = memberForm.getEmail();

        // フォームから受け取った値を使った処理を記述する
        return "memberConfirm";
    }
}

この例では、ハンドラメソッドの引数にMemberFormを指定しています。

@RequestParamを1つずつ書かなくても、SpringがリクエストパラメータをMemberFormの各フィールドに自動的に設定します。

confirmMemberメソッドの中では、memberForm.getName、memberForm.getAge、memberForm.getEmailを使って値を取り出せます。

フォームクラスを使うと、入力項目が多いフォームでも、ハンドラメソッドの引数をすっきり保てます。

また、フォームの入力チェックであるバリデーションを行う場合にも、フォームクラスを使うと整理しやすくなります。

@RequestParamとフォームクラスの使い分け

@RequestParamとフォームクラスは、どちらもリクエストパラメータを受け取るための方法です。

入力項目の数や処理の内容に応じて使い分けます。

使い分けの目安

方法向いている場面
@RequestParam受け取る値が少ない場合
フォームクラス入力項目が多い場合
HttpServletRequestリクエスト全体を細かく扱いたい場合
HttpSessionログイン情報などをセッションスコープで扱いたい場合

たとえば、検索キーワードを1つだけ受け取るなら@RequestParamで十分です。

会員登録フォームのように、名前、年齢、メールアドレスなど複数の値をまとめて受け取るなら、フォームクラスを使うと読みやすくなります。

Springコントローラで押さえたいこと

Spring MVCのコントローラは、リクエストを受け取り、処理の流れを決めるクラスです。

これまでサーブレットが担当していた役割に近いものですが、Springでは通常のJavaクラスとして作成します。

コントローラクラスには@Controllerを付けます。

GETリクエストを処理するメソッドには@GetMappingを付けます。

POSTリクエストを処理するメソッドには@PostMappingを付けます。

これらのメソッドはハンドラメソッドと呼ばれます。

ハンドラメソッドには、@RequestParamを使ってリクエストパラメータを受け取ることができます。

リクエストパラメータ名と引数名が一致していれば、@RequestParamのパラメータ名指定は省略できます。

名前が一致しない場合は、@RequestParam("user_name")のようにパラメータ名を指定します。

HttpServletRequestやHttpSessionなども、ハンドラメソッドの引数として受け取れます。

ハンドラメソッドの戻り値には、表示したいビュー名を返します。

return "greeting"; のように書くと、greeting.jspへフォワードされます。

リダイレクトしたい場合は、return "redirect:/Greeting"; のようにredirect:を付けます。

入力項目が多いフォームでは、フォームクラスを使うと、リクエストパラメータをまとめて受け取れます。

Springのコントローラは、サーブレットで学んだリクエスト処理の考え方を土台にしながら、よりシンプルで統一された書き方を実現してくれます。

まずは、@Controller、@GetMapping、@PostMapping、@RequestParam、戻り値によるビュー指定の流れをしっかり押さえておきましょう。