2 つ以上のサーブレット間で変数またはオブジェクトを共有するにはどうすればよいですか?
-
02-07-2019 - |
質問
2 つ以上のサーブレット間で変数またはオブジェクトを共有する何らかの方法、つまり「標準的な」方法があるかどうかを知りたいです。これは良い習慣ではありませんが、プロトタイプを構築する簡単な方法だと思います。
使用されているテクノロジーに依存するかどうかはわかりませんが、Tomcat 5.5 を使用します。
単純なクラスのオブジェクト (パブリック属性、文字列、int など) の Vector を共有したいと考えています。私の目的は、DB のような静的データを持つことです。明らかに、Tomcat が停止するとデータは失われます。(これはテスト用です)
解決
ここで探しているのはリクエスト、セッション、またはアプリケーションのデータだと思います。
サーブレットでは、リクエスト オブジェクト、セッション オブジェクト、またはサーブレット コンテキスト オブジェクトにオブジェクトを属性として追加できます。
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");
他のヒント
3 つの異なるスコープのいずれかに入れます。
request - リクエストの有効期間が続きます
session - ユーザーのセッションが存続します。
アプリケーション - アプリケーションがシャットダウンされるまで持続します
これらすべてのスコープには、HttpServletRequest 変数を介してアクセスできます。この変数は、 HttpServletクラス
データの使用目的の範囲によって異なります。
ユーザーのログイン情報、ページ ヒット数などのデータがユーザーごとにのみ使用される場合。セッションオブジェクト(httpservletrequest.getSession()。get/setattribute(string [、object]))を使用します。
複数のユーザー間で同じデータ (Web ページの合計ヒット数、ワーカー スレッドなど) の場合は、ServletContext 属性を使用します。servlet.getServletCongfig().getServletContext().get/setAttribute(String [,Object]))。これは、同じ war ファイル/Web アプリケーション内でのみ機能します。このデータは再起動しても保持されないことに注意してください。
別のオプションとして、コンテキスト間でデータを共有する...
<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");
オブジェクトを HttpSession に配置し、各サーブレットの属性名でそれを参照することはできないでしょうか。
例えば:
getSession().setAttribute("thing", object);
...次に別のサーブレットで次のようにします。
Object obj = getSession.getAttribute("thing");
Jetty を使ってこれを行う方法を次に示します。
https://stackoverflow.com/a/46968645/1287091
サーバー コンテキストを使用します。埋め込み Jetty サーバーの起動中にシングルトンが書き込まれ、サーバーの存続期間中すべての Web アプリ間で共有されます。コンテキストへの書き込み者が 1 人だけであることを前提として、Web アプリ間でオブジェクト/データを共有するために使用することもできます。それ以外の場合は、同時実行性に注意する必要があります。