0

サーブレットを使用するのは初めてなので、間違った用語を使用している場合はご容赦ください。JSF Beanクラス「Detector」に「Provider」というオブジェクトがあります。このオブジェクトは一度インスタンス化する必要があり、その後、他のすべてのリクエストに使用できます。私はいくつかの検索を行い、必要なことを実行しているように見えるServletContextListenerインターフェースを見つけました。私はそれを私のweb.xmlファイルで次のように述べました:

<listener>
    <listener-class>
        p1.ContextListener
    </listener-class>
</listener>

クラスは次のようになります。

package p1;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener{

   @Override
   public void contextInitialized(ServletContextEvent sce) {
      Detector.startProvider();
   }

   @Override
   public void contextDestroyed(ServletContextEvent sce) {
     Provider.dispose();
   }  
}

そして、これが私の検出器クラスです:

package p1;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;


@ManagedBean
public class Detector{

    private static Provider p;
    FacesContext context;
    String userAgent;

    public Detector() {
        context = FacesContext.getCurrentInstance();
    }

    public String getValue() {
        return p.getValue();
    }

    public String getUserAgent() {
        return ((HttpServletRequest) context.getExternalContext().getRequest()).getHeader("User-Agent");
    }

    public static void startProvider(){
        p = Creater.create();
    }
}

私のコードはすべて機能しますが、私にとって正しいと思われる唯一の方法は、プロバイダーオブジェクトを静的なものにすることですが、さまざまなリクエストに使用されるBeanでは悪い考えのようです。私の質問は、プロバイダーオブジェクトを静的なものとして持つことが正しいかどうかです。

4

2 に答える 2

1

「静的」を使用するのは悪い考えです。サーブレット内のオブジェクトを、このサーブレットによって処理されるすべての HTTP リクエスト間で共有したい場合は、単純にそれをサーブレット クラスのフィールドにします。そのフィールド変数の初期化に最適な場所はinit()メソッドです。

public class MyServlet extends HttpServlet {
    private MyProdiver provider;

    public void init() throws ServletException {
        this.provider = new MyProdiver();
        // do init
    }
}

サーブレット クラスが実装しない限り、SingleThreadModelデプロイメント記述子 (web.xml) のサーブレット宣言ごとに 1 つのサーブレット インスタンスしかありません。

于 2012-09-05T14:25:07.800 に答える
0

この質問で必要な答えを見つけましたJSF initialize application-scope bean when context initialized . "ContextListener" で Provider オブジェクトを ServletContextEvent の属性として設定し、それを FacesContext オブジェクト "context" から Detector クラスで取得しました。(これは、提供されたリンクの受け入れられた回答に詳細に示されています)

于 2012-09-06T08:50:24.483 に答える