在servlet的doget()方法中调用init()

问题描述:

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

请指教。

+0

你试过了吗? – johusman 2012-07-17 14:51:14

+3

永远不要这样做。它使得服务器跨越黑暗的一面,将运行浏览器的机器炒掉,然后破坏自身。根据您的服务器和发送命中获取请求的浏览器的位置,它可能也会导致跨大西洋海底通信电缆的中断。 – 2012-07-17 15:25:40

很可能,您的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 
} 

如果你有自己的实现,那么在您的实现代码被执行。它会抛出异常 - 这取决于你编码的内容。

如果你调用init,它将ServletConfig作为参数,那么原来的ServletConfig将被替换,并调用init()。我看不出为什么要拨打initinit(ServletConfig)方法。方法是让你在需要时重写,并被servlet容器调用。