画面をまたいでデータを保持する仕組みを作ってみよう|Spring MVCで学ぶ初心者向けガイド
新人
「Webアプリで画面を移動しても入力した情報を保持したいんですが、どうすればいいですか?」
先輩
「それはセッションやスコープを使うと実現できるよ。Spring MVCなら簡単に画面をまたいでデータを保持できる仕組みを作れるんだ。」
新人
「スコープって何ですか?セッションとどう違うんですか?」
先輩
「いい質問だね。まずは画面をまたいでデータを保持する必要性と、Spring MVCで使える方法を整理しよう。」
1. 画面をまたいでデータを保持する必要性
Webアプリケーションでは、ユーザーが入力フォームに情報を入力して次の画面に進む場合や、複数ページにわたって同じ情報を利用する場合があります。このようなケースでは、ページを移動してもデータを失わない仕組みが必要です。
例えば、ショッピングサイトではカートに商品を入れた状態を維持したまま別のページを閲覧できます。これが「画面をまたいでデータを保持」する具体的な例です。もしこの仕組みがなければ、ページを移動するたびにデータが消えてしまい、ユーザー体験が大きく損なわれます。
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環境での準備手順
Spring MVCのプロジェクトをPleiadesとGradleで構築する手順を確認しましょう。今回の例ではMavenは使用せず、Gradleを採用します。
- Pleiadesをインストールして起動。
- 「新規プロジェクト」から「Gradleプロジェクト」を選択。
- 依存関係追加画面でSpring Web MVC関連の依存関係にチェックを入れる。
- プロジェクト作成後、
@Controllerクラスを作成してセッションを扱うコードを記述。 - 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を使ってデータを保持する方法
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と組み合わせてデータを表示する方法
セッションに保存された値は直接ビューで参照することも可能ですが、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. 複数画面間でデータを受け渡す際の注意点(スコープ、タイミング)
画面をまたいでデータを保持する際には、スコープと値の更新タイミングを意識することが重要です。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. データ更新時に画面へ即時反映する方法
画面をまたいでデータを保持する仕組みを使っている場合、ユーザーが入力内容や設定を変更したときに、即座に画面へ反映させることは重要です。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. セッションの値をクリアする方法(ログアウトやデータリセット)
画面をまたいでデータを保持する機能は便利ですが、不要になったら速やかに削除する必要があります。特にログアウト処理や設定のリセット時には、セッション内のデータをクリアしないと、古い情報が残ってしまう恐れがあります。
Spring MVCではremoveAttribute()で特定のデータを削除するか、invalidate()でセッション全体を破棄します。
@GetMapping("/logout")
public String logout(HttpSession session) {
// ユーザー名のみ削除する場合
session.removeAttribute("userName");
// セッション全体を破棄する場合
// session.invalidate();
return "redirect:/login";
}
ログアウト画面やリセット機能では、上記のようにセッションを適切にクリアしましょう。特にinvalidate()を使う場合は、そのセッションに保持していた全てのデータが消える点に注意してください。
例えば、ログイン後のユーザー情報を全て消す必要がある場合はinvalidate()を使いますが、カート情報だけを消す場合はremoveAttribute()で特定の値だけ削除します。
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";
}
}
このように、データの保存・更新・削除の流れをしっかり設計することで、画面をまたいでデータを保持する処理が安全かつ効率的になります。セッションは非常に便利な機能ですが、使い方を誤ると不具合やセキュリティ問題につながるため、設計段階から注意しておきましょう。