web-dev-qa-db-ja.com

複数のサーブレット間で変数またはオブジェクトを共有するにはどうすればよいですか?

2つ以上のサーブレット間で変数またはオブジェクトを共有する方法があるかどうかを知りたいのですが、「標準的な」方法を意味します。これは良い方法ではありませんが、プロトタイプを作成する簡単な方法だと思います。

使用するテクノロジーに依存するかどうかはわかりませんが、Tomcat 5.5を使用します


単純なクラスのオブジェクトのベクトル(共有属性、文字列、整数など)を共有したい。私の意図は、DBのような静的データを保持することです。Tomcatが停止すると、明らかに失われます。 (テスト用です)

41
David Ameller

ここで探しているのは、リクエスト、セッション、またはアプリケーションのデータだと思います。

サーブレットでは、リクエストオブジェクト、セッションオブジェクト、またはサーブレットコンテキストオブジェクトに属性としてオブジェクトを追加できます。

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

それをリクエストオブジェクトに入れると、サーブレットはリクエストが完了するまで転送されます:

request.getAttribute("sharedId");

セッションに配置すると、今後すべてのサーブレットで使用できるようになりますが、値はユーザーに関連付けられます。

request.getSession().getAttribute("sharedId");

ユーザーの非アクティブ状態に基づいてセッションが期限切れになるまで。

あなたによってリセットされます:

request.getSession().invalidate();

または、1つのサーブレットがスコープからそれを削除します。

request.getSession().removeAttribute("sharedId");

サーブレットコンテキストに配置すると、アプリケーションの実行中に使用可能になります。

this.getServletConfig().getServletContext().getAttribute("sharedId");

削除するまで:

this.getServletConfig().getServletContext().removeAttribute("sharedId");
78
William

3つの異なるスコープのいずれかに配置します。

リクエスト-リクエストの存続期間

セッション-ユーザーのセッションが続く

アプリケーション-アプリケーションがシャットダウンされるまで続く

HttpServlet class から拡張されるメソッドに渡されるHttpServletRequest変数を介してこれらのスコープのすべてにアクセスできます。

8
bpapa

データの使用目的の範囲に依存します。

ユーザーログイン情報、ページヒットカウントなど、ユーザーごとにのみデータが使用される場合は、セッションオブジェクトを使用します(httpServletRequest.getSession()。get/setAttribute(String [、Object]))

複数のユーザーで同じデータ(合計Webページヒット、ワーカースレッドなど)である場合は、ServletContext属性を使用します。 servlet.getServletCongfig()。getServletContext()。get/setAttribute(String [、Object]))。これは、同じwarファイル/ Webアプリケーション内でのみ機能します。このデータは再起動後も保持されないことに注意してください。

7
shemnon

別のオプション、コンテキスト間でデータを共有...

share-data-between-servlets-on-Tomcat

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

MyApp1で:

  ServletContext sc = getServletContext();
  sc.setAttribute("attribute", "value");

MyApp2の場合:

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");
2
ggrandes

オブジェクトをHttpSessionに入れてから、各サーブレットの属性名で参照することはできませんか?

例えば:

getSession().setAttribute("thing", object);

...別のサーブレットで:

Object obj = getSession.getAttribute("thing");
1
yalestar

Jettyでこれを行う方法は次のとおりです。

https://stackoverflow.com/a/46968645/1287091

サーバーコンテキストを使用します。このコンテキストでは、組み込みJettyサーバーの起動時にシングルトンが書き込まれ、サーバーの存続期間中にすべてのwebappで共有されます。コンテキストへのライターが1人だけであると想定して、webapp間でオブジェクト/データを共有するためにも使用できます。

0
Reed Sandberg