• Java--web.xml加载过程;文件标签详解


    一、web.xml加载过程

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

    WEB加载web.xml过程如下:

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

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

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

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

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

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

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

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

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

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

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

    ServletContext  ---->  ---->  ---->  ----> 

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

    二、web.xml文件标签详解

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

    1. "1.0" encoding="UTF-8"?>
    2. web-app PUBLIC
    3. "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    4. "http://java.sun.com/dtd/web-app_2_3.dtd">
    5. <web-app>
    6. 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、根元素

    是部署描述的根元素,该元素含23个子元素

    DTD文件规定元素的子元素的语法如下

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

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

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

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

    2、Web应用图标

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

    1. <icon>
    2. <small-icon>/images/app_small.gifsmall-icon>
    3. <large-icon>/images/app_large.giflarge-icon>
    4. icon>

    3、Web应用名称

    Javaweb项目的相关应用名称

    <display-name>Tomcat Exampledisplay-name>

    4、Web应用描述

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

    5、上下文参数

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

    参数名称:设定Context名称

    :设定Context名称的值

    1. <context-param>
    2. <param-name>ContextParameterpara-name>
    3. <param-value>testparam-value>
    4. <description>It is a test parameter.description>
    5. context-param>

    6、过滤器

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

    Filter的名称:定义Filter的名称

    Filter的类名称:定义Filter的类名称

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

    Filter的名称:定义Filter的名称.

    URL

    1. <filter>
    2. <filter-name>setCharacterEncodingfilter-name>
    3. <filter-class>com.myTest.setCharacterEncodingFilterfilter-class>
    4. <init-param>
    5. <param-name>encodingparam-name>
    6. <param-value>UTF-8param-value>
    7. init-param>
    8. filter>
    9. <filter-mapping>
    10. <filter-name>setCharacterEncodingfilter-name>
    11. <url-pattern>/*url-pattern>
    12. filter-mapping>

    7、监听器

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

    Listener的类名称:定义Listener的类名称

    1. <listener>
    2. <listerner-class>com.listener.SessionListenerlistener-class>
    3. listener>

    8、

    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实例,即1(LZ有篇文章详细说明:web.xml中n作用 - 夏日树叶 - 博客园)

    每个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的类名称
                指定web站台中的某个JSP网页的完整路径
                用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数
                指定当Web应用启动时,装载Servlet的次序。当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet。当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它。
                用来定义servlet所对应的URL,包含两个子元素
                    指定servlet的名称
                    指定servlet所对应的URL

    1. <servlet>
    2. <servlet-name>snoopservlet-name>
    3. <servlet-class>SnoopServletservlet-class>
    4. servlet>
    5. <servlet-mapping>
    6. <servlet-name>snoopservlet-name>
    7. <url-pattern>/snoopurl-pattern>
    8. servlet-mapping>
    9. <servlet>
    10. <servlet-name>snoopservlet-name>
    11. <servlet-class>SnoopServletservlet-class>
    12. <init-param>
    13. <param-name>fooparam-name>
    14. <param-value>barparam-value>
    15. init-param>
    16. <run-as>
    17. <description>Security role for anonymous accessdescription>
    18. <role-name>tomcatrole-name>
    19. run-as>
    20. servlet>
    21. <servlet-mapping>
    22. <servlet-name>snoopservlet-name>
    23. <url-pattern>/snoopurl-pattern>
    24. servlet-mapping>

    9、会话超时配置

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

    1. <session-config>
    2. <session-timeout>120session-timeout>
    3. session-config>

    10、

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

    扩展名名称:扩展名称

    MIME格式:MIME格式

    1. <mime-mapping>
    2. <extension>htmextension>
    3. <mime-type>text/htmlmime-type>
    4. mime-mapping>

    11、欢迎文件页

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

    用来指定首页文件名称

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

    1. <welcome-file-list>
    2. <welcome-file>index.jspwelcome-file>
    3. <welcome-file>index.htmlwelcome-file>
    4. <welcome-file>index.htmwelcome-file>
    5. welcome-file-list>

    12、错误页面

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

    错误代码:HTTP Error code,例如: 404、403

    Exception:一个完整名称的Java异常类型

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

    1. <error-page>
    2. <error-code>404error-code>
    3. <location>/NotFound.jsplocation>
    4. error-page>
    5. <error-page>
    6. <exception-type>java.lang.NullExceptionexception-type>
    7. <location>/error.jsplocation>
    8. error-page>

    13、设置jsp

     包括  和  两个子元素。其中 元素在JSP 1.2 时就已经存在;而 是JSP 2.0 新增的元素。

     元素主要有八个子元素,它们分别为:

    :设定的说明 

    :设定名称 

    :设定值所影响的范围,如: /CH2 或 /*.jsp

    :若为 true,表示不支持 EL 语法 

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

    :设定 JSP 网页的编码 

    :设置 JSP 网页的抬头,扩展名为 .jspf

    :设置 JSP 网页的结尾,扩展名为 .jspf

    1. Taglib
    2. /WEB-INF/tlds/MyTaglib.tld
    3. Special property group for JSP Configuration JSP example.
    4. JSPConfiguration
    5. /jsp/*
    6. true
    7. GB2312
    8. true
    9. /include/prelude.jspf
    10. /include/coda.jspf

    参考链接

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

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

  • 相关阅读:
    java虚拟机堆空间
    【从头构筑C#知识体系】1.6 委托
    ATF(TF-A) SPMC威胁模型-安全检测与评估
    STM32H750 HAL CUBEMX 时钟失败及死机无法下载问题解决
    CF1186B
    地理信息系统的发展趋势——网格GIS
    CopyOnWriteArrayList 是如何保证线程安全的?
    第七届NVIDIA Sky Hackathon项目报告书
    mybatis-plus 3.5.2 自动生成代码
    C语言学生成绩管理系统(二叉排序树)
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/123251679