0

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

  1. Servlet 构造函数和 init() 方法
  2. 使用特殊的自动启动 servlet 在启动时进行初始化并共享应用程序数据

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

4

2 回答 2

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()来访问可能包含从其他 Servlet或从sServletContext添加的属性。请注意,您可以设置 Servlet 的初始化顺序。init()ServletContextListener

于 2013-08-06T13:53:33.743 回答
0

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

特别是以下语句

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

建议您实际上正在寻找在应用程序启动期间调用的应用程序范围的挂钩。在这种情况下,您应该使用 aServletContextListener而不是 servlet init(),如使用特殊自动启动 servlet 以在启动时进行初始化和共享应用程序数据问题中的回答。这是一个与 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.
    }

}
于 2013-08-06T14:01:13.090 回答