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

     在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 {

	@Override
	public void destroy() {
		System.out.println("destroy...");
	}

	@Override
	public ServletConfig getServletConfig() {
		System.out.println("getServletConfig...");
		return null;
	}

	@Override
	public String getServletInfo() {
		System.out.println("getServletInfo...");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init...");

	}

	@Override
	public 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{

	@Override
	public void destroy() {
		System.out.println("second destroy..");
		
	}

	@Override
	public ServletConfig getServletConfig() {
		System.out.println("second getServletConfig..");
		return null;
	}

	@Override
	public String getServletInfo() {
		System.out.println("second getServletInfo..");
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("second init..");
		
	}

	@Override
	public 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容器被加载时创建实例,且数值越小,越被优先创建(第一二次试验)


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

点击打开链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值