2012-09-05 49 views
0

我是使用Servlets的新手,所以请原谅我,如果我使用不正确的术语。我在JSF Bean Class“Detector”中有一个名为“Provider”的对象,它需要实例化一次,然后可以用于所有其他请求。我做了一些搜索,发现接口似乎是我所需要的。香港专业教育学院在我的web.xml文件中提到它像这样:在Bean中仅实例化一次值

<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中这似乎是一个坏主意,它将用于不同的请求。我的问题是将提供者对象设置为静态是否正确?

+0

你的问题很混乱。你没有使用servlet。您正在使用JSF支持bean。至于具体的问题,只要具体的功能需求不清楚,就不能回答。我们不知道“Detector”,“Provider”和“Creater”应该做什么。但是,通常情况下,在企业多线程应用程序中,使用'static'这种方式是不被接受的。你应该宁愿“创造一个”。 – BalusC

回答

0

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

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有每个servlet的声明只有一个servlet实例在部署描述符(web.xml)

+0

请注意,OP实际上并未使用servlet。 – BalusC

相关问题