一、web.xml加载过程

我们在启动Javaweb项目时,首先需要启动一个容器(如Tomcat,JBoss)

WEB加载web.xml过程如下:

1、在启动Web项目时,容器(如Tomcat,JBoss)会读web.xml配置文件中的两个节点

<listener><context-param>

2、接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能够使用这个上下文

3、接着容器以<context-param>的name作为键,value作为值,将其转化为键值对,存入ServletContext

4、容器创建<listener>中的类实例,即根据配置的class类路径<listener-class>来创建监听(备注:listener定义的的类型是自定义的类但必须要继承ServletContextListener)

5、监听器的类中会有一个 contextInitialized(servletContextEvent event)初始化的方法

在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation")来获得context-param设定的值

在这个类中还必须有一个contextDestroyed(ServletContextEvent event)销毁方法,用于关闭资源应用前释放资源,比如数据库的连接关闭

6、接着,容器会读取<filter></filter>,根据指定的类路径来实例化过滤器

以上步骤都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。

如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。

总的来说,Web容器加载web.xml的顺序是

ServletContext  ----> <context-param> ----> <listener> ----> <filter> ----> <servlet>

注:如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载

二、web.xml文件标签详解

新建一个web项目时,默认创建的web.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"><web-app></web-app>

web.xml的学名叫做部署描述文件(DD),它不是Spring所特有的,而是在Servlet规范中定义的,是web应用的配置文件

Javaweb项目中并不是必须需要web.xml文件。它主要的作用:

配置欢迎页、servlet、filter、listener等以及定制servlet、JSP、Context初始化参数

部署描述文件就像所有XML文件一样,必须以一个XML头开始。这个头声明可以使用的XML版本并给出文件的字符编码

DOCYTPE声明必须立即出现在此头之后。这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义)

部署描述文件的顶层(根)元素为web-app

注:

XML元素不像HTML,他是大小写敏感的。因此,web-App和WEB-APP都是不合法的,web-app必须小写

1、web-app:表示根元素

2、PUBLIC:表示DTD文件可以被公开使用

3、-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN:表示DTD由Sun Microsystems, Inc.维护

该信息也表示它描述的文档类型是DTD Web Application 2.3,而且DTD是用英文书写的

4、URL"http://java.sun.com/dtd/web-app_2_3.dtd"表示DD文件的位置

1、<web-app></web-app>根元素

<web-app></web-app>是部署描述的根元素,该元素含23个子元素

DTD文件规定<web-app>元素的子元素的语法如下

<!ELEMENT web-app (icon?, display-name?, description?,distributable?, context-param*, filter*, filter-mapping* ,listener*, servlet*, servlet- mapping*,session -config? ,mime-mapping*, welcome-file-list?,error-page*,taglib*, resource-env-ref*, resource-ref*,se curity- constraint*,login-config?, security-role* , env-entry* , ejb-ref*, ejb-1local-ref*)

该元素含23个子元素。而且子元素都是可选的。问号(?)表示子元素是可选的,而且只能出现一次
星号(*)表示子元素可在部署描述符中出现零次或多次。有些子元素还可以有它们自己的子元素

web.xml文件中<web-app>元素声明的是下面每个子元素的声明

在Servlet2.3中,子元素必须按照DTD文件描述中指定的顺序出现。比如:如果部署描述符中的<web-app>元素有<servlet>和<servlet-mapping>两个子元素,则<servlet>子元素必须出现在<servlet-mapping>子元素之前。在Servlet2.4中,顺序并不重要

2、<icon>Web应用图标

指出IDE和GUI工具用来表示Web应用的大图标和小图标

<icon><small-icon>/images/app_small.gif</small-icon><large-icon>/images/app_large.gif</large-icon>
</icon>

3、<display-name>Web应用名称

Javaweb项目的相关应用名称

<display-name>Tomcat Example</display-name>

4、<disciption>Web应用描述

<disciption>Tomcat Example servlets and JSP pages.</disciption>

5、<context-param>上下文参数

<context-param> 元素用来设定web应用的环境参数(context),它包含两个子元素:

<param-name> 和 <param-value>

<param-name>参数名称</param-name>:设定Context名称

<param-value>值</param-value>:设定Context名称的值

<context-param><param-name>ContextParameter</para-name><param-value>test</param-value><description>It is a test parameter.</description>
</context-param>

6、<filter>过滤器

filter元素用来设定web应用的过滤器,它的两个主要子元素filter-name和filter-class用来定义Filter所对应的class

<filter-name>Filter的名称</filter-name>:定义Filter的名称

<filter-class>Filter的类名称</filter-class>:定义Filter的类名称

filter-mapping 元素的两个主要子元素filter-name和url-pattern 用来定义Filter所对应的URL.

