在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. Regmon7.04绿色版(注册表变动实时监视工具)

    Regmon V7.04 简繁中文绿色版 软件大小: 155KB软件语言: 简体中文运行环境:Win9x/NT/2000/XP/2003/软件类别:国外软件 / 免费版 / 系统其它Regmon Re ...

  2. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  3. HTML中判断手机是否安装某APP,跳转或下载该应用

    有些时候在做前端输出的时候,需要和app的做些对接工作.就是在手机浏览器中下载某app时,能判断该用户是否安装了该应用.如果安装了该应用,就直接打开该应用:如果没有安装该应用,就下载该应用.那么下面就 ...

  4. Java中 +=是什么意思 什么情况下用

    x+=1与x=x+1一样的效果执行一次x=x+1,就等于给x重新赋了值,这个值就是x+1例如:int x=1;x+=1;最后x的值是2x+=1一般在循环下使用,能发挥它的最大的作用.例如:while( ...

  5. 万恶的tileMap

    先吐槽下.. 本来,我们准备用tileMap来做地图的,但发现一个问题,就是tileMap层中不能添加cc.Sprite,这导致了tileMap只适合做2D平面没有遮挡的游戏,并且主角是不能有效率的进 ...

  6. PHP操作Memcache基本函数

    Memcache模块提供了于Memcached方便的面向过程及面向对象的接口,Memcached是为了降低动态web应用从数据库加载数据而产生的一种常驻进程缓存产品.Memcache模块同时提供了一个 ...

  7. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

  8. CocoaPods 报错 [!] The dependency `JSONModel (~> 1.2.0)` is not used in any concrete target.

    当用CocoaPods  pod install 时出现了下面的错误时: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; col ...

  9. C#入门经典中的SelectionFont属性为null

    14.6.2.richtextbox控件: private void buttonbold_click(object sender, eventargs e)        {            ...

  10. 第一百零七节,JavaScript基本包装类型,数据类型的方法

    JavaScript基本包装类型,数据类型的方法 学习要点: 1.基本包装类型概述 2.Boolean类型 3.Number类型 4.String类型 为了便于操作基本类型值,ECMAScript提供 ...