在Bean中仅实例化一次值

时间:2012-09-05 14:14:47

标签: java java-ee

我是使用Servlet的新手,所以如果我使用不正确的术语,请原谅我。我在JSF Bean类“Detector”中有一个名为“Provider”的Object,需要实例化一次,然后才能用于所有其他请求。我做了一些搜索,找到了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();
    }
}

我的代码一切正常,但对我来说唯一正确的方法是将Provider Object作为静态但在Bean中似乎是个坏主意,将用于不同的请求。我的问题是将Provider Object作为静态是否正确?

2 个答案:

答案 0 :(得分:1)

使用“静态”是一个坏主意。如果希望servlet中的对象在此servlet处理的所有HTTP请求之间共享,则只需将其作为servlet类的字段。初始化该字段变量的最佳位置是init()方法。

public class MyServlet extends HttpServlet {
    private MyProdiver provider;

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

除非您的servlet类实现SingleThreadModel,否则部署描述符(web.xml)中每个servlet声明只有一个servlet实例

答案 1 :(得分:0)

我在这个问题上找到了我需要的答案JSF initialize application-scope bean when context initialized。我将Provider Object作为ServletContextEvent的一个属性设置在我的“ContextListener”中,并从我的FacesContext对象“context”中的Detector类中检索它。 (这在所提供的链接的接受答案中更详细地显示)