カテゴリ: Spring 更新日: 2025/08/21

画面をまたいでデータを保持する仕組みを作ってみよう|Spring MVCで学ぶ初心者向けガイド

画面をまたいでデータを保持する仕組みを作ってみよう
画面をまたいでデータを保持する仕組みを作ってみよう

新人と先輩の会話形式で理解しよう

新人

「Webアプリで画面を移動しても入力した情報を保持したいんですが、どうすればいいですか?」

先輩

「それはセッションやスコープを使うと実現できるよ。Spring MVCなら簡単に画面をまたいでデータを保持できる仕組みを作れるんだ。」

新人

「スコープって何ですか?セッションとどう違うんですか?」

先輩

「いい質問だね。まずは画面をまたいでデータを保持する必要性と、Spring MVCで使える方法を整理しよう。」

1. 画面をまたいでデータを保持する必要性

1. 画面をまたいでデータを保持する必要性
1. 画面をまたいでデータを保持する必要性

Webアプリケーションでは、ユーザーが入力フォームに情報を入力して次の画面に進む場合や、複数ページにわたって同じ情報を利用する場合があります。このようなケースでは、ページを移動してもデータを失わない仕組みが必要です。

例えば、ショッピングサイトではカートに商品を入れた状態を維持したまま別のページを閲覧できます。これが「画面をまたいでデータを保持」する具体的な例です。もしこの仕組みがなければ、ページを移動するたびにデータが消えてしまい、ユーザー体験が大きく損なわれます。

Spring MVCでは、こうしたデータ保持の仕組みを簡単に構築できるようになっています。特にセッションリクエストスコープといった機能を使うことで、必要なデータを適切な期間だけ保持できます。

2. Spring MVCにおけるデータ保持の方法の概要(セッション、リクエストスコープなど)

2. Spring MVCにおけるデータ保持の方法の概要(セッション、リクエストスコープなど)
2. Spring MVCにおけるデータ保持の方法の概要(セッション、リクエストスコープなど)

Spring MVCでは、データの保持期間や利用範囲を決める「スコープ」という概念があります。代表的なのは以下の2つです。

  • リクエストスコープ:1回のリクエスト内でのみデータを保持。ページ遷移すると消える。
  • セッションスコープ:同じユーザーが同じブラウザでアクセスしている間、データを保持。複数ページにまたがって利用できる。

画面をまたいでデータを保持したい場合は、主にセッションスコープを使います。Spring MVCではHttpSessionを使ってデータを保存・取得できます。


@Controller
public class SessionSampleController {

    @GetMapping("/save")
    public String saveData(HttpSession session) {
        session.setAttribute("userName", "山田太郎");
        return "redirect:/show";
    }

    @GetMapping("/show")
    public String showData(HttpSession session, Model model) {
        String name = (String) session.getAttribute("userName");
        model.addAttribute("name", name);
        return "showView";
    }
}

上記では/saveにアクセスするとセッションにデータを保存し、/showで取得して表示しています。このように簡単なコードで画面をまたいでデータを保持できます。

3. Gradle + Pleiades環境での準備手順

3. Gradle + Pleiades環境での準備手順
3. Gradle + Pleiades環境での準備手順

Spring MVCのプロジェクトをPleiadesとGradleで構築する手順を確認しましょう。今回の例ではMavenは使用せず、Gradleを採用します。

  1. Pleiadesをインストールして起動。
  2. 「新規プロジェクト」から「Gradleプロジェクト」を選択。
  3. 依存関係追加画面でSpring Web MVC関連の依存関係にチェックを入れる。
  4. プロジェクト作成後、@Controllerクラスを作成してセッションを扱うコードを記述。
  5. Thymeleafテンプレートファイルをsrc/main/resources/templates配下に作成。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>データ表示</title>
</head>
<body>
    <h1>セッションの値を表示</h1>
    <p th:text="'ユーザー名: ' + ${name}">ユーザー名: 未設定</p>
</body>
</html>

このようにGradleとPleiadesの組み合わせでSpring MVC環境を用意すれば、セッションを使った「画面をまたいでデータを保持」する機能をすぐに試せます。初心者の方でも、この流れを覚えればすぐに実践的なWebアプリ開発に応用できます。

4. HttpSessionを使ってデータを保持する方法

4. HttpSessionを使ってデータを保持する方法
4. HttpSessionを使ってデータを保持する方法

