听说你JavaWeb学的不好?(八)

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

接上

  • 思考:我们自己new的Servlet对象受WEB容器的管理吗?

    • 我们自己new的Servlet对象是不受WEB容器管理的。
    • WEB容器创建的Servlet对象,这些Servlet对象都会被放到一个集合当中(HashMap),只有放到这个HashMap集合中的Servlet才能够被WEB容器管理,自己new的Servlet对象不会被WEB容器管理。(自己new的Servlet对象不在容器当中)
    • web容器底层应该有一个HashMap这样的集合,在这个集合当中存储了Servlet对象和请求路径之间的关系
  • 研究:服务器在启动的时候Servlet对象有没有被创建出来(默认情况下)?

    • 在Servlet中提供一个无参数的构造方法,启动服务器的时候看看构造方法是否执行。
    • 经过测试得出结论:默认情况下,服务器在启动的时候Servlet对象并不会被实例化。
    • 这个设计是合理的。用户没有发送请求之前,如果提前创建出来所有的Servlet对象,必然是耗费内存的,并且创建出来的Servlet如果一直没有用户访问,显然这个Servlet对象是一个废物,没必要先创建。
  • 怎么让服务器启动的时候创建Servlet对象呢?

    • 在servlet标签中添加子标签,在该子标签中填写整数,越小的整数优先级越高。
    • <servlet>
          <servlet-name>aservlet</servlet-name>
          <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>aservlet</servlet-name>
          <url-pattern>/a</url-pattern>
      </servlet-mapping>
      
  • Servlet对象生命周期

    • 默认情况下服务器启动的时候AServlet对象并没有被实例化

    • 用户发送第一次请求的时候,控制台输出了以下内容:

      AServlet无参数构造方法执行了
      AServlet's init method execute!
      AServlet's service method execute!
      
    • 根据以上输出内容得出结论:

      • 用户在发送第一次请求的时候Servlet对象被实例化(AServlet的构造方法被执行了。并且执行的是无参数构造方法。)
      • AServlet对象被创建出来之后,Tomcat服务器马上调用了AServlet对象的init方法。(init方法在执行的时候,AServlet对象已经存在了。已经被创建出来了。)
      • 用户发送第一次请求的时候,init方法执行之后,Tomcat服务器马上调用AServlet对象的service方法。