多个Servlet怎么控制在服务器启动时的装载顺序----以及Servlet,Filter,Listner的启动和关闭的顺序

昨天在面试的时候 被问到这两个问题,都没有回答出来,于是回来测试 了一下...

1.关于有多个Servlet怎么控制在服务器启动时的装载顺序问题...

    经过测试发现,服务器启动的时候,如果没有加其他的配置只是做如下配置

<!-- 最简单的两个Servlet的配置-->

<servlet>
   <servlet-name>MyServlet</servlet-name>
   <servlet-class>com.clb.MyServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>MyServlet</servlet-name>
   <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
 
  
  <servlet>
   <servlet-name>HHHHHHServlet</servlet-name>
   <servlet-class>com.clb.HHHHHHServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>HHHHHHServlet</servlet-name>
   <url-pattern>/HHHHHHServlet</url-pattern>
  </servlet-mapping>

 

在这种情况下,服务器启动,Servlet是不会被实例化以及调用init()方法的,因为在控制台中没有输出我在构造方法和init()方法中的打印语句

(我以前一直以为服务器启动Servlet就会别实例化的,原来不是这个样子的....)

只有当请求要访问到该 Servlet的时候,才会实例化和初始化(结论啊-----)*******************不过这只是针对以上的最简单的配置来说的

---------------------------------------------------------------------

如果要在服务器启动的时候就要实例化Servlet也是可以的....在配置文件中加入另一个配置项就可以了,如下,

<servlet>
   <servlet-name>MyServlet</servlet-name>
   <servlet-class>com.clb.MyServlet</servlet-class>

   <load-on-startup>1<load-on-startup>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>MyServlet</servlet-name>
   <url-pattern>/MyServlet</url-pattern>
  </servlet-mapping>
 
  
  <servlet>
   <servlet-name>HHHHHHServlet</servlet-name>
   <servlet-class>com.clb.HHHHHHServlet</servlet-class>

  <load-on-startup>0<load-on-startup>
  </servlet>
 
  <servlet-mapping>
   <servlet-name>HHHHHHServlet</servlet-name>
   <url-pattern>/HHHHHHServlet</url-pattern>
  </servlet-mapping>

加入如上所示的配置项后,在服务器启动的时候就会装载实例化Servlet.

结论:该配置项中的参数必须是一个正整数,如果是负整数或是其他不合法的参数,服务器启动时就不会实例化那个Servlet.

            参数的可以从0开始,参数越小代表启动的顺序越早.

这个就是控制多个Servlet的启动顺序的方法.

 

2.Servlet,Filter,Listner的启动和关闭的顺序

经过测试,3个组件的启动顺序是 Listner(ServletContextListner)-->Filter--->Servlet

关闭的顺序则是 Servlet--->Filter---->Listner.

 

 

你可能感兴趣的:(多个Servlet怎么控制在服务器启动时的装载顺序----以及Servlet,Filter,Listner的启动和关闭的顺序)