Spring MVCで画面をまたいでデータを保持する最も基本的な方法は、HttpSessionを利用することです。HttpSessionはユーザーごとのセッション領域を持ち、同じブラウザからの複数リクエスト間でデータを保持できます。特にログイン情報やカートの中身など、ページを移動しても消えてはいけないデータを保持するのに向いています。

HttpSessionを使うには、コントローラメソッドの引数にHttpSession型のパラメータを追加し、setAttribute()メソッドでデータを保存します。取得するときはgetAttribute()を使います。


@Controller
public class SessionController {

    @GetMapping("/input")
    public String inputForm() {
        return "inputView";
    }

    @PostMapping("/saveData")
    public String saveData(@RequestParam String userName, HttpSession session) {
        session.setAttribute("userName", userName);
        return "redirect:/confirm";
    }

    @GetMapping("/confirm")
    public String confirmData(HttpSession session, Model model) {
        String savedName = (String) session.getAttribute("userName");
        model.addAttribute("name", savedName);
        return "confirmView";
    }
}

この例では、フォームで入力されたユーザー名をセッションに保存し、確認画面で表示しています。これにより、ページ間でデータが保持され、ユーザーの入力が失われることなく次の画面に渡せます。

5. Modelと組み合わせてデータを表示する方法

5. Modelと組み合わせてデータを表示する方法
5. Modelと組み合わせてデータを表示する方法

セッションに保存された値は直接ビューで参照することも可能ですが、Spring MVCではModelを介してビューに渡すのが一般的です。Modelはビューにデータを渡すための入れ物で、セッションの値を取得してModelにセットすることで、Thymeleafなどのテンプレートで簡単に表示できます。


@GetMapping("/display")
public String displayData(HttpSession session, Model model) {
    String userName = (String) session.getAttribute("userName");
    model.addAttribute("name", userName);
    return "displayView";
}

このコードではセッションからuserNameを取得し、Modelにnameというキーで登録しています。Thymeleafのビューでは以下のように表示します。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>データ表示</title>
</head>
<body>
    <h1>入力されたユーザー名</h1>
    <p th:text="'ユーザー名: ' + ${name}">ユーザー名: 未設定</p>
</body>
</html>

このようにModelとHttpSessionを組み合わせることで、画面をまたいだデータの保持と表示がスムーズに行えます。また、Model経由で渡すことでビューのコードがセッション依存にならず、保守性も向上します。

6. 複数画面間でデータを受け渡す際の注意点(スコープ、タイミング)

6. 複数画面間でデータを受け渡す際の注意点(スコープ、タイミング)
6. 複数画面間でデータを受け渡す際の注意点(スコープ、タイミング)

画面をまたいでデータを保持する際には、スコープ値の更新タイミングを意識することが重要です。Spring MVCではリクエストスコープとセッションスコープがあり、それぞれの特徴を理解して適切に使い分ける必要があります。

  • リクエストスコープ:1回のHTTPリクエストの間だけデータが有効。次のリクエストでは消える。
  • セッションスコープ:同じユーザーがブラウザを閉じるまで、またはセッションが切れるまでデータが保持される。

例えば、セッションに保存したデータを更新する場合、その更新が画面に即時反映されるようにModelにも同時に反映させるとユーザー体験が向上します。


@PostMapping("/updateName")
public String updateName(@RequestParam String newName, HttpSession session, Model model) {
    session.setAttribute("userName", newName);
    model.addAttribute("name", newName);
    return "displayView";
}

このように実装すると、セッションの更新と画面の表示が同時に行われ、ユーザーは変更結果をすぐに確認できます。また、不要になったデータはremoveAttribute()invalidate()で削除することが推奨されます。特に機密情報や一時的な入力データは長期間保持しないことが安全面でも大切です。

さらに、複数画面にわたって大量のデータを保持する場合は、セッションのメモリ消費量にも注意が必要です。必要最小限のデータだけを保持し、使い終わったら速やかに削除するのがベストプラクティスです。

7. データ更新時に画面へ即時反映する方法

7. データ更新時に画面へ即時反映する方法
7. データ更新時に画面へ即時反映する方法

画面をまたいでデータを保持する仕組みを使っている場合、ユーザーが入力内容や設定を変更したときに、即座に画面へ反映させることは重要です。Spring MVCでは、セッションに保存した値を更新し、同時にModelにも最新の値をセットすることで、即時反映が可能になります。

例えば、プロフィール編集画面でユーザー名を変更した場合のコード例は以下の通りです。


@PostMapping("/changeName")
public String changeName(@RequestParam String newName, HttpSession session, Model model) {
    // セッション内の値を更新
    session.setAttribute("userName", newName);
    // 即時反映のためModelにも設定
    model.addAttribute("name", newName);
    return "profileView";
}

