42

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

使用する技術によるかどうかはわかりませんが、Tomcat 5.5 を使用します。


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

4

6 に答える 6

79

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

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

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");
于 2008-09-23T20:51:01.723 に答える
9

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

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

session - ユーザーのセッションの存続期間

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

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

于 2008-09-23T20:56:32.973 に答える
7

データの使用目的の範囲によって異なります。

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

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

于 2008-09-23T20:39:11.597 に答える
3

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

トムキャット上のサーブレット間の共有データ

  <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");
于 2013-04-17T10:53:21.640 に答える
1

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

例えば:

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

...次に、別のサーブレットで:

Object obj = getSession.getAttribute("thing");
于 2008-09-23T20:38:02.253 に答える