什么是servlet的init()方法用于?

时间:2011-02-28 09:53:14

标签: java servlets

当我反编译GenericServlet并检查init()时,我看到以下代码。

public void init(ServletConfig servletconfig)
    throws ServletException
{
    config = servletconfig;
    init();
}

public void init()
    throws ServletException
{
}

这里实际执行的init方法是什么?我错过了什么吗?

5 个答案:

答案 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的整个生命周期内使用的数据。