是否有必要在我的Web应用程序中使用的每个servlet中使用init()?

时间:2013-07-31 10:37:57

标签: jsp servlets init

我有一个带有一些JSP页面和servlet的JSP / Servlet Web应用程序。我读过以下问题:

  1. Servlet constructor and init() method
  2. Using special auto start servlet to initialize on startup and share application data
  3. 他们非常有帮助,但我有一个新问题:我是否需要初始化我使用的每个servlet?或者我必须init()只有我的网络应用程序中调用的第一个serlvet?

2 个答案:

答案 0 :(得分:0)

因为Servlet容器控制Servlet的初始化,所以您没有选择,只能使用init()方法初始化Servlet可能需要的任何实例字段。例如,如果您的Servlet依赖于Service类与某些资源进行交互,那么您可以执行以下操作

public class MyServlet extends HttpServlet {

    private MyService myService;

    public void init() {
        myService = new MyService();
        myService.setSomeProperty("propertyValue");
    }
    ...
}

这样您就可以初始化任何字段。如果您需要,可以使用init(ServletConfig)方法或致电getServletConfig()来访问ServletContext,其中可能包含从其他Servlet init()或{添加的属性{1}}秒。 Note that you can set in which order your Servlets will be initialized.

答案 1 :(得分:0)

看起来你完全误解了servlet的init()的目的。您似乎想到某种方式必须覆盖它。这完全是不真实的。它只是为您提供机会来声明一个servlet方法,该方法应该在应用程序启动期间的servlet初始化时调用一次。通常,基于某些服务或配置文件或servlet自己的<init-param>来初始化一些局部变量。请注意,本地变量,因此特定于servlet实例本身的那些变量被声明为private并且永远不会在servlet之外的其他地方共享/访问。

特别是以下陈述

  

或者我必须init()只在我的Web应用程序中调用的第一个serlvet?

表示您实际上正在寻找在应用程序启动期间调用的应用程序范围的挂钩。在这种情况下,您应该在ServletContextListener问题中使用Using special auto start servlet to initialize on startup and share application data而不是servlet的init()。这是一个Servlet 3.0兼容的启动示例,无需向<listener>添加web.xml条目:

@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.
    }

}