为什么我们需要init()
而不是constructor
?
请Servlet
和Applet
的参考答案。
如何init()
的Applet
从Servlet
有什么不同?
该init()
方法创建并加载这个servlet。但servlet实例是通过构造函数(由Servlet容器实现)第一次创建。我们不能写一个servlet类的构造函数用的servlet(它会抛出异常)参数。因此,他们提供了接受一个ServletConfig对象作为参数init()
方法。 ServletConfig对象提供一个servlet与绕其初始化(INIT)参数的信息。 Servlet类不能声明与ServletConfig对象构造函数作为参数,不能访问ServletConfig对象。
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets6.html:在更多信息
你既需要,但他们执行不同的活动,您的构造函数执行的目的是通过新的呼叫建立时间,但对于某些类型的对象,你不控制自己的创作,还是宁愿不仅执行一些代码在创建后的对象,但完全intialized,那么你就需要一个特殊的方法,有人会打电话以表示该对象已准备就绪。
这是专门为那些没有被你管理的对象的情况,但是服务器,框架或谁管理这些对象。
你应该可以看到这个方法是提供给您的代码的顶部,这个对象将在构造函数中执行商品
这是一个设计选择。 Servlet规范说,你必须提供一个无参数的构造函数,你可以重写init()
方法执行初始化任务。他们可以选择不这样做,需要的servlet有一个参数的构造函数(ServletConfig
)任选抛出ServletException
。从技术上讲,有与无的问题,因为反射API允许你调用一个类中声明的任何构造函数。
然而具有init()
方法允许servlet容器预实例化对象和延迟它们的初始化。它有助于生命周期的不同的不同阶段。
就个人而言,我不认为这是一个强大的设计选择。这本来是方便多了,让Web应用程序提供的servlet容器预实例的servlet,而不是让容器调用各种servlet的构造函数。
init()方法被调用一次,并且因此只有一个控制实例将被创建。