自分の為のまとめ
Eclipseを使用しています
JSPとServlet
JSPとServletはどちらもJavaを使ってWebアプリケーションを開発するため技術。どちらも密接に連携して動作する。
JSPとServletの違い
特徴 | JSP | サーブレット |
---|---|---|
役割 | プレゼンテーション層(ビュー)を担当 | ビジネスロジック層(コントローラー)を担当 |
記述 | HTMLにJavaコードを埋め込む | 純粋なJavaコードで記述 |
適用場面 | HTMLの見た目やデザインを動的に生成 | リクエスト処理やビジネスロックを実装 |
実装方法 | JSPファイルとして記述 | Javaクラスとして記述 |
変換 | サーブレットに変換されて実行 | そのままSサーブレットとして実行 |
JSPとサーブレットを連携
連携させるには、サーブレットからJSPにリクエストをフォワードする方法をしよう。サーブレットで処理した結果をJSPに渡し、JSPがそれをビューとしてユーザに提供する。
①サーブレットでリクエスト処理をする
サーブレットはHTTリクエストを受け取り、ビジネスロックやデータ処理を行う
②リクエスト属性にデータを設定する
サーブレットで処理したデータをreauest
オブジェクトの属性として保存する。
③JSPにリクエストをフォワードする
サーブレットはRequestDispatcher
を使って、処理結果をJSPにフォワードする。JSPがそのリクエストを受け取り、保存されたデータを使ってHTMLに生成する。
値の受け渡し
JSPとサーブレットの間で値を受け渡すには、スコープによって値の共有を行う
リクエストスコープ(Request Scope)
・対象
単一のHTTPリクエスト
・説明
設定されたデータは、そのリクエスト内でのみ有効。サーブレットからJSPにデータを渡す場合などに使われる。次のリクエストには引き継がれない
・例
ユーザーがフォームに入力したデータを、サーブレットで処理してJSPで表示する場合
// 値を設定(セッター)
request.setAttribute("スコープ名",値);
(例)
request.setAttribute("name", "山田太郎");
// 値を受け取る(ゲッター)
データ型 変数名 = (データ型)request.getAttribute("スコープ名")
(例)
String name = (Stirng)request.getAttribute("name")
セッションスコープ(Session Scope)
・対象
単一のユーザセッション
・説明
設定されたデータは、特定のユーザーがブラウザを閉じるまで、またはセッションがタイムアウトするまで保持される。ログイン情報やユーザーの状態管理に使われる
・例
ユーザーのログイン状態を保持し、異なるページ間でその状態を利用する場合
// 値を設定(セッター)
HttpSession session = request.getSession();
session.setAttribute("スコープ名", 値);
(例)
HttpSession session = request.getSession();
session.setAttribute("name", "山田太郎");
//値を受け取る(ゲッター)
データ型 変数 = (データ型)session.getAttribute("スコープ名", 値);
(例)
String name = (String)session.getAttribute("name",”山田太郎”)
アプリケーションスコープ(Application Scope)
・対象
Webアプリケーション全体
・説明
設定されたデータは、アプリケーション全体で共有される。サーバーが停止するか、アプリケーションが再展開されるまでデータが保持される。
・例
全ユーザーで共有するデータやアプリケーション全体の設定情報
//値を設定する(ゲッター)
getServletContext().setAttribute("スコープ名", 値);
(例)
getServletContext().setAttribute("appName", "MyWebApp");
//値を受け取る(セッター)
データ型 変数名 = (データ型)getServletContext().getAttribute("スコープ名");
(例)
String appName = (String)getServletContext().getAttribute("appName");
ページスコープ(Page Scope)
・対象
単一のJSPページ
・説明
設定されたデータは、現在のJSPページ内でのみ有効。別のサーブレットやJSPには影響されない
・例
JSPページ内で一時的に使用するデータ
// 値を設定(セッター)
pageContext.setAttribute("greeting", "こんにちは!");
(例)
pageContext.setAttribute("pageTitle", "ホームページ");
// 値を受け取る(ゲッター)
String greeting = (String)pageContext.getAttribute("greeting");
(例)
String pageTitle = (String)pageContext.getAttribute("pageTitle");
コードを記述してみる
サーブレットからJSPを呼び出す。
//サーブレットファイル(TestServlet.java)
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//RequestDispatcherオブジェクトを取得
RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/test.jsp");
// jspファイルにリクエストをフォワードする。
dispatcher.forward(request,response);
}
}
// jspファイル(test.jsp)
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>表示</title>
</head>
<body>
<p>JSPとサーブレットの連携<p>
</body>
</html>
値の受け渡し
//サーブレットファイル(TestServlet.java)
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// nameというスコープ名に "山田太郎" という値を設定
request.setAttribute("name", "山田太郎");
//RequestDispatcherオブジェクトを取得
RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/test.jsp");
// jspファイルにリクエストをフォワードする。
dispatcher.forward(request,response);
}
}
// jspファイル(test.jsp)
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>名前表示</title>
</head>
<body>
<p>値の受け渡し<p>
こんにちは<%= (String)request.getAttribute("name") %>さん
</body>
</html>
ログイン画面
import java.io.IOException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String message = null;
String id = request.getParameter("id");
String pass = request.getParameter("pass");
if(id.equals("test") && pass.equals("1234")) {
message = "ようこそ" + id + "さん";
} else {
message = "IDまたはパスワードが違います";
}
request.setAttribute("message", message);
RequestDispatcher dispatch = request.getRequestDispatcher("/jsp/message.jsp");
dispatch.forward(request, response);
}
}
// login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>ログイン表示画面</title>
</head>
<body>
<h2>ログイン画面</h2>
<form method="post" action="/Sample/LoginServlet">
I D :<input type="text" name="id"><br><br>
パスワード:<input type=text name="pass"><br><br>
<input type="submit" value="送信">
</form>
</body>
</html>
// message.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>ログイン結果</title>
</head>
<body>
<h2>ログイン結果</h2>
<%= (String)request.getAttribute("message") %>
</body>
</html>