Anu*_*jee 2 java servlets java-ee
众所周知init(),在destroy()servlet的情况下,构造函数的工作与finalize方法的工作相同,并且在.NET中包含构造函数和finalize()方法也没有害处Servlet。
现在的查询是:如果finalize()在Servlet中定义了构造函数和方法,将调用它们吗?就像我们将在构造函数中初始化的内容替换为in那样init(),还是根本不会调用该构造函数?
让我们先回顾一些假设。在后面的文章中有更多详细信息。
我们知道init()可以完成构造函数的工作
不,不是。它有很大的不同,因为:
throws ServletException,ServletConfig参数,*它调用其父级构造函数(因为Java默认情况下调用父级的no-arg构造函数)。对于最后一点,这在您的一般情况下是无关紧要的,Servlet并且HttpServlet不执行任何操作,但是,如果使用这些抽象类的扩展名,则您不应假定它们也不会干扰构造函数并执行操作在他们中。尽管您可以选择init()不调用paren't init(),但始终会调用父级的no-arg构造函数。
[...]和destroy()与finalize方法相同
不,不是。
在servlet中具有构造函数和finalize方法没有害处
有可能会伤害,如果发生异常在构造函数和终结,并且在任何情况下,我肯定不会推荐使用的,但是建议坚持init()和destroy()遵守的规范。从您的自定义构造函数和析构函数抛出的异常的异常处理规则未在规范中定义,因此它们将是未定义的行为/特定于容器的。
他们会被称为吗?
你试过了吗?怎么了?
(是的:每当新的线程实例都将为每个新线程实例调用no-arg构造函数,并且在终结器将被调用时…… 只要GC感到满意。)
就像我们将在构造函数中初始化的所有内容都将被init()中的覆盖一样,还是根本不会调用构造函数?
init() 不是构造函数。
您可能可以覆盖在init()构造函数中初始化的某些内容(例如,成员变量),或者撤消/还原在构造函数中执行的操作。没有看到一个有用的理由,但您可能会有用。但是,如果您的意思是这样,他们不会互相抵消。
我在这里问自己的问题更多:
取自Servlet Lifecycle的Java EE 6教程部分:
- 如果servlet的实例不存在,则Web容器
- 加载servlet类。
- 创建servlet类的实例。
- 通过调用init方法初始化servlet实例。创建和初始化Servlet中介绍了初始化。
- 调用服务方法,传递请求和响应对象。服务方法在编写服务方法中进行了讨论。
- 如果需要删除该servlet,则该容器通过调用servlet的destroy方法来最终确定该servlet。有关更多信息,请参见完成Servlet。
[...]
执行servlet时,可以发生任何数量的异常。发生异常时,Web容器将生成一个默认页面,其中包含以下消息:
发生了Servlet异常
init()让我们回顾一下Javadoc init()(重点是我的)
由servlet容器调用以向servlet 指示该servlet正在投入使用。
实例化servlet后,servlet容器仅调用一次init方法。servlet可以接收任何请求之前,init方法必须成功完成。
如果使用init方法,则servlet容器无法将servlet投入使用
- 抛出ServletException
- 在Web服务器定义的时间段内不返回
因此,请注意不要在您的中做任何耗费太多的工作init(),并且只需要执行一次即可。如果这件事情,对所有请求做需求,那么这样做的请求处理方法(例如doGet(),doPost()...)。
另见创建和初始化一个Servlet在Java EE 6教程(和Java EE 5)。
destroy()由Servlet容器调用以向Servlet 指示该Servlet正在退出服务。仅当servlet的service方法中的所有线程都已退出或经过超时时间后,才调用此方法。servlet容器调用此方法后,它将不再在该servlet上再次调用service方法。
此方法使Servlet有机会清除所持有的任何资源(例如,内存,文件句柄,线程),并确保任何持久状态都与Servlet在内存中的当前状态同步。
另请参见最终确定一个Servlet在Java EE 6教程(和Java EE 5)(批准,从他们的话中选择不当这里...)。
参见http://oreilly.com/catalog/jservlet/chapter/ch03.html#15894:
为什么不使用构造函数呢?好吧,在JDK 1.0(最初为其编写servlet)中,动态加载的Java类(例如servlet)的构造函数不能接受参数。因此,为了向新的Servlet提供有关其自身及其环境的任何信息,服务器必须调用Servlet的init()方法并传递实现ServletConfig接口的对象。另外,Java不允许接口声明构造函数。这意味着javax.servlet.Servlet接口无法声明接受ServletConfig参数的构造函数。它必须声明另一个方法,例如init()。当然,仍然有可能为servlet定义构造函数,但是在构造函数中,您无权访问ServletConfig对象或抛出ServletException的功能。
请特别注意最后一句话:
[...]但在构造函数中,您无权访问ServletConfig对象或抛出ServletException的功能。
因此,在servlet的构造函数中执行任何操作将是: