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

最终显示结果:

说明先运行的是SecondHelloServlet的构造器和init方法,然后再运行的是HelloServlet的构造器和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容器被加载时创建实例,且数值越小,越被优先创建(第一二次试验)。

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

点击打开链接

javaWEB总结(2): load-on-startup节点的更多相关文章

  1. JavaWeb总结--Servlet 工作原理解析

    从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...

  2. xml追加节点

    添加方法 public void XmlAppend(VisitM vm) { XmlDocument xmldoc = new XmlDocument(); string path = Server ...

  3. 2.遍历XML即添加修改节点

    1.xml <?xml version="1.0" encoding="utf-8" ?> <stories> <story ac ...

  4. 走进JavaWeb技术世界4:Servlet 工作原理详解

    从本篇开始,正式进入Java核心技术内容的学习,首先介绍的就是Java web应用的核心规范servlet 转自:https://www.ibm.com/developerworks/cn/java/ ...

  5. C#读取xml节点数据方法小结

    本文实例总结了C#读取xml节点数据的方法.分享给大家供大家参考.具体如下: 第一种: 使用XPath XML的路径我配置在web.config 的appSettings节点下 <appSett ...

  6. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法

    Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家有所帮助. 一 插件调试不了以及错误导致崩溃的问题 在开发机器上,有时可 ...

  7. Tomcat服务器原理详解

    [目录]本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解.主要有三大部分: 第一部分.Tomcat的简介和启动过程 第二部分.Tomcat部署webapp 第三 ...

  8. 详解web.xml中元素的加载顺序

    一.背景 最近在项目中遇到了启动时出现加载service注解注入失败的问题,后来经过不懈努力发现了是因为web.xml配置文件中的元素加载顺序导致的,那么就抽空研究了以下tomcat在启动时web.x ...

  9. VS2010 水晶报表的使用

    在VS2010中新建一个“Windows 窗体应用程序”项目,在该项目中添加一个水晶报表“CrystalReport1.rpt”,然后在项目上点击鼠标右键属性,将“目标框架”改为“.Net Frame ...

  10. Excel开发

    浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法   Excel开发过程中有时候会遇到各种奇怪的问题,下面就列出一些本人在开发中遇到的一些比较典型的问题,并给出了解决方法,希望对大家 ...

随机推荐

  1. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

  2. 关于最新版本的log4net使用中遇到的问题

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  3. js--闭包的理解

    从技术上来讲,在JS中,每个function都是闭包,因为它总是能访问在它外部定义的数据. 当该内部函数在外部函数外被调用,就生成了闭包. 函数内部可以直接读取全局变量. 闭包就是能够读取其他函数内部 ...

  4. [妙味JS基础]第八课:return、定时器基础

    知识点总结 return 1)函数名+括号 = return 返回值 2)所有的函数默认的返回值 = 未定义 3)return后面的代码不执行 arguments  =>为实参的集合,当参数个数 ...

  5. HDU 1331 Function Run Fun(记忆化搜索)

    Problem Description We all love recursion! Don't we? Consider a three-parameter recursive function w ...

  6. flask部署 supervisor的使用

    安装supervisor sudo apt-get install supervsor   配置 打开 /etc/supervisor/supervisor.conf 可以看到 同目录文件夹下的 co ...

  7. nginx读取图片没有权限

    场景是这样的,我们项目中上传图片到linux服务器后,保存图片存储路径和网络访问路径.app中用数据库返回的 图片访问路径来访问图片(nginx通过nfs方式读取图片).但是访问不到.要手动 chmo ...

  8. asp.net CROSS-PAGE POSTING

    有两个页面page1和page2.page1中有两个按钮 <asp:Button ID="Button1" runat="server" Text=&qu ...

  9. OSCache 使用

    引入OSCache的jar包 package com.sun.utils; import java.util.Date; import com.opensymphony.oscache.base.Ne ...

  10. CF #368 div2

    题目链接:http://codeforces.com/contest/707/problem/A A. Brain's Photos time limit per test 2 seconds mem ...