アプリケーションスコープ
■アプリケーションスコープの概要
・アプリケーションスコープに保存されたインスタンスはアプリケーションを停止するか、削除するまで利用可能
・アプリケーションスコープに保存されたインスタンスはブラウザを再起動後も利用可能
・リクエストスコープとは異なり、リクエストを跨いでの利用が可能
・リダイレクト先でも利用可能
※リクエストスコープの解説に関してはこちら→リクエストスコープ
※セッションスコープの解説に関してはこちら→セッションスコープスコープ
①アプリケーションスコープにインスタンスを保存
【基本構文】
import javax.servlet.ServletContext;
.
.
.
ServletContext application = this.getServletContext();
application.setAttribute("属性名", インスタンス);
②アプリケーションスコープのインスタンスを取得(getAttribute)
【基本構文】
application.getAttribute("属性名");
※元の型にキャストする必要があるので注意が必要
③セッションスコープのインスタンスを取得(EL式)
【基本構文】
${属性名.プロパティ)}
■サンプルアプリケーションでアプリケーションスコープの特徴を確認
【サンプルアプリケーションの概要】
・ログイン画面で「訪問」ボタンを押下すると訪問先画面に遷移する
・訪問先画面に訪問回数が表示される
【サンプルアプリケーションの構成】
・Beans.java(JavaBeansクラス)
・MainController.java(サーブレットクラス)
・login.jsp(ログイン画面) ※最初に遷移する画面
・result.jsp(訪問先画面) ※「訪問」ボタン押下後の遷移先画面
【ポイント】
・ログイン画面で「訪問」ボタンを押下 ⇒ 訪問回数が1回目と表示される
・ブラウザをリロードすると訪問回数が1回増える
・ブラウザを閉じて再度起動しても訪問回数はリセットされない
【サンプルアプリケーションのソースコード】
・Beans.java(JavaBeansクラス)
package controller;
import java.io.Serializable;
public class Beans implements Serializable {
private int num;
public Beans() {
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
・MainController.java(サーブレットクラス)
package controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/MainController")
public class MainController extends HttpServlet {
private static final long serialVersionUID = 1L;
public MainController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/login.jsp");
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
int num;
//アプリケーションスコープのインスタンス
ServletContext application = this.getServletContext();
Beans beans = new Beans();
//アプリケーションスコープに保存されていない場合⇒初回のログイン、結果画面
if (application.getAttribute("beans") == null) {
//1回目の訪問と表示する為に変数numに1をセット
num = 1;
beans.setNum(num);
} else {
//2回目以降のログイン、結果画面の場合はアプリケーションスコープに保存されている値を取得
Beans nextBeans = (Beans)application.getAttribute("beans");
//訪問回数を1増やす
num = nextBeans.getNum() + 1;
beans.setNum(num);
}
//アプリケーションスコープに保存
application.setAttribute("beans", beans);
//結果画面に遷移
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/result.jsp");
dispatcher.forward(request, response);
}
}
・login.jsp(ログイン画面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>
<form action="/ApplicationScope/MainController" method="POST">
<p><input type="submit" value="訪問"></p>
</form>
</body>
</html>
・result.jsp(訪問先画面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>訪問先画面</title>
</head>
<body>
<h1><c:out value="${beans.num}" />回目の訪問</h1>
</body>
</html>
【フォルダ構成】
【Eclipseのサーバーを起動し、ブラウザで確認】
http://localhost:8080/ApplicationScope/MainController
※ブラウザをリロードしたり、ブラウザを閉じて再度開いた場合も回数は加算される