4

アプリケーション スコープでいくつかの値を設定したいと考えています。

インターセプターinit()方式でやってみました。しかし、それはnull以下のコードにポインタを与えます:

ServletActionContext.getContext().getApplication().put("ApplicationName", applName);

すべてのセッションでこのフィールドにアクセスしたい。

4

3 に答える 3

5

アプリの起動時にデータを初期化する標準的な方法は、ServletContextListenerを使用することです。

IMOインターセプターはこれにはほとんど意味がありません。インターセプターは、起動時のワンショット機能ではなく、リクエストプロセス中にアプリケーション全体の動作を実装することを目的としています。

于 2013-01-12T06:13:32.200 に答える
4

次のように実行できます。

public class ContextListenerOne implements ServletContextListener {

    ServletContext context;

    @Override
    public void contextInitialized(ServletContextEvent sce) {


        context = sce.getServletContext();

        try {
            //Create a database connection here and run queries to retrieve data.             
            context.setAttribute("data", data); //Use setAttribute method to make this data available to everyone.
        } catch(Exception e {

        }
    }

}

推奨されていない次の型にはまらない方法でも実行できることに注意してください。

サーブレット オブジェクトのインスタンスは 1 つだけ作成されるため、次のように init メソッドをオーバーライドできます。

@Override
public void init(ServletConfig config) throws ServletException {
    super.init();
    //Do all your database transactions here.
    ServletContext c = config.getServletContext(); //Get the ServletContext.
    c.setAttribute("data", data); //Make data available to all.
}

init メソッドは、サーブレットのライフサイクル中に何回リクエストが行われたとしても、1 回だけ呼び出されます。

ただし、特定のタイプのサーブレットの init メソッドをオーバーライドする場合、別のサーブレット (init メソッドをオーバーライドしたタイプではない) へのリクエストが最初のサーブレットよりも前に行われた場合、データベース データは利用できないことに注意してください。 init メソッドをオーバーライドしたサーブレットへのリクエスト。

于 2013-01-13T18:55:20.020 に答える