データをContextに埋め込む
サーバー内部での処理で、別のプログラムに転送して処理をする際にデータを渡す方法として、Contextオブジェクトにデータをセットすることができます。この方法は、Webアプリケーションが起動している間、有効(アプリケーションスコープ)です。このスコープは、アプリケーション内でデータを共有できます。
転送元では、ServletContextのsetAttributeメソッドを使ってデータを保存し、転送先では、ServletContextのgetAttributeメソッドでデータを取り出します。
前節のサンプルを、Contextオブジェクトを使ったサンプルに変更しましょう。
○ ファイル
まず、データを入力する画面を準備します。SendSessionForm.htmlをコピーして、次のようなHTMLファイルを追加してください。
ファイル名 | SendContextForm.html |
---|
○ プログラム
次のようにHTMLを入力してください。
SendContextForm.html
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>入力フォーム</title>
- </head>
- <body>
- <form action="receivecontextdata" method="POST">
- <textarea name="text"></textarea><br>
- <input type="submit">
- </form>
- </body>
- </html>
○ ファイル
次に、送信されたデータを受信して、JSPを呼び出すサーブレットを準備します。ReceiveSessionData.javaをコピーして、プロジェクトに次のようなServletを追加してください。
パッケージ名 | test.servlet |
---|---|
クラス名 | ReceiveContextData |
スーパークラス名 | javax.servlet.http.HttpServlet |
○ プログラム
doPostメソッドの内容を、次のように変更してください。
ReceiveContextData.java
- package test.servlet;
- 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("/receivecontextdata")
- public class ReceiveContextData extends HttpServlet {
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //受信するデータの文字コードを設定する
- req.setCharacterEncoding("utf-8");
- //送信されたデータを取得する
- String text = req.getParameter("text");
- //サーブレットコンテキストを取得する
- ServletContext sc = this.getServletContext();
- //Contextオブジェクトにデータをセットする
- sc.setAttribute("Data", text);
- //リクエストディスパッチャーオブジェクトを取得する
- RequestDispatcher rd = sc.getRequestDispatcher("/ResultContextData.jsp");
- //違うページに転送する
- rd.forward(req, resp);
- }
- }
○ ファイル
結果を表示する画面を準備します。ResultSessionData.jspをコピーして、次のようなJSPファイルを追加してください。
ファイル名 | ResultContextData.jsp |
---|
○ プログラム
次のようにプログラムを入力してください。
ResultContextData.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <%
- //コンテキストオブジェクトからデータを取得する
- String data = (String)application.getAttribute("Data");
- %>
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>結果表示</title>
- </head>
- <body>
- <pre><%= data %></pre>
- <a href="SendContextForm.html">入力ページへ</a>
- </body>
- </html>
○ 実行結果
次のURLを入力して実行してみましょう。
http://localhost:8080/WebApp/SendContextForm.html
○ 解説
SendContextForm.htmlの9行目で指定している「textarea」タグで、複数行のテキストボックスが表示されます。ここに入力したデータが、ReceiveContextDataクラスのdoPostメソッドで受信されます。
ReceiveContextData.javaの22行目では、送信されたデータを受信します。フォームで入力されたデータを受信します。28行目で、受信したデータをServletContextオブジェクトに追加しています。今回は「Data」という名前で保存しています。このメソッドで指定できるデータ型は「Object」型なので、様々な種類のデータをServletContextオブジェクトに保存することができます。31~34行目で、入力した結果を表示するJSPに転送しています。
ResultContextData.jspの5行目では、ReceiveContextDataクラスで保存しておいたServletContextのデータを取得しています。「application」変数は、JSPに暗黙的に準備されているServletContextオブジェクトです。このオブジェクトに保存されているデータはオブジェクト型なので、保存したときのデータ型にキャストして使用します。取得したデータは14行目の「pre」タグで表示しています。
このように、転送元のプログラムでServletContextにデータを埋め込んでおき、転送先のページでそのデータを利用することができます。
ServletContextはアプリケーションスコープなので、このオブジェクトに保存したデータは、別のWebブラウザーからのアクセスでも利用できます。Webアプリケーション全体でデータを共有することができます。次のように実行して確認してみましょう。
○ 実行結果