web.xml 解析

web.xml 解析
加载过程: https://blog.csdn.net/ahou2468/article/details/

  1. 启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点:
  2. 紧接着,容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文
  3. 容器以的name作为键,value作为值,将其转化为键值对,存入ServletContext
  4. 容器创建中的类实例,根据配置的class类路径来创建监听,在监听中会有
    contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,在这个方法中获得
    ServletContextapplication=ServletContextEvent.getServletContext(); context-param的值就是
    application.getInitParameter("context-param的键");得到这个context-param的值之后,你就可以做一些操作了
  5. 举例:你可能想在项目启动之前就打开数据库,那么这里就可以在中设置数据库的连接方式(驱动、url、user、password),在监听类
    中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调
    用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。
  6. 接着,容器会读取,根据指定的类路径来实例化过滤器。
  7. 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不
    会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟
  8. 总的来说,web.xml的加载顺序是:->->->。其中,如果web.xml中出现了相同的元素,则按照在配置文件中
    出现的先后顺序来加载
  9. 对于某类元素而言,与它们出现的顺序是有关的。以为例,web.xml中当然可以定义多个,与相关的一个元素是
    ,注意,对于拥有相同元素而言,必须出现在之后,
    否则当解析到时,它所对应的还未定义。web容器启动初始化每个时,按照出现的顺序来初始化
    的,当请求资源匹配多个时,拦截资源是按照元素出现的顺序来依次调用doFilter()方法的。
    类似,此处不再赘述。


log-service

env.flag
dev


com.huawei.pps.platform.common.tool.InitLog4j2Listener

