Java Servlet池


问题内容

Tomcat 6下的Servlet 101:

有人可以帮我指出最好的方法,例如。在Servlet启动时创建昂贵的Foo对象的集合,并将它们存放在我在处理每个请求时可以访问它们的地方?

据我所知,至少有至少三种方法可以做到这一点,但我对此有所模糊。我不关心群集或算法来驱逐过时的条目或类似的东西,而仅是基础知识。

干杯和谢谢。


问题答案:

实现一个ServletContextListener,在期间执行所需的加载任务contextInitialized()并将结果存储在应用范围内ServletContext#setAttribute()。将在服务器启动期间调用它,并且可以在常规servlet中访问应用程序范围。

基本示例:

public class Config implements ServletContextListener {
   public void contextInitialized(ServletContextEvent event) {
        List<Foo> foos = fooDAO().list();
        event.getServletContext().setAttribute("foos", foos);
    }
}

web.xml以通常的方式映射它:

<listener>
    <listener-class>mypackage.Config</listener-class>
</listener>

以下是在常规servlet中访问它的方法:

protected void doSomething(request, response) {
    List<Foo> foos = (List<Foo>) getServletContext().getAttribute("foos");
}

这是在JSP中访问它的方法:

<c:forEach items="${foos}" var="foo">
    ${foo.someProperty}<br>
</c:forEach>

也就是说,我真的看不到它与“ servlet池”有什么关系。这个术语没有任何意义。

希望这可以帮助。