2009-07-26 13 views
20

ServletContextに変数を格納することと、それをクラスのうちの1つのパブリックな静的なメンバとして持つことの違いは何ですか?代わりに、書き込みのサーブレットのコンテキストスコープとグローバル変数

だけ持っていないのはなぜ
// simplified (!) 
int counter = (Integer)getServletContext().getAttribute("counter"); 
counter++; 
this.getServletContext().setAttribute("counter", counter); 

// in class MyServlet 
public static int counter = 0; 

// in a method somewhere 
MyServlet.counter++; 

(同時実行の問題を無視し、これは単なるダム例ですしてください)

を私が言うことができるものから、これらの2つのオプションは、Tomcatの場合と同じように動作します。最初のオプションを使う方がいいですか?

答えて

17

Webコンテナはサーブレットのコンテキストを認識しますが、skaffman saysという静的変数はクラスローダーに対してプライベートではありません。

異なるクラスローダーのアプリケーションインスタンスによって2つの異なる要求(サーバーの再起動、Webアプリケーションの再デプロイメント、またはマルチノードサーバーの可能性があります)を処理するものはすべて、ロジックが壊れてしまいます。サーブレットコンテキストは、Webコンテナがそれを知っているので、これらのことを生き残り、シリアル化することも、共通のリポジトリを持つこともできます。

14

これはまったく同じではありません。 servlet-context-scopeはwebappに対してプライベートですが、静的スコープはクラスローダーに対してプライベートです。あなたのコンテナとその構成方法によって、これらは同じでも異なっていてもかまいません。 WebアプリケーションとJavaEEの観点から考えると、状況に応じたフィールドを使うことは、より確実に移植可能になるでしょう。また、コンテキストスコープの属性はJSPからのアクセスが容易です。つまり、スクリプトレットを取得する必要はありません。

+0

特定の名前のに値を永続的に格納できるため、その次回のgetServletContext()の呼び出し、つまりgetInitParameters( "name")の呼び出しが更新されます。最後のプログラムによって行われた更新された価値を与えるでしょうか? – Ars

関連する問題