1、Web.xml作用
Web.xml是Java Web项目中的一个配置文件,主要用于配置首页、Filter、Listener、Servlet等。
tomcat在部署启动web应用时,会解析加载${CATALINA_HOME}/conf目录下所有web应用通用的web.xml,
然后解析加载web应用目录中的WEB-INF/web.xml。如果没有WEB-INF/web.xml文件,
tomcat会输出找不到的消息,但仍然会部署并使用web应用程序,因此,这个web.xml并不是必要的,
不过通常最好还是让每一个上线的web应用程序都有一个自己的WEB-INF/web.xml。
conf/web.xml文件中的设定会应用于所有的web应用程序,
而web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序本身。
2.web.xml配置详解
web.xml加载过程
1、启动Web应用时,容器(tomcat)会去读取web.xml文件的和 两个节点;
2、容器创建一个ServletContext(上下文);
3、容器以的name作为键,value作为值,将其转化为键值对,存入ServletContext。
4、容器创建中的类实例,根据配置的class类路径来创建监听,
在监听中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,
系统调用Listener的该方法。
5、容器初始化,web.xml中可以定义多个 filter,
初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,
当请求资源匹配多个 filter-mapping 时,
filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的;
6、容器初始化,servlet 同 filter 类似。
那么,web项目启动时,可以知道web.xml文件各个节点的加载顺序:
context-param -> listener -> filter -> servlet
Web.xml中定义的元素
相应元素配置:
(1)Web应用图标
/images/app_small.gif
/images/app_large.gif
(2)Web 应用名称
App Name
(3)Web 应用描述
This is a app disciption.
(4)上下文初始化参数
ContextParameter
test
It is a test parameter.
context-param元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可以随时随地访问它。在servlet里面可以通过getServletContext().getInitParameter(“context/param”)得到。
Spring配置文件:
在spring配置中,必须需要
,而
可有可无,如果在web.xml中不写配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在param-value里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,比如在business-client工程中,我们采用了自定义配置方式:
contextConfigLocation
/WEB-INF/spring-configuration/*.xml
org.springframework.web.context.ContextLoaderListener
案例1:部署在同一容器中的多个Web项目,要配置不同的webAppRootKey,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,如下:
webAppRootKey
business.root
webAppRootKey
pubbase.root
这样就不会出现冲突了。就可以在运行时动态地找到项目路径,在log4j.properties配置文件中可以按下面的方式使用webapp.root:log4j.appender.file.File={webapp.root}:log4j.appender.file.File=webapp.root:log4j.appender.file.File={webapp.root}/WEB-INF/logs/sample.log,就可以在运行时动态地找出项目的路径。
(5)过滤器配置
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://********
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介绍:
Filter可认为是Servlet的一种“加强版”,主要用于对用户请求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的一些常见应用场合:
认证Filter
日志和审核Filter
图片转换Filter
数据压缩Filter
密码Filter
令牌Filter
触发资源访问事件的Filter
XSLT Filter
媒体类型链Filter
Filter可负责拦截多个请求或响应;一个请求或响应也可被多个Filter拦截。创建一个Filter只需两步:
1)创建Filter处理类
2)Web.xml文件中配置Filter
Filter必须实现javax.servlet.Filter接口,在该接口中定义了三个方法:
1)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进行后处理。
Filter配置:
Filter配置与Servlet的配置非常相似,需要配置两部分:配置Filter名称和Filter拦截器URL模式。区别在于Servlet通常只配置一个URL,而Filter可以同时配置多个请求的URL。配置Filter有两种方式:
在Filter类中通过Annotation进行配置。
在web.xml文件中通过配置文件进行配置。
我们使用的是web.xml这种配置方式,下面重点介绍内包含的一些元素。
用于指定Web容器中的过滤器,可包含
。
:用来定义过滤器的名称,该名称在整个程序中都必须唯一。
:指定过滤器类的完全限定的名称,即Filter的实现类。
:为Filter配置参数,与具有相同的元素描述符和。
:用来声明Web应用中的过滤器映射,过滤器被映射到一个servlet或一个URL模式。这个过滤器的和必须具有相同的,指定该Filter所拦截的URL。过滤是按照部署描述符的出现的顺序执行的。
(6)
用于设置容器的session参数,
比如: 用于指定http session的失效时间。
120
session-timeout用来指定默认的会话超时时间间隔,以分钟为单位。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时.
(7)监听器配置
listener.SessionListener
7.1、Listener介绍:
为web应用程序定义监听器,监听器用来监听各种事件,比如:Application和Session事件,所有的监听器按照相同的方式定义,功能取决去它们各自实现的接口,常用的Web事件接口有如下几个:
ServletContextListener:用于监听Web Application的启动和关闭;
ServletContextAttributeListener:用于监听ServletContext范围(Application)内属性的改变;
ServletRequestListener:用于监听用户的请求;
ServletRequestAttributeListener:用于监听ServletRequest范围(Request)内属性的改变;
HttpSessionListener:用于监听用户session的开始和结束;
HttpSessionAttributeListener:用于监听HttpSession范围(Session)内属性的改变。
主要用于监听Web应用事件,其中有两个比较重要的Web应用事件:Application的启动和停止(starting up or shutting down)和Session的创建和失效(created or destroyed)。
application启动事件发生在应用第一次被Servlet容器装载和启动的时候;停止事件发生在Web应用停止的时候。Session创建事件发生在每次一个新的Session创建的时候,类似地Session失效事件发生在每次一个Session失效的时候。为了使用这些Web应用事件做些有用的事情,我们必须创建和使用一些特殊的“监听类”。它们是实现了以下两个接口中任何一个接口的简单java类:javax.servlet.ServletContextListener或javax.servlet.http.HttpSessionListener,如果想让你的类监听Application的启动和停止事件,你就得实现ServletContextListener接口;想让你的类去监听Session的创建和失效事件,那你就得实现HttpSessionListener接口。
7.2、Listener配置:
配置Listener只要向Web应用注册Listener实现类即可,无序配置参数之类的东西,因为Listener获取的是Web应用ServletContext(Application)的配置参数。为Web应用配置Listener的两种方式:
使用@WebListener修饰Listener实现类即可。
在web.xml文档中使用进行配置。
我们选择web.xml这种配置方式,只有一个元素指定Listener的实现类,如下所示:
org.springframework.web.context.ContextLoaderListener
这里的用于Spring的加载,Spring加载可以利用ServletContextListener实现,也可以采用load-on-startup Servlet 实现,但是,当需要用到bean时,加载顺序是先加载后加载,则中初始化操作中的bean为null;所以,如果中要使用到bean,此时就可以根据加载顺序 ,将spring的加载改成Listener的方式。
采用load-on-startup Servlet 实现:
context
org.springframework.web.context.ContextLoaderServlet
1
利用ServletContextListener实现:
org.springframework.web.context.ContextLoaderListener 我们选择了第二种方式,在J2EE工程中web服务器启动的时候最先调用web.xml,上面这段配置的意思是加载spring的监听器,其中ContextLoaderListener的作用就是启动Web容器时,自动装配applicationContext.xml的配置信息,执行它所实现的方法。(8)Servlet配置
8.1、Servlet介绍:
Servlet通常称为服务器端小程序,是运行在服务器端的程序,用于处理及响应客户的请求。Servlet是个特殊的java类,继承于HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外,HttpServlet有两个方法:
init(ServletConfig config):创建Servlet实例时,调用该方法来初始化Servlet资源。
destroy():销毁Servlet实例时,自动调用该方法来回收资源。
通常无需重写init()和destroy()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法,如果重写了init()方法,应在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完成某些资源的回收,比如关闭数据库连接,才需要重写destory方法()。
Servlet的生命周期,创建Servlet实例有两个时机:
客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet。
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实例。
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
/
8.2、Servlet具体配置:
为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:
在Servlet类中使用@WebServlet Annotation进行配置。
在web.xml文件中进行配置。
我们用web.xml文件来配置Servlet,需要配置
和
。
用来声明一个Servlet。
元素和
元素的用法相同。
元素与
元素具有相同的元素描述符,可以使用子元素将初始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:
java.lang.String.getInitParameter(java.lang.String name),用于获取初始化参数。ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletConfig是取得当前Servlet的配置参数,而ServletContext是获取整个Web应用的配置参数。
8.2.1 、
:用来定义servlet的名称,该名称在整个应用中必须是惟一的。
:用来指定servlet的完全限定的名称。
8.2.2、
如果load-on-startup元素存在,而且也指定了jsp-file元素,则JSP文件会被重新编译成Servlet,同时产生的Servlet也被载入内存。
的内容可以为空,或者是一个整数。这个值表示由Web容器载入内存的顺序。
举个例子:如果有素两个Servlet元素都含有
子元,则子元素值较小的Servlet将先被加载。如果子元素值为空或负值,则由Web容器决定什么时候加载Servlet。如果两个Servlet的子元素值相同,则由Web容器决定先加载哪一个Servlet。1表示启动容器时,初始化Servlet。
8.2.3、
:Servlet的名字,唯一性和一致性,与元素中声明的名字一致。
:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。将URL模式映射到某个Servlet,即该Servlet处理的URL。
8.2.4、加载Servlet的过程
容器的Context对象对请求路径(URL)做出处理,去掉请求URL的上下文路径后,按路径映射规则和Servlet映射路径()做匹配,如果匹配成功,则调用这个Servlet处理请求。
8.3、DispatcherServlet在web.xml中的配置:
business
org.springframework.web.servlet.DispatcherServlet
publishContext
false
1
配置Spring MVC,指定处理请求的Servlet
注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相同的父Spring容器(业务层,持久(dao)bean所在的容器)。
(9)MIME类型配置
html
text/html
(10)欢迎页配置
index.jsp
index.html
index.htm
(11)配置错误页面
方法1:通过错误码来配置error-page
404
/404.jsp
上面的配置当系统发生404错误时,页面将跳转到错误处理页面404.jsp
方法2:通过异常类型配置error-page
java.lang.NullException
/error.jsp
上面的配置当系统发生java.lang.NullException异常时,页面将跳转到错误处理页面error.jsp
(12)TLD配置
http://jakarta.apache.org/tomcat/debug-taglib
/WEB-INF/jsp/debug-taglib.tld
http://jakarta.apache.org/tomcat/debug-taglib
/WEB-INF/pager-taglib.tld
(13)资源管理对象配置
jms/StockQueue
(14)资源工厂配置
mail/Session
javax.mail.Session
Container
配置数据库连接池就可在此配置:
JNDI JDBC DataSource of shop
jdbc/sample_db
javax.sql.DataSource
Container
(15)安全限制配置
Example Security Constraint
Protected Area
/jsp/security/protected/*
DELETE
GET
POST
PUT
tomcat
role1
(16)登陆验证配置
FORM
Example-Based Authentiation Area
/jsp/security/protected/login.jsp
/jsp/security/protected/error.jsp
(17)安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
tomcat
(18)Web环境参数:env-entry元素声明Web应用的环境项
minExemptions
1
java.lang.Integer
(19)EJB 声明
Example EJB reference
ejb/Account
Entity
com.mycompany.mypackage.AccountHome
com.mycompany.mypackage.Account
(20)本地EJB声明
Example Loacal EJB reference
ejb/ProcessOrder
Session
com.mycompany.mypackage.ProcessOrderHome
com.mycompany.mypackage.ProcessOrder
借鉴:Web.xml文件详解_weixin_44458879的博客-CSDN博客