javaWEB总结(2): load-on-startup节点

来源:互联网 发布:安全的网络管理规范 编辑:程序博客网 时间:2024/06/03 16:57

     在javaWEB总结(1)里面,我们创建了一个servlet以及它的映射,当我们访问那个映射地址的时候,就可以访问servlet,并且servlet容器调用了生命周期方法,销毁前调用destroy方法。而我们还可以有另外一种方法,让servlet在启动时便自动访问servlet,这就是web.xml中servlet标签中的load-on-startup,下面我们做个例子:


1.项目的目录结构如图所示




2.HelloServlet.java还是原来的那个类


package com.dao.chu;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** *  * Title: HelloServlet * Description:实现Servlet接口的类 * </p> */public class HelloServlet implements Servlet {@Overridepublic void destroy() {System.out.println("destroy...");}@Overridepublic ServletConfig getServletConfig() {System.out.println("getServletConfig...");return null;}@Overridepublic String getServletInfo() {System.out.println("getServletInfo...");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {System.out.println("init...");}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {System.out.println("service...");}public HelloServlet() {System.out.println("HelloServlet's constructor..");}}

3.SecondHelloServlet,第二个实现Servlet接口的类


package com.dao.chu;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** *  * Title: HelloServlet * Description:第二个实现Servlet接口的类 * </p> */public class SecondHelloServlet implements Servlet{@Overridepublic void destroy() {System.out.println("second destroy..");}@Overridepublic ServletConfig getServletConfig() {System.out.println("second getServletConfig..");return null;}@Overridepublic String getServletInfo() {System.out.println("second getServletInfo..");return null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {System.out.println("second init..");}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {System.out.println("second service..");}public SecondHelloServlet(){        System.out.println("SecondHelloServlet's constructor..");     }}

4.web.xml文件我们分几种情况去试验:

(1)第一次只是配置HelloServlet的load-on-startup节点,并把节点值设为0;


<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee"    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"    id="WebApp_ID" version="3.0">        <!-- 配置和映射servlet -->    <servlet>        <!-- servlet注册的名字 -->        <servlet-name>helloServlet</servlet-name>        <!-- servlet的全类名 -->        <servlet-class>com.dao.chu.HelloServlet</servlet-class>        <!-- load-on-startup节点 -->        <load-on-startup>0</load-on-startup>    </servlet></web-app>

最终显示结果:



由此可见,虽然我们没有配置HelloServlet的映射路径,但是tomcat启动后servlet自动就调用了HelloServlet的构造方法,和init方法。

(2)第二次我们添加配置ScondHelloServlet的load-on-startup节点,并把节点的值设为1.

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- 配置和映射servlet --><!-- helloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.HelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>0</load-on-startup></servlet><!-- secondHelloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>secondHelloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.SecondHelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>1</load-on-startup></servlet></web-app>


最终显示结果:



说明先运行的是HelloServlet的构造器和init方法,然后再运行的是SecondHelloServlet的构造器和init方法。


(3)第三次我们把HelloServlet的load-on-startup节点设为-1,ScondHelloServlet的load-on-startup节点设为1不变.


<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- 配置和映射servlet --><!-- helloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.HelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>-1</load-on-startup></servlet><!-- secondHelloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>secondHelloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.SecondHelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>1</load-on-startup></servlet></web-app>

最终显示结果:




说明servlet只是自动调用了SecondHelloServlet的构造器和init方法。


(4)第四次我们把HelloServlet的load-on-startup节点设为-1,ScondHelloServlet的load-on-startup节点设为1不变,并且配置HelloServlet的映射路径。


<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><!-- 配置和映射servlet --><!-- helloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>helloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.HelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>-1</load-on-startup></servlet><servlet-mapping>    <!-- 需要和某一个servlet子节点的servlet-name 子节点的文本节点一致 -->    <servlet-name>helloServlet</servlet-name>    <!-- 映射的具体访问路径:/代表当前WEB应用的根目录 -->    <url-pattern>/hello</url-pattern></servlet-mapping><!-- secondHelloServlet --><servlet>    <!-- servlet注册的名字 -->    <servlet-name>secondHelloServlet</servlet-name>    <!-- servlet的全类名 -->    <servlet-class>com.dao.chu.SecondHelloServlet</servlet-class>    <!-- load-on-startup节点 -->    <load-on-startup>1</load-on-startup></servlet></web-app>


最终结果:


运行完servlet后的结果和第三次相同只是输出了SecondHelloServlet的构造器方法和init方法,当我们访问配置的映射路径:http://localhost:7001/javaWeb_02/hello后,又打印除了HelloServlet的构造器方法,init方法和service方法。


总结:

1.load-on-startup可以指定Servlet被创建的时机;
2.若为负数:则在第一次访问时被创建(第三四次试验),若为0或者正数,则在当前WEB容器被加载时创建实例,且数值越小,越被优先创建(第一二次试验)


为了尊重原作者,下面粘贴佟刚老师视频的地址:

点击打开链接

3 0