【问题标题】:Instantiate value only once in a Bean在 Bean 中仅实例化一次值
【发布时间】:2012-08-30 07:03:42
【问题描述】:

我是使用 Servlet 的新手,所以如果我使用了不正确的术语,请原谅我。我在 JSF Bean 类“检测器”中有一个名为“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();
    }
}

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

【问题讨论】:

  • 您的问题令人困惑。您没有使用 servlet。您正在使用 JSF 支持 bean。至于具体的问题,只要具体的功能需求不明确,就无法回答。我们不知道DetectorProviderCreater 应该做什么。但是,通常情况下,在企业多线程应用程序中以这种方式使用static 是不受欢迎的。您应该“只创建一个”。

标签: java jakarta-ee


【解决方案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 实例

【讨论】:

  • 请注意,OP 实际上并没有使用 servlet。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2014-02-08
    • 2017-09-17
    相关资源
    最近更新 更多