この方法を使うと、ページを再読み込みしなくても新しい値が表示されます。Thymeleafテンプレートは以下のように記述します。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>プロフィール</title>
</head>
<body>
    <h1>プロフィール情報</h1>
    <p th:text="'現在のユーザー名: ' + ${name}">現在のユーザー名: 未設定</p>
    <form th:action="@{/changeName}" method="post">
        <input type="text" name="newName" placeholder="新しい名前を入力">
        <button type="submit">更新</button>
    </form>
</body>
</html>

こうすることで、セッションに保存しているデータが最新の状態に保たれ、ユーザー体験の向上につながります。

8. セッションの値をクリアする方法(ログアウトやデータリセット)

8. セッションの値をクリアする方法(ログアウトやデータリセット)
8. セッションの値をクリアする方法(ログアウトやデータリセット)

画面をまたいでデータを保持する機能は便利ですが、不要になったら速やかに削除する必要があります。特にログアウト処理や設定のリセット時には、セッション内のデータをクリアしないと、古い情報が残ってしまう恐れがあります。

Spring MVCではremoveAttribute()で特定のデータを削除するか、invalidate()でセッション全体を破棄します。


@GetMapping("/logout")
public String logout(HttpSession session) {
    // ユーザー名のみ削除する場合
    session.removeAttribute("userName");
    // セッション全体を破棄する場合
    // session.invalidate();
    return "redirect:/login";
}

ログアウト画面やリセット機能では、上記のようにセッションを適切にクリアしましょう。特にinvalidate()を使う場合は、そのセッションに保持していた全てのデータが消える点に注意してください。

例えば、ログイン後のユーザー情報を全て消す必要がある場合はinvalidate()を使いますが、カート情報だけを消す場合はremoveAttribute()で特定の値だけ削除します。

9. 画面をまたいでデータを保持する際のベストプラクティス

9. 画面をまたいでデータを保持する際のベストプラクティス
9. 画面をまたいでデータを保持する際のベストプラクティス

Spring MVCで画面をまたいでデータを保持する場合、便利な反面、管理が不十分だとバグやセキュリティリスクの原因になります。以下のポイントを意識すると安全で保守しやすい実装が可能です。

  • 本当に必要なデータだけをセッションに保存する。
  • 長期間使わないデータは早めに削除する。
  • セッション更新時にはModelにも値をセットして即時反映させる。
  • 機密情報(パスワードや個人情報など)はできる限りセッションに保存しない。
  • 画面間で利用するデータはスコープを意識して設計する。

以下はプロフィール情報を編集し、不要になったらクリアする例です。


@Controller
public class ProfileController {

    @GetMapping("/editProfile")
    public String editProfile(HttpSession session, Model model) {
        String name = (String) session.getAttribute("userName");
        model.addAttribute("name", name);
        return "editProfileView";
    }

    @PostMapping("/saveProfile")
    public String saveProfile(@RequestParam String name, HttpSession session, Model model) {
        session.setAttribute("userName", name);
        model.addAttribute("name", name);
        return "profileView";
    }

    @GetMapping("/clearProfile")
    public String clearProfile(HttpSession session) {
        session.removeAttribute("userName");
        return "redirect:/profile";
    }
}

このように、データの保存・更新・削除の流れをしっかり設計することで、画面をまたいでデータを保持する処理が安全かつ効率的になります。セッションは非常に便利な機能ですが、使い方を誤ると不具合やセキュリティ問題につながるため、設計段階から注意しておきましょう。

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
カテゴリの一覧へ
新着記事
テストとは?なぜプログラムに必要なのかをやさしく解説
Java の main メソッドとは?基本の書き方を学ぼう
Javaとは?初心者向けにやさしく解説
Spring Bootのディレクトリ構成と役割とは?初心者でもわかる完全ガイド
人気記事
No.1
Java&Spring記事人気No1
SQLのINSERT文を完全ガイド!初心者でもわかるデータの追加方法
No.2
Java&Spring記事人気No2
SQLのサブクエリを完全ガイド!入れ子クエリの使い方を初心者向け解説
No.3
Java&Spring記事人気No3
HTMLのセレクトボックス(プルダウン)の使い方を完全ガイド!selectとoptionの基本を覚えよう
No.4
Java&Spring記事人気No4
SQLのトリガー(TRIGGER)を完全ガイド!初心者でもわかる自動処理の仕組み