<filter-name>Filter的名称</filter-name>:定义Filter的名称.

<url-pattern>URL</url-pattern>

<filter><filter-name>setCharacterEncoding</filter-name><filter-class>com.myTest.setCharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>setCharacterEncoding</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

7、<listener>监听器

listener元素用来定义Listener接口,它的主要子元素为

<listen-class>Listener的类名称</listener-class>:定义Listener的类名称

<listener> <listerner-class>com.listener.SessionListener</listener-class>
</listener>

8、<servlet>

8.1、Servlet介绍

Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外HttpServlet有两个方法:

init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源。

destory():销毁Servlet实例时,自动调用该方法回收资源。

通常无需重写init()和destory()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法。如果重写了init()方法,应该在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完先完成某些资源的回收,比如关闭数据库链接,才需要重写destory()方法。

8.2、Servlet的生命周期

创建Servlet实例有两个时机:

客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet;

web应用启动时立即创建Servlet实例,即<load-on-start>1</laod-on-start>(LZ有篇文章详细说明:web.xml中<load-on-start>n</load-on-satrt>作用 - 夏日树叶 - 博客园)

每个Servlet的运行都遵循如下生命周期:

(1)创建Servlet实例。

(2)Web容器调用Servlet的init()方法,对Servlet进行初始化。

(3)Servlet初始化之后,将一直存在与容器之中,用于响应客户端请求,如果客户端发送GET请求,容器调用Servlet的doGet()方法处理并响应请求;如果客户端发送POST请求,容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。

(4)Web容器决定销毁Servlet时,先调用Servlet的destory()方法,通常在关闭Web应用时销毁Servlet实例

<servlet> 用来声明一个servlet的数据,主要有以下子元素:
            <servlet-name> 指定servlet的名称
            <servlet-class> 指定servlet的类名称
            <jsp-file> 指定web站台中的某个JSP网页的完整路径
            <init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数
            <load-on-startup> 指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它。
            <servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素
                <servlet-name></servlet-name> 指定servlet的名称
                <url-pattern></url-pattern> 指定servlet所对应的URL

<!-- 基本配置 -->
<servlet><servlet-name>snoop</servlet-name><servlet-class>SnoopServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>snoop</servlet-name><url-pattern>/snoop</url-pattern>
</servlet-mapping><!-- 高级配置 -->
<servlet><servlet-name>snoop</servlet-name><servlet-class>SnoopServlet</servlet-class><init-param><param-name>foo</param-name><param-value>bar</param-value></init-param><run-as><description>Security role for anonymous access</description><role-name>tomcat</role-name></run-as>
</servlet>
<servlet-mapping><servlet-name>snoop</servlet-name><url-pattern>/snoop</url-pattern>
</servlet-mapping>

9、<session-config>会话超时配置

定义这个web站台所有session的有效期限,单位为分钟

<session-config><session-timeout>120</session-timeout>
</session-config>

10、<mime-mapping>

mime-mapping包含两个子元素extension和mime-type;定义某一个扩展名和某一MIME Type做对映.

<extension>扩展名名称</extension>:扩展名称

<mime-type>MIME格式</mime-type>:MIME格式

<mime-mapping><extension>htm</extension><mime-type>text/html</mime-type>
</mime-mapping>

11、<welcome-file-list>欢迎文件页

welcome-file-list包含一个子元素welcome-file.用来定义首页列单

<welcome-file>用来指定首页文件名称</welcome-flie>

welcome-file用来指定首页文件名称.我们可以用<welcome-file>指定几个首页,而服务器会依照设定的顺序来找首页

<welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file>
</welcome-file-list>

12、<error-page>错误页面

error-page元素包含三个子元素error-code,exception-type和location.将错误代码(Error Code)或异常(Exception)的种类对应到web应用资源路径.

<error-code>错误代码</error-code>:HTTP Error code,例如: 404、403

<exception-type>Exception</exception-type>:一个完整名称的Java异常类型

<location>/路径</location>:在web应用内的相关资源路径

<!-- 1、通过错误码来配置error-page。当系统发生×××错误时,跳转到错误处理页面。 -->
<error-page><error-code>404</error-code><location>/NotFound.jsp</location>
</error-page>
<!-- 2、通过异常的类型配置error-page。当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面。 -->
<error-page><exception-type>java.lang.NullException</exception-type><location>/error.jsp</location>
</error-page>

13、<jsp-config>设置jsp

<jsp-config> 包括 <taglib> 和 <jsp-property-group> 两个子元素。其中<taglib> 元素在JSP 1.2 时就已经存在;而<jsp-property-group> 是JSP 2.0 新增的元素。

<jsp-property-group> 元素主要有八个子元素,它们分别为:

<description>:设定的说明

