我需要得到一些结构,并连接到外部资源的/目的/系统的地方和存在的应用范围。

我可以看到两种方式设置的应用程序:

  • 压倒一切的 init() 在现有的servlet和所需码有和保持所有造物体内,同servlet。
  • 具有某种初始化程序,使用它的 init() 要做的工作。然后储存创建的对象 ServletContext 分享我的其他servlet.

其出的上面是更好的方法吗?是否有更好的方式分享的对象之间的servlet?叫他们直接从另一个或所以...?

有帮助吗?

解决方案

没有两个是更好的方法。Servlet旨在监听HTTP事件(HTTP请求),而不部署活动(startup/shutdown).


CDI/JSF/EJB不可用的?使用 ServletContextListener

@WebListener
public class Config implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
        // Do stuff during webapp's startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
        // Do stuff during webapp's shutdown.
    }

}

如果你不在Servlet3.0但并不能升级,因而不能使用 @WebListener 注释,然后你需要手工登记它在 /WEB-INF/web.xml 如下:

<listener>
    <listener-class>com.example.Config</listener-class>
</listener>

来储存和获取对象的应用范围(因此,所有servlet可以进行访问),使用 ServletContext#setAttribute()#getAttribute().

这里有一个例子,它可以让听众存储本身的适用范围:

    public void contextInitialized(ServletContextEvent event) {
        event.getServletContext().setAttribute("config", this);
        // ...
    }

然后得到它在servlet:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        Config config = (Config) getServletContext().getAttribute("config");
        // ...
    }

它也可以在JSP通过EL ${config}.所以你可以做一个简单的豆。


CDI?使用 @ObservesApplicationScoped.class

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class Config {

    public void init(@Observes @Initialized(ApplicationScoped.class) ServletContext context) {
        // Do stuff during webapp's startup.
    }

    public void destroy(@Observes @Destroyed(ApplicationScoped.class) ServletContext context) {
        // Do stuff during webapp's shutdown.
    }
}

这是可在通过servlet @Inject.让它如有必要还 @Named 所以它可以通过 #{config} 在EL。

注意到应,这是新的,因为CDI1.1.如果你还在CDI1.0和不能升级,然后选择另一种方法。


JSF?使用 @ManagedBean(eager=true)

import javax.faces.bean.ManagedBean
import javax.faces.bean.ApplicationScoped;

@ManagedBean(eager=true)
@ApplicationScoped
public class Config {

    @PostConstruct
    public void init() {
        // Do stuff during webapp's startup.
    }

    @PreDestroy
    public void destroy() {
        // Do stuff during webapp's shutdown.
    }
}

这是可以通过 #{config} 在EL。


EJB?考虑 @Startup@Singleton

@Startup
@Singleton
public class Config {

    @PostConstruct
    public void init() {
        // Do stuff during webapp's startup.
    }

    @PreDestroy
    public void destroy() {
        // Do stuff during webapp's shutdown.
    }
}

这是可在通过servlet @EJB.我说的"考虑",因为你不应该滥用EJB为了启动挂钩。此外, @Singleton 是默认情况下阅读写锁和主要intented事务的东西,如调度背景工作。

参见:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top