Webシステム開発講座へようこそ!
今回は、サーブレットを利用して、画面遷移時のセッション管理の基本を学びながら、ユーザー情報を表示する機能を実装していきます。
この記事は次のような方におすすめです:
- JSPやサーブレットをこれから学ぼうとしている
- SEとして新たなスキルを身につけたい方
- セッションの仕組みがいまいち理解できていない方
前回の画面作成の記事をまだご覧になっていない方は、こちらからご確認ください。
目次 非表示
前回の課題の回答
課題1
既存のサーブレットに新しいサーブレット(menuServlet.java
)を追加しましょう。Eclipseを使用している場合、「参照」ボタンを使うと効率的に作成できます。
menuServlet.java
の doGet
メソッドを以下のように修正します。
<h1>メニュー画面</h1> <p>ようこそ、<%= (String) session.getAttribute("loggedInUser") %>さん!</p> <form action="/AnkiSystem/menuServlet" method="GET">
ポイント解説
- 遷移先がログイン画面(
login.jsp
)になるため、request.getRequestDispatcher
の引数を変更しています。 forward
メソッドでリクエストとレスポンスをそのまま次のページに渡します。
次に、menu.jsp
のログアウトボタンにサーブレットへ遷移するように設定します。
<form action="/AnkiSystem/menuServlet" method="GET"> <div class="menu-buttons"> <button class="menu-button">問題作成</button> <button class="menu-button">成績確認</button> <button class="menu-button">トレーニング</button> <button class="menu-button">各種設定</button> </div> <button class="menu-button logout">ログアウト</button> </form>
ポイント解説
- ログアウトボタンが
menuServlet.java
にリクエストを送るよう、action="/AnkiSystem/menuServlet"
を設定しています。
課題2
ヒント: サーブレットでリクエストスコープ(
request.setAttribute
)を使用してデータを渡し、JSPでそのデータを表示する仕組みを考えてみましょう。この課題の解答については、次の章で「セッションとは何か」を詳しく解説しながら進めていきます。セッション管理の基本や実際の実装方法について学びつつ、課題の解決方法を確認していきましょう!
セッションとは何か
ユーザー情報の一時的な保存場所
セッションは、Webアプリケーションでユーザーごとに一時的なデータを保持する仕組みです。たとえば、ログインしたユーザーの情報を一時的に保存し、次の画面でもその情報を利用する際に使います。
仕組み
- Webは基本的に「ステートレス(状態を持たない)」な通信です。
- セッションを使用することで、ユーザーの状態をサーバー側で一時的に管理可能になります。
- セッションIDという一意の識別子を使って、サーバーとクライアントのやり取りを継続的に行います。
特徴
- 一時的: ユーザーがブラウザを閉じたり、セッションのタイムアウトが発生すると情報が失われます。
- 安全性: セッションはサーバー側で管理されるため、データがクライアントに漏れにくい。
セッションの実装(課題2の回答)
完成図
今回の課題の完成図は以下の通りです。
ログイン画面で入力したユーザー名をメニュー画面で表示させるようにします。
サーバーサイド(Javaコード)の修正
最初に menuServlet.java
などのサーバーサイドのコードを修正し、セッションに必要なデータを正しく格納するようにします。これにより、クライアントサイド(JSPファイル)でのデータ取得が確実に行える状態を作ります。
loginServlet.javaの修正
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); // クエリパラメータからユーザー名を取得 HttpSession session = request.getSession(); // 現在のセッションを取得 session.setAttribute("loggedInUser", username); // ユーザー名をセッションに保存 RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp"); dispatcher.forward(request, response); }
修正のポイント
- ユーザー名の取得:
request.getParameter("username")
を使用して、login.jsp
の入力フォームから送信されたユーザー名を取得します。 - セッションの取得と設定:
request.getSession()
により、現在のセッションを取得し、session.setAttribute("loggedInUser", username)
でユーザー名をセッションに保存します。これにより、menu.jsp
でユーザー名を表示することが可能になります。
データ渡しの確認
サーブレットのデータ渡しが正しく行われているかを確認するために、Eclipseでブレークポイントを設定し、デバッグモードで確認する方法を解説します。これにより、プログラムの挙動をリアルタイムで追跡し、問題の早期発見が可能になります。
- ソースコードを開く: Eclipseで確認したいサーブレットのソースコードを開きます(今回は
menuServlet.java
で実施) - ブレークポイントを設定する: デバッグしたい箇所(例:
doGet
メソッドやdoPost
メソッド内)で、行番号をクリックすると、図のようにピン留めマークが張られます。
- デバッグモードで起動: 実行対象のjspファイルを右クリックし、デバッグ>サーバーでデバッグ、の順に実施してプロジェクトをデバッグモードで起動します。
- システムを動かす: 設定したブレークポイントに到達するように、システムを動かします。今回の例では、ユーザー名「test」を入力し、ログインボタンを押してください。
- ステップ実行:画面左上部にある
Step Over
(F6)やStep Into
(F5)を使用して、コードを1行ずつ実行し、処理の流れを追跡しましょう。処理を一気に進める場合は、Continue
(F8)ボタンを押してください。 - データ確認:変数の中身を確認するには、カーソルをその変数に当てるだけです。例えば、
username
に「test」が入っているか確認できます。
※変数に値がセットされるのは処理がその行を通過した後です。変数に値を格納する前のタイミングではnull
となっている場合があります。
- Step Over: メソッドの内部には入らず次の行に進む。
- Step Into: メソッドの内部に入り、詳細を確認する。
- Step Return: 現在のメソッドの処理を終了し、呼び出し元に戻る。
JSPファイルの修正
次に、ログインユーザー情報を表示させるために menu.jsp
を修正しましょう。以下に、修正後の menu.jsp
のコードを示します(修正箇所のみを抜粋)。
menu.jspの修正
<h1>メニュー画面</h1> <p>ようこそ、<%= (String) session.getAttribute("loggedInUser") %>さん!</p> <form action="/AnkiSystem/menuServlet" method="GET">
修正のポイント
- ユーザー名の表示:
<%= (String) session.getAttribute("loggedInUser") %>
を使用して、セッションから “loggedInUser” というキーで格納されたユーザー名を取得し、表示しています。 - 注意点: セッションに格納される値が
null
でないことを確認しましょう。セッションが切れている場合や、ユーザー名が正しくセットされていない場合は、エラーや空の表示になる可能性があります。
セッションのクリア処理
セッションのクリア処理は、ログアウト時に重要なステップです。セキュリティ面を考慮して、セッションを適切に終了することで、信頼性の高いシステムを構築できます。
セッションのクリア処理の実装
ログアウトボタンを押下した際に、セッションをクリアするように menuServlet.java
の doGet
メソッドを以下のように修正しましょう。
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.invalidate(); response.sendRedirect("/AnkiSystem/login.jsp"); }
ポイント解説
- 現状のセッション情報を取得:
request.getSession()
を使用して、現在のセッションを取得します。この操作は、クライアントに関連付けられているセッション情報にアクセスするために必要です。 - セッション情報をクリア:
session.invalidate()
を実行することで、現在のセッションをクリアし、すべてのセッションデータを無効化します。この処理は、ユーザーのログアウト後にセッションを保持しないようにするための重要なステップです。
追加の注意点
- セキュリティ強化: セッションのクリアは、特にユーザーの個人情報や認証情報がセッションに保存されている場合に重要です。セッションのクリアを怠ると、セキュリティリスクが増大する可能性があります。
- ユーザー体験の向上: 明示的にログアウトする機能を提供することで、ユーザーが自分のセッションを安全に終了できるようになります。
課題
講義を受けるだけでは本当に一人前にはなれません。自分で調べて実践する力をつけることが大切です。
以下の課題に挑戦し、ネットで調べながら完成させてみましょう。
課題 1: ログアウト処理の確認
「ログアウトボタンを押下した後、適切にログイン画面へリダイレクトされ、セッションがクリアされていることを確認してください。」
- 目的: ログアウト機能の動作確認とセッションのクリアが適切に行われていることを理解する。
- ヒント: ログアウト後に再度メニュー画面へのアクセスを試みて、ログイン画面に戻ることを確認します。
課題 2: ログイン後のウェルカムメッセージの変更
「ログインしたユーザー名が”test”の場合、ウェルカムメッセージを【試験用画面】と表示させるようにしてください」
- 目的: ユーザーごとに異なるメッセージを表示し、個別対応の方法を学ぶ。
- ヒント:
if
文を使用して、特定のユーザー名に対して特別なメッセージを表示します。
今回の講義では、セッションの基本を理解し、サーブレットを使ったデータのやり取りや画面遷移について学びました。セッションを利用することで、ユーザーごとの情報を効率的に管理できるようになり、より信頼性の高いWebシステムの構築が可能になります。
これまで学んだ内容を活かして、ぜひ課題にチャレンジしてみてください。実際に手を動かすことで理解が深まりますし、次回の講義で取り上げる内容もスムーズに習得できるようになるでしょう。
今後は、doGet
と doPost
メソッドの違いについて詳しく解説し、さらに高度なWebアプリケーションの開発へと進んでいきます。これからも一緒に学びを深めていきましょう!
何か質問やフィードバックがあれば、ぜひコメントで教えてください。引き続き、皆さんの成長をサポートできるよう、丁寧に解説していきます。それでは、次回の講義でお会いしましょう!
「記事の更新を待てない!」「すぐに動画で学びたい!」という方には、Udemyでの学習がおすすめです。
私自身も利用して、基礎から応用までしっかりと学べたので、非常に助かりました!ぜひ一度チェックしてみてください。
Udemyについての詳しい記事はコチラをご参照ください。