<display-name>:设定名称

<url-pattern>:设定值所影响的范围,如: /CH2 或 /*.jsp

<el-ignored>:若为 true,表示不支持 EL 语法

<scripting-invalid>:若为 true,表示不支持 <% scripting %>语法

<page-encoding>:设定 JSP 网页的编码

<include-prelude>:设置 JSP 网页的抬头,扩展名为 .jspf

<include-coda>:设置 JSP 网页的结尾,扩展名为 .jspf

<jsp-config><taglib><taglib-uri>Taglib</taglib-uri><taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location></taglib><jsp-property-group><description>Special property group for JSP Configuration JSP example.</description><display-name>JSPConfiguration</display-name><url-pattern>/jsp/* </url-pattern><el-ignored>true</el-ignored><page-encoding>GB2312</page-encoding><scripting-invalid>true</scripting-invalid><include-prelude>/include/prelude.jspf</include-prelude><include-coda>/include/coda.jspf</include-coda></jsp-property-group>
</jsp-config>

参考链接

https://www.jb51.net/article/193081.htm

https://www.cnblogs.com/Im-Victor/p/9598154.html

Java--web.xml加载过程;文件标签详解相关推荐

  1. JAVA Web.xml 加载顺序

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> ...

  2. Qt 加载图片文件路径详解

    QT 加载文件,图片路径很容易搞混,需要注意的是WINDOW路径分隔符为"\",QT为"/",我遇到的路径加载总结为三种情况: (1)绝对路径,文件的整个路径, ...

  3. web.xml加载详细过程(步骤)

    转载自:http://blog.csdn.net/believejava/article/details/43229361 这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢 ...

  4. Java 类的加载过程

    Java 类的加载过程 当程序主动使用某个类时,如果该类还没有加载到内存中,则通过以下三个步骤对类进行加载初始化: 类的加载:将类的class文件读入内存,并为之创建一个java.lang.Class ...

  5. 易优cms load 加载资源文件标签使用方法

    [基础用法] 标签:load 描述:资源文件加载,比如:css/js 用法: {eyou:load href='/static/js/common.js' ver='on' /} 属性: file=' ...

  6. 【胖虎的逆向之路】01——动态加载和类加载机制详解

    胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...

  7. android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解

    Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...

  8. Fragment的懒加载与生命周期详解

    提示:本文仅为笔者学习记录 Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCr ...

  9. Java类的加载过程详解 面试高频!!!值得收藏!!!

    受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话: 八小时内谋生活,八小时外谋发展. 望别日与 ...

最新文章

  1. 智能车竞赛研讨会 会议通知
  2. PowerDesigner逆向工程mysql
  3. PHP笔记-管道的作用 类
  4. openglshader实现虚拟场景_虚拟演播室设计原则
  5. Mac超强扒站神器——SiteSucker Pro 4.3.3 mac中英文
  6. mac自带python升级_mac升级Python失败?
  7. 超级全面的 Lombok 注解介绍,学一波!
  8. spring mysql中文乱码问题_解决Spring下MySQL出现乱码的问题
  9. JavaScript快速入门(三)——JavaScript语句
  10. 1296: [SCOI2009]粉刷匠
  11. PPT镂空字体、填充文字、图片字、拆分字制作
  12. 全面的在线教育直播平台是怎样的呢?
  13. 了解 云原生 和 边缘计算
  14. HDU 2154跳舞毯
  15. 高瓴资本张磊:选择比努力重要,与谁同行比要去的远方重要
  16. Camtasia Studio 录制视频保存为camrec格式后快速导出为AVI格式
  17. 一套仿英雄联盟大型多人联机实时对战游戏源码(包含完整服务器和客户端源码)...
  18. 网络隔离环境下的跨网数据传输,如何保障安全性?
  19. 石头扫地机器人卡顿_小帅慢评 篇三:石头扫地机器人S50半年使用体验新品T65简评...
  20. 得分(Score,ACM/ICPC Seoul 2005,UVa1585)

热门文章

  1. 王老吉三亿元投资雅安被质疑作秀九
  2. 我国第一部电子计算机诞生于,占地达40平方米 我国第一部国产电子计算机于1958年诞生...
  3. 发布网站笔记2——前后端联系
  4. Redis故障检查:延迟测量
  5. Winform记住密码功能
  6. 幅值单位是v吗_电压幅值什么意思
  7. 单片机开发的两种类型
  8. SSM+Mysql实现的共享单车管理系统(功能包含分角色,登录、用户管理、服务点管理、单车管理、分类管理、学生信息管理、单车租赁、信息统计、系统设置等)
  9. jQuery调用打印机
  10. 使用scrapy 爬取酷狗音乐歌手及歌曲名并存入mongodb中