1.アプリケーションスコープとは
アプリケーションスコープとは、複数のユーザがアクセスするWebアプリケーションで、各ユーザの状態を共有して保存する機能です。
アプリケーションスコープに保存されたインスタンスは、アプリケーションが停止するまで、またはインスタンスを削除するまで保持されます。
そのため、Webブラウザを再起動してもアプリケーションを停止しない限り、インスタンスは保存され続けます。
リクエストスコープは、リクエストごとにインスタンスを保存する機能であり、 続きを見る
セッションスコープは、ユーザ(ブラウザ)ごとにインスタンスを保存する機能です。
これらスコープの違いや特徴はは次の記事にまとめてあります。
(作成中)
【Java】リクエストスコープとは?取得や保存方法を解説します
2.アプリケーションスコープを使ったデータ取捨の方法
まずは、基本構文から勉強していきましょう。
アプリケーションスコープを使ってデータの格納や取得、削除などを行うときは基本的に次のようなコードを記載します。
基本構文1
【アプリケーションスコープを取得】
ServletContext application = this.getServletContext();
アプリケーションスコープを使用する場合、最初に定義します。
以降は、ここで取得したアプリケーションスコープにインスタンスを格納していきます。
基本構文2
【アプリケーションスコープからインスタンスを取得】
application.getAttribute(”属性名(key)”,インスタンス(value));
基本構文3
【アプリケーションスコープにインスタンスを格納】
application.setAttribute(”属性名(key)”);
次に、リクエストスコープを実際に用いたコードを見ていきましょう。
SampleController(アプリケーションスコープにインスタンス格納・取得するサーブレット)
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("/SampleController")
public class SampleController extends HttpServlet{
public static final String SESSION_KEY = "test";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//➀アプリケーションスコープの作成・取得
ServletContext application = this.getServletContext();
//➁入力された結果を取得する
String str;
if(request.getParameter("appscp") != null)
str = request.getParameter("appscp");
else
str = "-1";
int num = Integer.parseInt(str);
//➂上記➁で取得した選択結果によりアプリケーションスコープに保存or削除
if(num==0)
application.setAttribute("test","アプリケーションスコープにインスタンスを保持しています。");
else if(num==1)
application.removeAttribute("test");
//➃アプリケーションスコープにインスタンスが保存されているかどうかの判定
if(application.getAttribute("test")==null||application.getAttribute("test")=="")
request.setAttribute("appscope","アプリケーションスコープにインスタンスは保持していません。");
else
request.setAttribute("appscope",(String)application.getAttribute("test"));
//➄sampleScope.jspにフォワード
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/AppSample.jsp");
dispatcher.forward(request, response);
}
}
AppSample(Webブラウザに表示するjspファイル)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("appscope") %>
<form action="/App/SampleController" method="get">
<input type="radio" name="appscp" value="0">アプリケーションスコープにインスタンスを取得する<br>
<input type="radio" name="appscp" value="1">アプリケーションスコープからインスタンスを破棄する<br>
<input type="radio" name="appscp" value="2">アプリケーションスコープがインスタンスを保持しているか確認する。<br>
<input type="submit" name="button" value="送信">
</form>
</body>
</html>
上記コードは、次の動作を持つプログラムです。
- インスタンス取捨の選択ボタンを画面に表示し、入力させる(取得・破棄・保持状況の確認)
- アプリケーションスコープを作成・取得する※①
- Webブラウザ上で入力された選択結果を取得する※➁
- 上記で取得した選択結果によりアプリケーションスコープに保存または削除する※➂
- アプリケーションスコープからインスタンスを取得し、インスタンスが保存されているか否かを確認※➃
- 結果をsampleScope.jspに渡して、Webページに表示する※➄
実行結果
アプリケーションを起動しURLを入力すると、次の画面が表示されます。
「アプリケーションスコープにインスタンスを取得する」を選択して「送信」を押すと画面が再描画され、メッセージ「アプリケーションスコープにインスタンスを保持しています」が表示されます。
ブラウザを再起動してもスコープにインスタンスを保持し続けているため、同様のメッセージが表示されます。
また、同じネットワークの別ユーザがインスタンスを破棄した場合は、その処理が反映されるため、再描画した際にメッセージが「アプリケーションスコープにインスタンスは保持していません」となります。
次にアプリケーションスコープにインスタンスを保持した状態で、「インスタンスの保持状況の確認」を選択して「送信」を押すと画面が再描画されメッセージ「アプリケーションスコープにインスタンスを保持しています」が表示されます。
最後にアプリケーションスコープにインスタンスを保持した状態で、「アプリケーションスコープからインスタンスを破棄する」を選択して「送信」を押すと画面が再描画されメッセージ「アプリケーションスコープにインスタンスは保持していません」が表示されます。
以上でこの記事は終了となります。お疲れ様でした(^^)