在servlet的doget()方法内部调用init()



请告知如果我在servlet的doget()方法内部调用init()方法会发生什么。它会抛出异常吗?它会对servlet的生命周期产生什么影响?

请告知。

很可能会执行init()方法内部的代码。

init方法没有什么特别之处,只是容器会在servlet投入服务之前调用它。你可以随时打电话给它。如果您的init方法更改了任何共享数据的值,那么您可能会遇到一些奇怪的问题。

我无法想象为什么任何人都必须从他们的doGet方法中调用init

首先,如果您试图从doGet()调用init()方法并查看会发生什么,您可以避免问这个问题。

无论如何,Servlet规范2.3说:

提供初始化以便servlet可以读取持久配置数据,初始化昂贵的资源(如JDBC™API基于连接)并执行其他一次性活动。

因此,您应该想知道在当前的init()方法中有多少一次性活动。调用该方法与调用另一个方法没有什么不同。我在想一个场景,在这个场景中,init()方法唯一要做的就是从ServetConfig的init参数初始化所拥有的属性;那样的话,就不会出什么差错。

但是,如果您的init()方法执行任何可能更改servlet内部状态的任务,那么您就有机会面对一种奇怪的行为。

如果您正在init()方法中执行任何可能需要在doGet()中使用的任务,请将它们移到专用内部方法中。

如果您没有实现init()方法,那么几乎不会发生任何事情。原因是继承的实现也是空的。您的servlet可能扩展了HttpServlet,它继承了GenericServlet的以下实现:

public void init() throws ServletException {
    // NOOP by default
}

如果您有自己的实现,则执行实现中的代码。它会抛出异常吗?这取决于你在中编码的内容

如果您调用以Servlet配置为参数的init,那么原始Servlet配置将被替换,并调用init()。我看不出为什么要调用initinit(ServletConfig)方法。方法用于在需要时重写,并由servlet容器调用。

最新更新