プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

アプリケーションスコープ

■アプリケーションスコープの概要
・アプリケーションスコープに保存されたインスタンスはアプリケーションを停止するか、削除するまで利用可能
・アプリケーションスコープに保存されたインスタンスはブラウザを再起動後も利用可能
・リクエストスコープとは異なり、リクエストを跨いでの利用が可能
・リダイレクト先でも利用可能
※リクエストスコープの解説に関してはこちら→リクエストスコープ
※セッションスコープの解説に関してはこちら→セッションスコープスコープ
 
 

①アプリケーションスコープにインスタンスを保存

【基本構文】


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



※ブラウザをリロードしたり、ブラウザを閉じて再度開いた場合も回数は加算される