请告知如果我在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()
。我看不出为什么要调用init
或init(ServletConfig)
方法。方法用于在需要时重写,并由servlet容器调用。