为什么Servlets有构造函数,还需要Init()方法?

8
在Java中,构造函数用于初始化,为什么我们还需要init()进行初始化呢?这个问题是在面试中被问到的。

有同样的问题。你找到合适的答案了吗? - Half Blood Prince
7个回答

5
构造函数是用于普通的Java对象初始化的(虽然一个Servlet实现通常预期具有无参构造函数)。 init()方法是由Servlet接口提供的一个方法,Servlet容器将运行该方法以配置Servlet。Servlet容器将提供一个ServletConfig对象,该对象给Servlet实例访问ServletContext和其他来自部署描述符的配置元素。

5

init()方法是ServletServletConfig协议的一部分。在init()中,您可以处理与Web上下文相关的内容,在构造函数中,您可以处理与Servlet类私有相关的内容。

enter image description here


我喜欢这种看待问题的方式,而且它看起来像是Android生命周期 :D - Jorge Y. C. Rodriguez

2

构造函数不是servlet生命周期的一部分。

根据javadoc文档

使用init和destroy来管理为servlet保留的资源

并且

仍然可以通过getServletConfig()方法检索ServletConfig对象。


2

2
1) 构造函数被“Web容器(如Tomcat、WebSphere等)用于实例化GenericServlet/HttpServlet。”
2) “Servlet.init()”方法的作用是注入在web.xml中定义的参数。是的,你也可以在构造函数中定义servlet级别的参数,但是作为开发人员,你会不必要地投入时间来做一些可以由(容器+Servlet API)隐式完成的工作。
3) 此外,“Servlet.init()”还被Web容器用于注入“ServletContext”对象,在这种情况下,你不能使用构造函数。

1
  1. JDK 1.0版本(最初为Servlet编写的)中,动态加载Java类(如Servlet)的构造函数不能接受参数。因此,为了向新的servlet提供有关其自身和环境的任何信息,服务器必须调用servlet的init()方法并传递实现了ServletConfig接口的对象。

  2. 此外,Java不允许接口声明构造函数。这意味着javax.servlet.Servlet接口不能声明一个接受ServletConfig参数的构造函数。它必须声明另一个方法,例如init()。

  3. 当然,您仍然可以为您的servlet定义构造函数,但是在构造函数中,您无法访问ServletConfig对象或抛出ServletException异常。


-1
我使用init方法来准备我的PreparedStatement,这样下次调用我的servlet时,预编译语句已经创建好了。请注意,当一个servlet首次加载到应用服务器中时,init方法将被执行。对于后续的servlet调用,init方法将被忽略。它只在servlet的生命周期中被调用一次。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接