データをContextに埋め込む

サーバー内部での処理で、別のプログラムに転送して処理をする際にデータを渡す方法として、Contextオブジェクトにデータをセットすることができます。この方法は、Webアプリケーションが起動している間、有効(アプリケーションスコープ)です。このスコープは、アプリケーション内でデータを共有できます。

転送元では、ServletContextのsetAttributeメソッドを使ってデータを保存し、転送先では、ServletContextのgetAttributeメソッドでデータを取り出します。

前節のサンプルを、Contextオブジェクトを使ったサンプルに変更しましょう。

○ ファイル

まず、データを入力する画面を準備します。SendSessionForm.htmlをコピーして、次のようなHTMLファイルを追加してください。

ファイル名 SendContextForm.html

サンプルダウンロード

○ プログラム

次のようにHTMLを入力してください。

SendContextForm.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>入力フォーム</title>
  6. </head>
  7. <body>
  8.     <form action="receivecontextdata" method="POST">
  9.         <textarea name="text"></textarea><br>
  10.         <input type="submit">
  11.     </form>
  12. </body>
  13. </html>

○ ファイル

次に、送信されたデータを受信して、JSPを呼び出すサーブレットを準備します。ReceiveSessionData.javaをコピーして、プロジェクトに次のようなServletを追加してください。

パッケージ名 test.servlet
クラス名 ReceiveContextData
スーパークラス名 javax.servlet.http.HttpServlet

サンプルダウンロード

○ プログラム

doPostメソッドの内容を、次のように変更してください。

ReceiveContextData.java

  1. package test.servlet;
  2. import java.io.IOException;
  3. import javax.servlet.RequestDispatcher;
  4. import javax.servlet.ServletContext;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. @WebServlet("/receivecontextdata")
  11. public class ReceiveContextData extends HttpServlet {
  12.     @Override
  13.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  14.         //受信するデータの文字コードを設定する
  15.         req.setCharacterEncoding("utf-8");
  16.         
  17.         //送信されたデータを取得する
  18.         String text = req.getParameter("text");
  19.         
  20.         //サーブレットコンテキストを取得する
  21.         ServletContext sc = this.getServletContext();
  22.         
  23.         //Contextオブジェクトにデータをセットする
  24.         sc.setAttribute("Data", text);
  25.         
  26.         //リクエストディスパッチャーオブジェクトを取得する
  27.         RequestDispatcher rd = sc.getRequestDispatcher("/ResultContextData.jsp");
  28.         
  29.         //違うページに転送する
  30.         rd.forward(req, resp);
  31.     }
  32. }

○ ファイル

結果を表示する画面を準備します。ResultSessionData.jspをコピーして、次のようなJSPファイルを追加してください。

ファイル名 ResultContextData.jsp

サンプルダウンロード

○ プログラム

次のようにプログラムを入力してください。

ResultContextData.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.     pageEncoding="UTF-8"%>
  3. <%
  4.     //コンテキストオブジェクトからデータを取得する
  5.     String data = (String)application.getAttribute("Data");
  6. %>
  7. <!DOCTYPE html>
  8. <html>
  9. <head>
  10. <meta charset="UTF-8">
  11. <title>結果表示</title>
  12. </head>
  13. <body>
  14.     <pre><%= data %></pre>
  15.     <a href="SendContextForm.html">入力ページへ</a>
  16. </body>
  17. </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アプリケーション全体でデータを共有することができます。次のように実行して確認してみましょう。

○ 実行結果

http://localhost:8080/WebApp/ResultContextData.jsp

実行結果
実行結果

前へ   次へ