Webシステム開発講座へようこそ!
今回は サーブレット を利用して、画面遷移の機能を実装していきます。
この記事は次のような方におすすめです:
- JSPをこれから勉強しようとしている人
- SEとして何か「武器」を身につけたい方
- サーブレットの仕組みがよくわからない方
前回の画面作成の記事をまだ読んでいない方は、こちらからご確認ください。
前回の課題の回答
課題1
ヒント:box-shadowプロパティを調べてみると良いでしょう。
CSSの文法や例を検索して、自分なりのデザインを作り上げてください。
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
border-radius: 8px;
課題2
.login-button:hover {
background-color: #555;
}
サーブレットについて
サーブレット(Java Servlet)とは、Webサーバ上(バックエンド)で動くプログラムのことで、プログラミング言語のJavaを使って作成されています。 動的なWebページの配信システムを実現するためのJavaプログラムです。
サーブレットを利用すると以下のようなことが可能です
- 利用者の入力に応じた画面表示(例: ログイン機能や検索結果の表示)
- 画面遷移や処理の振り分け
- セッション管理(ログイン状態やカート情報の保持)
- データベースや外部APIとの連携
画面遷移について
画面遷移とは?
画面遷移は、Webアプリケーションやモバイルアプリケーションにおいて、ユーザーがある画面から別の画面へ移動するプロセスを指します。ユーザーが行う操作(ボタンをクリックする、リンクを選択する、フォームを送信するなど)によって、新しい画面が表示されることが「画面遷移」です。
画面遷移はユーザーが何らかの操作を行うことで発生します。一般的な流れは次の通りです。
- ユーザーの入力(例:ボタンのクリック)
- リクエスト送信(サーバーにリクエストを送る)
- サーバーのレスポンス(画面遷移の指示が返される)
- 新しい画面の表示(新しい画面がユーザーに表示される)
例えば、ユーザーが「ログイン」ボタンをクリックすると、サーバーに対して「ログイン処理を行い、成功したらメニュー画面を表示してほしい」というリクエストが送信されます。サーバーはリクエストに基づいて処理を行い、ログイン成功ならばメニュー画面へ遷移するように指示します。
画面遷移の種類
画面遷移には主に2つのタイプがあります。
- サーバーサイド遷移(サーバー側で処理を行い、画面が切り替わる)
- クライアントサイド遷移(JavaScriptやクライアントサイドの技術を使って画面が切り替わる)
サーバーサイド遷移は、サーバーが処理をした後、別のページをユーザーに表示する方法です。サーブレットで実装することが多いです。今回のシステムで実装するのはコレになります。
画面遷移の具体的な例
- ログイン画面 → メニュー画面
ユーザーがログインフォームを入力し、送信ボタンを押すと、ログイン認証後にメニュー画面が表示される。 - 商品一覧 → 商品詳細ページ
ユーザーが商品をクリックすると、その商品の詳細情報を表示するページに遷移する。
サーブレットを利用した画面遷移を実装
完成図
それでは実際にサーブレットを利用して画面遷移を実装していきます。
今回の完成図のイメージはコチラ。
ログインボタンを押下することでメニュー画面を表示できるようにします。
作成準備
先にメニュー画面を作成しましょう。プログラムは以下の通りです。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>暗記沼</title> <link rel="stylesheet" href="css/menu.css"> </head> <body> <div class="menu-container"> <h1>メニュー画面</h1> <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> </div> </body> </html>
/* 基本のリセット */ * { margin: 0; padding: 0; box-sizing: border-box; } /* 全体のスタイル */ body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: #f4f4f4; } /* メニュー画面のスタイル */ .menu-container { width: 800px; height: 500px; padding: 2rem; background-color: #fff; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: center; display: flex; flex-direction: column; justify-content: space-between; } /* ヘッダーのスタイル */ .header { display: flex; justify-content: space-between; align-items: center; font-size: 0.9rem; color: #333; } .user-id { font-weight: bold; } .date { font-weight: bold; } /* メニュータイトルのスタイル */ .menu-container h1 { margin-bottom: 1rem; font-size: 1.5rem; color: #333; } /* ボタンの2列レイアウト */ .menu-buttons { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } /* 各メニューボタンのスタイル */ .menu-button { padding: 0.75rem; font-size: 1rem; background-color: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; transition: background-color 0.3s; } .menu-button:hover { background-color: #555; } /* ログアウトボタンをメニューの最下部に配置 */ .logout { background-color: #d9534f; width: 80%; margin: 1rem auto 0; /* 上部にマージンを入れ、中央寄せ */ } .logout:hover { background-color: #c9302c; }
サーブレットを作成する手順
最初はまず、サーブレットの作成を行いましょう。
「src」フォルダ(通常はプロジェクトエクスプローラー内に表示されます)上で右クリックし、「新規」>「その他」を選択します。
「Javaパッケージ」を com.webpj.ankisystem、クラス名を loginServlet に設定します。パッケージ名は、小文字で「.(ドット)」を使って階層を表現します。このようにすることで、コードの整理がしやすくなり、プロジェクトが大きくなっても管理が簡単になります。
作成後、以下のようなコードが自動生成されます。この状態で、ブラウザを使って動作を確認してみましょう。
package com.webpj.ankisystem; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class loginServlet */ @WebServlet("/loginServlet") public class loginServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public loginServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
完成後、http://localhost:8080/AnkiSystem/loginServlet
にブラウザでアクセスして「Served at: …」と表示されれば成功です。
JSPファイルの修正
サーブレットの作成が完了したので、次はJSP側からサーブレットを呼び出す処理を実装していきましょう。以下に、前回作成した login.jsp の修正後のコードを表示します(修正箇所のみを抜粋)。
修正後のJSPコード
<form action="/AnkiSystem/loginServlet" method="GET"> <div class="form-group"> <label for="username">ユーザー名</label> <input type="text" id="username" name="username"> </div> <div class="form-group"> <label for="password">パスワード</label> <input type="password" id="password" name="password"> </div> <button type="submit" class="login-button">ログイン</button> </form>
修正のポイント
<form>
タグのaction
属性で、データ送信先を/AnkiSystem/loginServlet
に指定しています。method="GET"
を設定することで、ユーザーが入力したデータをURLパラメータとして送信します。
フォームの役割と注意点
<form>
タグは、ユーザーが入力したデータをサーバーに送信するための仕組みです。- GETメソッドはURLにデータを表示するため、機密性の高い情報(例: パスワード)の送信には注意が必要です。この例では学習目的で使用しています。
動作確認
修正が完了したら、ブラウザでフォームを送信してみましょう。URLに以下のような形式でデータが表示されれば成功です。
http://localhost:8080/AnkiSystem/loginServlet?username=入力した値&password=入力した値
サーブレットの実装
それではサーブレット側の方の実装を行いましょう。
loginServlet.javaの一部を以下のように変更します。
/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //request.getDispatcherType() RequestDispatcher dispatcher = request.getRequestDispatcher("/menu.jsp"); dispatcher.forward(request, response); }
ポイント解説
- RequestDispatcherクラスの役割
RequestDispatcher
クラスを使用して、現在のリクエストをmenu.jsp
に転送します。これにより、サーブレットから次の画面への遷移が可能になります。 - 遷移の具体的な流れ
request.getRequestDispatcher("/menu.jsp")
: 遷移先の画面(この場合はmenu.jsp
)を指定します。dispatcher.forward(request, response)
: 現在のリクエストデータとレスポンスをmenu.jsp
に渡して画面遷移を実現します。
動作確認
修正が完了したら、ログイン画面で「ログイン」ボタンを押してみましょう。正しく設定されていれば、ログイン画面から menu.jsp
に遷移するはずです。ブラウザのURLや表示内容を確認してください。
課題
講義を受けるだけでは本当に一人前にはなれません。自分で調べて実践する力をつけることが大切です。
以下の課題に挑戦し、ネットで調べながら完成させてみましょう。
課題 1
ログアウトボタンでログイン画面へ遷移するようにしてください。
課題 2
「ログイン成功時、ログインしたユーザー名をメニュー画面に表示するようにしてください。」
ヒント: サーブレットでリクエストスコープ(request.setAttribute
)を使用してデータを渡し、JSPでそのデータを表示する仕組みを考えてみましょう。
今回の内容はいかがでしたでしょうか?
課題2については、セッションの活用方法がポイントになりますので、次回の講義で詳しく解説します!
もし分からないことや気になる点がありましたら、ぜひお気軽にコメントやご意見をお寄せください。お待ちしております!
「記事の更新を待てない!」「すぐに動画で学びたい!」という方には、Udemyでの学習がおすすめです。
私自身も利用して、基礎から応用までしっかりと学べたので、非常に助かりました!ぜひ一度チェックしてみてください。
Udemyについての詳しい記事はコチラをご参照ください。