com.huawei.pps.platform.common.tool.aesencrypt.KeyLoaderWithPropListener com.huawei.pps.logservice.tool.rainbow.RainbowKeyLoaderListener org.springframework.web.util.IntrospectorCleanupListener errorFilter com.huawei.pps.platform.common.tool.ErrorHandleFilter errorFilter /* CharacterEncodingFilter encodingFilter org.springframework.web.filter.CharacterEncodingFilter CharacterEncodingFilter encoding UTF-8 forceEncoding true encodingFilter /

authFilter
com.huawei.pps.platform.common.tool.digestauth.DigestAuthFilter

algorithm
HmacSHA256


appId
aoss2log,dspportal2log


timeoutLimit
{{authFilter.timeoutLimit}}


contentMaxLength
80000

authFilter /test/*

commonFilter
com.huawei.pps.logservice.filter.CommonFilter

commonFilter /*

spring
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:dev/spring/application-context.xml,classpath:dev/spring/mysql-connection.xml,classpath:dev/spring/dmq-
config.xml


1
true

spring /

SystemInit
com.huawei.pps.logservice.servlet.SystemInit
2

15 1. XML文档有效性检查 dtd 文件信息


定义了web应用的名称

使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行


使用上下文初始化参数

5.1 解释:解释:

元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中
上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。子元素包含有参数名,而子元素包含的是参数值。作为选
择,可用子元素来描述参数。

5.2 什么情况下使用,为什么使用什么情况下使用,为什么使用::

比如:定义一个管理员email地址用来从程序发送错误,或者与你整个应用程序有关的其他设置。使用自己定义的设置文件需要额外的代码和管理;直接在你的

程序中使用硬编码(Hard-coding)参数值会给你之后修改程序带来麻烦,更困难的是,要根据不同的部署使用不同的设置;通过这种办法,可以让其他开发人
员更容易找到相关的参数,因为它是一个用于设置这种参数的标准位置。

5.3 Spring 配置文件:配置文件:

配置Spring,必须需要,而可有可无,如果在web.xml中不写配置信息,默认的路径是/WEB-
INF/applicationontext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入
contextConfigLocation这个context参数:在
里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,比如在business-client工程中,我们采用了自定义配置方
式,配置如下:

contextConfigLocation
/WEB-INF/spring-configuration/*.xml


org.springframework.web.context.ContextLoaderListener

部署在同一容器中的多个Web项目,要配置不同的webAppRootKey,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省
为“webapp.root”,如下:
<!—business-client应用路径 -->

webAppRootKey
business.root

<!—public-base应用路径 -->

webAppRootKey
pubbase.root

5.4 多个配置文件交叉引用处理:多个配置文件交叉引用处理:
如果web.xml中有contextConfigLocation参数指定的Spring配置文件,则会去加载相应的配置文件,而不会去加载/WEB-INF/下的applicationContext.xml。但是如
果没有指定的话,默认会去/WEB-INF/下加载applicationContext.xml。 在一个团队使用Spring的实际项目中,应该需要多个Spring的配置文件,如何使用和交叉

引用的问题: 多个配置文件可以在web.xml里用空格分隔写入,如:

contextConfigLocation applicationContext-database.xml,applicationContext.xml 多个配置文件里的交叉引用可以用ref的external或bean解决,例如:applicationContext.xml dbBean在applicationContext-database.xml中 5.5 在不同环境下如何获取:范例在不同环境下如何获取:范例 param_name param_value 此所设定的参数,在JSP网页中可以使用下列方法来取得: ${initParam.param_name} 若在Servlet可以使用下列方法来获得: String param_name=getServletContext().getInitParamter("param_name"); Servlet的ServletConfig对象拥有该Servlet的ServletContext的一个引用,所以可这样取得上下文初始化参数: getServletConfig().getServletContext().getInitParameter()也可以在Servlet中直接调用getServletContext().getInitParameter(),两者是等价 的。 120 用于设置容器的session参数,比如: 用于指定http session的失效时间。默认时间设置在 /conf/web.xml (30 minutes)。用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session- timeout元素的值为零或负数,则表示会话将永远不会超时。 org.springframework.web.util.Log4jConfigListener org.springframework.web.context.ContextLoaderListener com.yonyou.mcloud.cas.client.session.SingleSignOutHttpSessionListener (1). 使用@WebListener修饰Listener实现类即可。 (2). 在web.xml文档中使用进行配置。 这里的用于Spring的加载,Spring加载可以利用ServletContextListener实现,也可以采用load-on-startup Servlet 实现,但是当 需要用到bean时,但加载顺序是:先加载后加载,则中初始化操作中的bean为null;所以,如果过滤器中要使用到bean,此 时就可以根据加载顺序 -> -> ,将spring的加载改成Listener的方式。 (1). 利用ServletContextListener实现: context org.springframework.web.context.ContextLoaderServlet 1 (2).采用load-on-startup Servlet 实现: org.springframework.web.context.ContextLoaderListener CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 forceEncoding true CAS Single Sign Out Filter com.yonyou.mcloud.cas.client.session.SingleSignOutFilter CAS Authentication Filter com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter casServerLoginUrl https://dev.yonyou.com:443/sso-server/login serverName http://10.1.215.40:80 CAS Validation Filter org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter casServerUrlPrefix https://dev.yonyou.com:443/sso-server serverName http://10.1.215.40:80 proxyCallbackUrl https://dev.yonyou.com:443/business/proxyCallback proxyReceptorUrl /proxyCallback proxyGrantingTicketStorageClass com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl encoding UTF-8

CAS HttpServletRequest Wrapper Filter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter

CAS Assertion Thread Local Filter
org.jasig.cas.client.util.AssertionThreadLocalFilter

NoCache Filter
com.yonyou.mcloud.cas.client.authentication.NoCacheFilter

CharacterEncodingFilter /* NoCache Filter /* CAS Single Sign Out Filter /* CAS Validation Filter /proxyCallback CAS Authentication Filter /* CAS Validation Filter /* CAS HttpServletRequest Wrapper Filter /* CAS Assertion Thread Local Filter /*
Filter可认为是Servle的一种“加强版”,主要用于对用户请求request进行预处理,也可以对Response进行后处理,是个典型的处理链。使用Filter的
完整流程是:Filter对用户请求进行预处理,接着将请求HttpServletRequest交给Servlet进行处理并生成响应,最后Filter再对服务器响应
HttpServletResponse进行后处理。Filter与Servlet具有完全相同的生命周期,且Filter也可以通过来配置初始化参数,获取Filter的初始
化参数则使用FilterConfig的getInitParameter()。
换种说法,Servlet里有request和response两个对象,Filter能够在一个request到达Servlet之前预处理request,也可以在离开Servlet时处理
response,Filter其实是一个Servlet链。以下是Filter的一些常见应用场合

(1)认证Filter
(2)日志和审核Filter
(3)图片转换Filter
(4)数据压缩Filter
(5)密码Filter
(6)令牌Filter
(7)触发资源访问事件的Filter
(8)XSLT Filter
(9)媒体类型链Filter

Filter可负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截。创建一个Filter只需两步:
(1) 创建Filter处理类
(2) Web.xml文件中配置Filter
Filter必须实现javax.servlet.Filter接口,在该接口中定义了三个方法:
(1) void init(FilterConfig config):用于完成Filter的初始化。FilteConfig用于访问Filter的配置信息。
(2) void destroy():用于Filter销毁前,完成某些资源的回收。

(3) void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能的核心方法,该方法就是对每个请求及响
应增加额外的处理。该方法实现对用户请求request进行预处理,也可以实现对服务器响应response进行后处理---它们的分界线为是否调用了
chain.doFilter(request,response),执行该方法之前,即对用户请求request进行预处理,执行该方法之后,即对服务器响应response进行后处理。
例子:

  1. 字符集过滤器

    CharacterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter

    encoding
    UTF-8


    forceEncoding
    true



    CharacterEncodingFilter
    /*
  2. 缓存控制

    NoCache Filter
    com.yonyou.mcloud.cas.client.authentication.NoCacheFilter


    NoCache Filter
    <!—表示对URL全部过滤-->
    /*
  3. 登录认证

    CAS Authentication Filter
    com.yonyou.mcloud.cas.client.authentication.ExpandAuthenticationFilter

    casServerLoginUrl
    https://dev.yonyou.com:443/sso-server/login

serverName
http://10.1.215.40:80



CAS Authentication Filter
/

4. 单点登出

CAS Single Sign Out Filter
org.jasig.cas.client.session.SingleSignOutFilter


CAS Single Sign Out Filter
/



org.jasig.cas.client.session.SingleSignOutHttpSessionListener

封装request

CAS HttpServletRequest Wrapper Filter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter


CAS HttpServletRequest Wrapper Filter
/

存放Assertion到ThreadLocal中

CAS Assertion Thread Local Filter
org.jasig.cas.client.util.AssertionThreadLocalFilter


CAS Assertion Thread Local Filter
/


7. 禁用浏览器缓存

NoCache Filter
com.yonyou.mcloud.cas.client.authentication.NoCacheFilter


NoCache Filter
/*

CAS Client向CAS Server进行ticket验证

CAS Validation Filter
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

casServerUrlPrefix
https://dev.yonyou.com:443/sso-server


serverName
http://10.1.215.40:80


proxyCallbackUrl
https://dev.yonyou.com:443/business/proxyCallback


proxyReceptorUrl
/proxyCallback


proxyGrantingTicketStorageClass
com.yonyou.mcloud.cas.client.proxy.MemcachedBackedProxyGrantingTicketStorageImpl

encoding UTF-8
CAS Validation Filter /proxyCallback CAS Validation Filter /* business org.springframework.web.servlet.DispatcherServlet publishContext false 1 LogOutServlet com.yonyou.mcloud.cas.web.servlet.LogOutServlet serverLogoutUrl https://dev.yonyou.com:443/sso-server/logout serverName http://10.1.215.40:80/business/ LogOutServlet /logout business / Servlet通常称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户的请求。Servlet是个特殊的java类,继承于HttpServlet。客户端通 常只有GET和POST两种请求方式,Servlet为了响应则两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一 样的,此时只需要重写service()方法即可响应客户端的所有请求。 另外,HttpServlet有两个方法: (1). init(ServletConfig config):创建Servlet实例时,调用该方法的初始化Servlet资源。 (2). destroy():销毁Servlet实例时,自动调用该方法的回收资源。 通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法,如果重写了init()方 法,应在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完成某些资源的回 收,比如关闭数据库连接,才需要重写destory方法()。 Servlet的生命周期: 创建Servlet实例有两个时机: (1). 客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet。 (2). Web应用启动时立即创建Servlet实例,即load-on-start Servlet。 每个Servlet的运行都遵循如下生命周期: (1). 创建Servlet实例。 (2). Web容器调用Servlet的init()方法,对Servlet进行初始化。 (3). Servlet初始化后,将一直存在于容器中,用于响应客户端请求,如果客户端发送GET请求,容器调用Servlet的doGet()方法处理并响应请求;如果 客户端发送POST请求,容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。 (4). Web容器决定销毁Servlet时,先调用Servlet的destory()方法,通常在关闭Web应用时销毁Servlet实例。 9.1 Servlet 配置配置

为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:
(1). 在Servlet类中使用@WebServlet Annotation进行配置。
(2). 在web.xml文件中进行配置。
我们用web.xml文件来配置Servlet,需要配置用来声明一个Servlet。
元素的用法和的用法相同。元素与元素具有相同的元素描述符,可以使用子元素将初
始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:
java.lang.String.getInitParameter(java.lang.String name):用于获取初始化参数
ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletConfig是取得当前Servlet的配置参数,而
ServletContext是获取整个Web应用的配置参数。
(1).
1). :为Servlet指定一个文本描述。
2). :为Servlet提供一个简短的名字被某些工具显示。
3). :为Servlet指定一个图标,在图形管理工具中表示该Servlet。
(2). 元素
必须含有,或者。 描述如下:
1). 用来定义servlet的名称,该名称在整个应用中必须是惟一的。
2). 用来指定servlet的完全限定的名称。
3). 用来指定应用中JSP文件的完整路径。这个完整路径必须由/开始。
(3).
如果load-on-startup元素存在,而且也指定了jsp-file元素,则JSP文件会被重新编译成Servlet,同时产生的Servlet也被载入内存。的内容可以为空,或者是一个整数。这个值表示由Web容器载入内存的顺序。
举个例子:如果有两个Servlet元素都含有子元素,则子元素值较小的Servlet将先被加载。如果子元素值为空或负值,则由Web容器决定什么时候加载Servlet。如果两个Servlet的子元素值相同,则由Web容器决定先加载
哪一个Servlet。1表示启动容器时,初始化Servlet。
(4).
含有
1). :Servlet的名字,唯一性和一致性,与元素中声明的名字一致。
2). :指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。将URL模式映射到某个Servlet,
即该Servlet处理的URL。
(5). 加载Servlet的过程
容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径()做匹配,如果匹配
成功,则调用这个Servlet处理请求。

spring
org.springframework.web.servlet.DispatcherServlet

publishContext
false


contextConfigLocation
classpath:config/spring-servlet.xml

1

9.2 ContextLoaderListener 和和 DispatcherServlet 初始化上下文关系和区别:初始化上下文关系和区别:

从上图可以看出,ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,一般如:DAO层、Service层Bean;DispatcherServlet
初始化的上下文加载的Bean是只对Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,该初始化上下文只加载Web相关组
件。
注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相
同的父Spring容器(业务层,持久(dao)bean所在的容器)。

定义某一个扩展名和某一个MIME Type做对映

doc application/vnd.ms-word xls application/vnd.ms-excel 定首页的文件名称 index.jsp index.html 用来处理错误代码或异常的页面 指定一个JAVA异常类型 404 /error404.jsp java.lang.Exception /exception.jsp 用来设定JSP网页所用到的Tag Library路径 myTaglib /WEB-INF/tlds/MyTaglib.tld 定义利用JNDI取得站台可利用的资源 JNDI JDBC DataSource of shop jdbc/sample_db javax.sql.DataSource Container ........... 具体详细配置:https://blog.csdn.net/weixin_33766805/article/details/
posted @ 2021-06-07 10:01  G_Farmer  阅读(231)  评论(0)    收藏  举报