当我反编译GenericServlet并检查init()时,我看到以下代码。
public void init(ServletConfig servletconfig)
throws ServletException
{
config = servletconfig;
init();
}
public void init()
throws ServletException
{
}
这里实际执行的init方法是什么?我错过了什么吗?
答案 0 :(得分:14)
是的,它什么都不做。它可能是抽象的,但随后每个servlet都将被强制实现它。这样,默认情况下,init()
上没有任何反应,每个servlet都可以覆盖此行为。例如,您有两个servlet:
public PropertiesServlet extends HttpServlet {
private Properties properties;
@Override
public void init() {
// load properties from disk, do be used by subsequent doGet() calls
}
}
和
public AnotherServlet extends HttpServlet {
// you don't need any initialization here,
// so you don't override the init method.
}
答案 1 :(得分:8)
来自javadoc:
/**
*
* A convenience method which can be overridden so that there's no need
* to call <code>super.init(config)</code>.
*
* <p>Instead of overriding {@link #init(ServletConfig)}, simply override
* this method and it will be called by
* <code>GenericServlet.init(ServletConfig config)</code>.
* The <code>ServletConfig</code> object can still be retrieved via {@link
* #getServletConfig}.
*
* @exception ServletException if an exception occurs that
* interrupts the servlet's
* normal operation
*
*/
所以它什么都不做,只是一种便利。
答案 2 :(得分:3)
构造函数可能无法访问ServletConfig
,因为容器尚未调用init(ServletConfig config)
方法。
init()
方法继承自GenericServlet
,其ServletConfig
属性。那就是HttpServlet
以及你通过扩展HttpServlet
编写的自定义servlet如何得到ServletConfig
。
和GenericServlet
实施ServletConfig
,其getServletContext
方法。所以你的自定义servlet init
方法可以访问这两个。
答案 3 :(得分:1)
Servlet容器在处理客户端请求之前调用servlet init()
方法。创建servlet后仅调用一次。默认情况下,它不执行任何操作。您可以覆盖此方法,它也适合执行一次性活动。例如数据库连接或读取配置数据等。
public void init(ServletConfig config) throws ServletException {
super.init(config);
// You can define your initial parameter in web.xml file.
String initialParameter = config.getInitParameter("initialParameter");
// Do some stuff with initial parameters
}
如果init()方法引发异常会怎样?
将不会调用servlet destroy()
,因为它初始化不成功。 Servlet容器稍后可能会尝试实例化并初始化此失败的Servlet的新实例。
答案 4 :(得分:-1)
谁说过init方法什么也不做。它用于变量等的servlet初始化。例如,您可以在其中放置PreparedStatement初始化。这样,在下一次调用servlet时,就不再需要PS初始化。您必须知道init是Servlet生命周期的一部分。
第一次将Servlet加载到Glassfish或Tomcat中时,将调用init方法,并且Servlet保留在应用程序服务器的内存中。后续调用将执行servlet,并且不会调用init方法。但是变量初始化在那里,已经初始化了。
init()方法仅创建(仅一次)并加载一些将在servlet的整个生命周期内使用的数据。