【问题标题】:Is it necessary to use init() in every servlet I use in my web application?是否有必要在我的 Web 应用程序中使用的每个 servlet 中使用 init()?
【发布时间】:2013-07-31 20:14:37
【问题描述】:

我有一个带有一些 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

它们非常有帮助,但我有一个新问题:我是否需要初始化我使用的每个 servlet?还是我只需要init() 我的 Web 应用程序中调用的第一个 serlvet?

【问题讨论】:

  • 您的 servlet 将在 Web 容器的第一次请求时初始化。您真的不需要覆盖 init()
  • 如果您需要执行一些初始化任务,例如创建数据库连接或初始化一些资源,请覆盖 init()。

标签: jsp servlets init


【解决方案1】:

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

特别是以下陈述

或者我只需要 init() 我的 web 应用程序中调用的第一个 serlvet?

建议您实际上是在寻找在应用程序启动期间调用的应用程序范围的钩子。在这种情况下,您应该使用ServletContextListener 而不是servlet 的init(),正如Using special auto start servlet to initialize on startup and share application data 问题中所回答的那样。这是一个与 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.
    }

}

【讨论】:

    【解决方案2】:

    因为 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()ServletContextListeners 添加的属性。 Note that you can set in which order your Servlets will be initialized.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-06
      • 2019-04-25
      • 2011-02-17
      • 2019-10-21
      • 2019-10-03
      相关资源
      最近更新 更多