昨天在面试的时候 被问到这两个问题,都没有回答出来,于是回来测试 了一下...
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.