java-2 init方法中的GenericServlet

时间:2011-01-20 11:27:33

标签: java servlets

GenericServlet类有两个init方法。为什么会这样?

4 个答案:

答案 0 :(得分:6)

javadoc明确了原因:

init()

  

一种可以覆盖的便捷方法,因此无需调用super.init(config)。   而不是覆盖init(ServletConfig),只需覆盖此方法,它将由GenericServlet.init(ServletConfig config)调用。仍可以通过ServletConfig检索getServletConfig()对象。

因此,如果您的servlet不关心ServletConfig,那么只需实现init()

答案 1 :(得分:1)

有两个init()方法作为通用servlet类的一部分。

  1. init(ServletConfig config)
  2. 的init()
  3. 用于理解2 init()及其用法的示例servlet程序。

    public class TestServlet extends HttpServlet{
    
        public void init() throws......
        {
            System.out.println("we are in 2nd init() ");
        }
        public void service(HttpServlet.........)throws .....{
            System.out.println("we are in TestServlet");
        }
    
    }
    

    在服务器中部署上述servlet时执行的步骤。

    1. 部署项目后,客户端第一次发送请求时 TestServlet然后服务器创建testServlet对象,然后调用第一个init() 方法(init(ServletConfig config))。然后JVM检查第一个init()方法 TestServlet因为它不可用,那么它也在那里检查超类HttpServlet 第一个init方法不可用,然后JVM检查HttpServlet的超类,即 GenericServlet类首先使用init(),然后JVM执行它并调用 第二个init()作为第二个init()可直接在TestServlet中使用,然后是JVM 执行它。
    2. - >当我们使用HttpServlet时,根本不建议使用第一个init()方法。

      - >有什么问题以及为什么我们不建议使用第一个init()?

      第一种方法:

      public class TestServlet extends HttpServlet
          {
            public void init(ServletConfig config) throws.....
            {
              config=getServletConfig();
              String paramName = config.getInitParameter("ParameterName");
              System.out.println("paramName");
            }
          public void service(HttpServlet request ..........)throws .......
          {
              System.out.println("we are in 2nd service method()");
          }
      
      }
      

      在部署上述servlet时执行以下步骤。 创建a.Servlet对象并使用默认值声明超类的所有实例变量,即null然后JVM执行第一个init()方法,因为它在TestServlet中执行它,但是在GenericServlet中可以使用getServletConfig(),因此配置了set当客户端发送TestServlet请求时,我们将面对Null Pointer Execpetion。

      第二种方法

      //Sample code
        ServletConfig config;
      public void init(ServletConfig config){
          this.config=config;
          String fileName = config.getInitParameter("ParameterName");
          System.out.println(config);
      }
      

      上面的代码看起来不错,但上面代码的问题是冗余,根据继承规则,应删除冗余代码。

      第三种方法:

      //approach1 problem can be resolved by calling the super class init() so that config object 
      //will returned which we can use in init() of our servlet.
      super.init(config);
      config=getServletConfig();
      

      因此,对于上述修改,Sun建议使用第二个init()作为我们的servlet的一部分。由于我们没有提供第一个init()作为代码的一部分,因此JVM将调用GenericServlet的第一个init()方法

答案 2 :(得分:0)

基本上,genericServlet什么都不做,有两个init方法

1)init():一种可以覆盖的便捷方法,因此无需调用     super.init(配置)。

2)init(ServletConfig config):由servlet容器调用以指示servlet     servlet正在投入使用。

答案 3 :(得分:0)

每当发送第一个请求web容器时总是调用init(ServletConfig config)方法。因为在特性目的中存储配置对象然后内部调用init()方法。强烈建议重写init()方法。这个方法初始化你自己的活动。这就是简单地说init(servletConfig config)用于web容器目的和init()方法意味着程序员目的。这就是GenericServlet包含两个init()方法。