■スコープ
サーブレットクラスで作成したインスタンスをJSPファイルで利用するために、スコープを使用する。
スコープとは、インスタンスを保存する領域であり、サーブレットクラス・JSPファイル共にインスタンスの保存・保存したインスタンスの取得をすることができる。
▼スコープの種類
スコープは、以下、4つの種類がある。
・ページスコープ
・リクエストスコープ
・セッションスコープ
・アプリケーションスコープ
※保存したインスタンスの有効期限の長さが異なる。
▼スコープのお約束
スコープに保存できるのはあくまでインスタンスのみである。
int型やString型などのデータ型の変数を保存することはできない。
データ型の変数を保存したい場合は、ラッパークラス(データ型のみを保持するクラス)を作成し、そのラッパークラスをインスタンス→保存する。
▼JavaBeans
スコープには、JavaBeansと呼ぶクラスのインスタンスを保存することが多い。
JavaBeans(※現場によってはBeanと呼ぶこともある)とは、クラスの独立性を高め、部品として再利用するために、以下のルールがある。
①直列可能(java.io.Serializableをimportし、クラスに対してインターフェースしている)
②クラスはpublic
③publocで引数のないコンストラクタを持つ
④フィールドはprivate
⑤取得、保存はゲッター/セッターを使用する。
■セッションスコープ
セッションスコープにおいて、保存したインスタンスは、開発者が明示的に削除するか、ブラウザを閉じるまで保持される。
リクエスト→レスポンス後もインスタンス情報は残るので、リクエストを跨いで使用可能である。
★ユーザログイン情報などに使用されている場合が多い。
▼作成するプログラムの概要
フォーム画面で入力した情報をセッションで保持して画面に表示する。
▼フローチャート
▼プログラム仕様
・サーブレットクラス(UserInfoSession.java)
(1)POST処理
インプット | 処理内容 | アウトプット |
---|---|---|
– | ユーザ情報のJavaBeans(UserInfoBeans)をインスタンスする。 | – |
【フォーム情報】 ID 名前 パスワード | 【フォーム情報】をユーザ情報へセットする。 | – |
ユーザ情報をセッションスコープに保存する。 | – | |
【URL】 *1 | JSPファイルへ画面遷移する。 | – |
*1:URL(/WEB-INF/jsp/userinfo_session.jsp)
(2)GET処理
インプット | 処理内容 | アウトプット |
---|---|---|
【URL】 *1 | JSPファイルへ画面遷移する。 | – |
*1:URL(/WEB-INF/jsp/userinfo_session.jsp)
・JSPファイル(userinfo_session.jsp)
インプット | 処理内容 | アウトプット |
---|---|---|
– | ユーザ情報のJavaBeans(UserInfoBeans)をインスタンスする。 | – |
– | 【条件分岐】 ▼ユーザ情報がNullの場合 セッションにデータがない旨を出力する。・・・① ▼ユーザ情報がある場合 ユーザ情報を出力する。・・・② | 【画面】 ①「セッション情報はありません」 ②「ID、名前、パスワード」 |
▼画面仕様
・セッション情報がない場合
①入力フォームを作成する。
「ID」、「名前」:テキスト
「パスワード」:パスワード(伏せ字)
「登録」ボタン押下により、サーブレットクラスへ遷移
②セッション情報がない場合は「セッション情報はありません」を表示する。
・セッション情報がある場合
①入力フォームを作成する。
「ID」、「名前」:テキスト
「パスワード」:パスワード(伏せ字)
「登録」ボタン押下により、サーブレットクラスへ遷移
②セッション情報がある場合は、「登録」ボタン押下時にフォームで設定した「ユーザ情報」を表示する。
▼サンプルコード
・サーブレットクラス(UserInfoSession.java)
package servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import beans.UserInfoBeans;
@WebServlet("/UserInfoSession")
public class UserInfoSession extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 画面へ遷移
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userinfo_session.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Jspのフォーム画面からユーザ情報を取得
request.setCharacterEncoding("UTF-8");
String user_id = request.getParameter("id");
String user_name = request.getParameter("name");
String user_password = request.getParameter("password");
// ユーザ情報格納クラスをインスタンス
UserInfoBeans userinfo = new UserInfoBeans();
// ユーザ情報を格納する
userinfo.setUserData_Id(user_id);
userinfo.setUserData_Name(user_name);
userinfo.setUserData_Password(user_password);
// セッションスコープに登録ユーザを保存
HttpSession session = request.getSession();
session.setAttribute("userinfo", userinfo);
// 画面へ遷移
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userinfo_session.jsp");
rd.forward(request, response);
}
}
・JavaBeans(UserInfoBeans.java)
package beans;
import java.io.Serializable;
public class UserInfoBeans implements Serializable {
// フィールドを設定
private String userdata_id;
private String userdata_name;
private String userdata_password;
// コンストラクタ(指定なし)
public UserInfoBeans() {}
// ゲッターとセッターを作成
public String getUserData_Id() {
return userdata_id;
}
public void setUserData_Id(String userdata_id) {
this.userdata_id = userdata_id;
}
public String getUserData_Name() {
return userdata_name;
}
public void setUserData_Name(String userdata_name) {
this.userdata_name = userdata_name;
}
public String getUserData_Password() {
return userdata_password;
}
public void setUserData_Password(String userdata_password) {
this.userdata_password = userdata_password;
}
}
・JSPファイル(userinfo_session.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="beans.UserInfoBeans" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザ登録&情報</title>
</head>
<body>
<!-- 登録情報入力 -->
<form action="http://localhost:8080/JspServletSample/UserInfoSession" method="post">
<p>
ID:<input type="text" name="id">
<br>
名前:<input type="text" name="name">
<br>
パスワード:<input type="password" name="password">
</p>
<input type="submit" value="登録">
</form>
<!-- セッション取得情報(取得できた場合のみ表示) -->
<p>#################### セッション情報 ####################</p>
<!-- セッションの呼びだし -->
<%
UserInfoBeans userinfo = (UserInfoBeans)session.getAttribute("userinfo");
if(userinfo == null){
%>
<p>セッション情報はありません</p>
<%
} else {
%>
<p>
ID:<%=userinfo.getUserData_Id() %>
<br>
名前:<%=userinfo.getUserData_Name() %>
<br>
パスワード:<%=userinfo.getUserData_Password() %>
</p>
<%
}
%>
</body>
</html>
▼実行結果
・起動時
・フォーム入力および「登録」ボタン押下
・セッション情報あり
・セッション情報は残っているため、新しいタブでも情報は保持されたまま
コメント
[…] ソースからの抜粋: … […]