在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. Quartz简单实例

    Quartz中提供了两种触发器,分别是CronTrigger和SimpleTrigger. 1. SimpleTrigger 每隔若干毫秒来触发纳入进度的任务. 2. CronTrigger 在特定& ...

  2. GCD系列 之(一):基本概念和Dispatch Queue

    参考学习https://www.dreamingwish.com/article/grand-central-dispatch-basic-1.html系列文章,貌似也是翻译自他处的.觉得非常完整,就 ...

  3. OC 调用JS 代码 处理HTML5 实战

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; ...

  4. UIView 和 CALayer 的区别和联系

    UIView是在/System/Library/Frameworks/UIKit.framework定义,也就是处于Cocoa Touch层. CALyer是在/System/Library/Fram ...

  5. 在Ubuntu 14.04安装 Let’s Encrypt并配置ssl

    1.下载安装 Let's Encrypt客户端 cd /usr/local/sbin sudo wget https://dl.eff.org/certbot-auto 2.添加执行权限 sudo c ...

  6. 【MySQL】查询优化实例解析-延迟关联优化

    [提出问题] 从数据表t通过分页查询的方式读取数据,读取时要根据a1排序.t有80万行记录,当OFFSET很大时,读取速度很慢.优化后查询速度提升很快. 下图是表的定义,一共有几十个字段,RowLen ...

  7. js监听事件 上滑消失下滑出现的效果 触摸与手势事件

    https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...

  8. day01(RESTful Web Service、SVN)

    今日大纲 搭建SSM环境 基于SSM环境实现用户管理系统 学习RESTful Web Service 学习SVN 统一开发环境 JDK1.7 32? 64? -- 64 Eclipse 使用4.4.1 ...

  9. 在ASP.NET Web Forms中使用页面导出伪xls Excel表格

    将数据导出为Excel表格是比较常见的需求,也有很多组件支持导出真正的Excel表格.由于Excel能打开HTML文件,并支持其中的table元素以及p之类的文本元素的显示,所以把.html扩展名改为 ...

  10. mysqldump 数据库备份命令及脚本

    mysql -uroot -phowhy@123 -e 'show databases;' | grep -ivE 'waring|database|mysql'|sed -r "s#^(. ...