サーブレットを使用するのは初めてなので、間違った用語を使用している場合はご容赦ください。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では悪い考えのようです。私の質問は、プロバイダーオブジェクトを静的なものとして持つことが正しいかどうかです。