web.xml文件是Java Web项目中的一个配置文件,主要用于配置欢迎页、Filter、Listener、Servlet等,但并不是必须的,一个Java Web项目没有web.xml文件也是照样能跑起来的。

1. web.xml各版本区别

  首先来看一下Tomcat官网的Servlet和JSP规范规范与的Apache Tomcat版本之间的对应关系,如图:

  从中可以清晰的看到不同版本的web.xml文件要使用相应版本的Tomcat服务器。

  下面是各版本的web.xml配置的头部声明:

servlet 2.3

<?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>

servlet 2.4

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"version="2.4">
</web-app>

servlet 2.5

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"version="2.5">
</web-app>

servlet 3.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">
</web-app>

servlet 3.1

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"version="3.1">
</web-app>

servlet 4.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
</web-app>

  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。

  ${CATALINA_HOME}/conf/web.xml文件中的设定会应用于所有的web应用程序,而web应用程序的WEB-INF/web.xml中的设定只应用于该应用程序本身。

2. web.xml配置详解

2.1 java web项目启动加载顺序

  (1)启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml的两个节点:

      <listener></listener> 和 <context-param></context-param>;

  (2)容器创建一个ServletContext(上下文);

  (3)容器将<context-param></context-param>转化为键值对,并交给ServletContext;

  (4)容器创建<listener></listener>中的类实例,即创建监听;

  (5)容器初始化<filter></filter>,web.xml中可以定义多个 filter,初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的;

  (6)容器初始化<servlet></servlet>, servlet 同 filter 类似。

  那么,web项目启动时,可以知道web.xml文件各个节点的加载顺序:context-param -> listener -> filter -> servlet。

2.2 web.xml中定义的元素

<web-app> <display-name></display-name>定义了WEB应用的名字 <description></description> 声明WEB应用的描述信息 <context-param></context-param> context-param元素声明应用范围内的初始化参数。 <filter></filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。 <filter-mapping></filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。 <listener></listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知。Listener元素指出事件监听程序类。 <servlet></servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。<servlet-mapping></servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName.                        但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。 <session-config></session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。 可通过使用HttpSession的setMaxInactiveInterval方法                       明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。 <mime-mapping></mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。 <welcome-file-list></welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。 <error-page></error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。 <taglib></taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。 <resource-env-ref></resource-env-ref>声明与资源相关的一个管理对象。 <resource-ref></resource-ref> 声明一个资源工厂使用的外部资源。 <security-constraint></security-constraint> 制定应该保护的URL。它与login-config元素联合使用 <login-config></login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。 <security-role></security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。                    分别地声明角色可使高级IDE处理安全信息更为容易。 <env-entry></env-entry>声明Web应用的环境项。 <ejb-ref></ejb-ref>声明一个EJB的主目录的引用。 <ejb-local-ref></ejb-local-ref>声明一个EJB的本地主目录的应用。
</web-app> 

相应元素配置:

(1)Web应用图标

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

(2)Web 应用名称

<display-name>App Name</display-name>

(3)Web 应用描述

<disciption>This is a app disciption.</disciption>

(4)上下文初始化参数

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

  在servlet里面可以通过getServletContext().getInitParameter("context/param")得到。

(5)过滤器配置

<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>

(6)监听器配置

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

(7)Servlet配置

  基本配置:

<servlet> <servlet-name>test</servlet-name> <servlet-class>TestServlet</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern>
</servlet-mapping> 

  高级配置:<servlet>

<servlet-name>test</servlet-name> <servlet-class>TestServlet</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> <!-- 当Web应用启动时,装载Servlet的次序当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet. 当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它 --><load-on-startup>1</load-on-startup></servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>   

(8)会话超时配置(单位为分钟)

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

(9)MIME类型配置

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

(10)欢迎页配置

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

(11)配置错误页面

  方法1:通过错误码来配置error-page

<error-page> <error-code>404</error-code> <location>/404.jsp</location>
</error-page> 

  上面的配置当系统发生404错误时,页面将跳转到错误处理页面404.jsp

  方法2:通过异常类型配置error-page

<error-page> <exception-type>java.lang.NullException</exception-type> <location>/error.jsp</location>
</error-page> 

  上面的配置当系统发生java.lang.NullException异常时,页面将跳转到错误处理页面error.jsp

(12)TLD配置

<taglib> <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri> <taglib-location>/WEB-INF/jsp/debug-taglib.tld</taglib-location>
</taglib>

  如果MyEclipse一直在报错,应该把<taglib>放到<jsp-config>中
<jsp-config> <taglib> <taglib-uri>http://jakarta.apache.org/tomcat/debug-taglib</taglib-uri> <taglib-location>/WEB-INF/pager-taglib.tld</taglib-location> </taglib>
</jsp-config> 

(13)资源管理对象配置

<resource-env-ref> <resource-env-ref-name>jms/StockQueue</resource-env-ref-name>
</resource-env-ref> 

(14)资源工厂配置

<resource-ref> <res-ref-name>mail/Session</res-ref-name> <res-type>javax.mail.Session</res-type> <res-auth>Container</res-auth>
</resource-ref> 

  配置数据库连接池就可在此配置:

<resource-ref> <description>JNDI JDBC DataSource of shop</description> <res-ref-name>jdbc/sample_db</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth>
</resource-ref> 

(15)安全限制配置

<security-constraint> <display-name>Example Security Constraint</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <url-pattern>/jsp/security/protected/*</url-pattern> <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> </web-resource-collection> <auth-constraint> <role-name>tomcat</role-name> <role-name>role1</role-name> </auth-constraint>
</security-constraint> 

(16)登陆验证配置

<login-config> <auth-method>FORM</auth-method> <realm-name>Example-Based Authentiation Area</realm-name> <form-login-config> <form-login-page>/jsp/security/protected/login.jsp</form-login-page> <form-error-page>/jsp/security/protected/error.jsp</form-error-page> </form-login-config>
</login-config> 

(17)安全角色:security-role元素给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。

<security-role> <role-name>tomcat</role-name>
</security-role> 

(18)Web环境参数:env-entry元素声明Web应用的环境项

<env-entry> <env-entry-name>minExemptions</env-entry-name> <env-entry-value>1</env-entry-value> <env-entry-type>java.lang.Integer</env-entry-type>
</env-entry>

(19)EJB 声明

<ejb-ref> <description>Example EJB reference</decription> <ejb-ref-name>ejb/Account</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>com.mycompany.mypackage.AccountHome</home> <remote>com.mycompany.mypackage.Account</remote>
</ejb-ref> 

(20)本地EJB声明

<ejb-local-ref> <description>Example Loacal EJB reference</decription> <ejb-ref-name>ejb/ProcessOrder</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home>com.mycompany.mypackage.ProcessOrderHome</local-home> <local>com.mycompany.mypackage.ProcessOrder</local>
</ejb-local-ref> 

3. 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><display-name>Sample Application</display-name><description>This is a sample application</description><!--context-param元素声明应用范围内的初始化参数。--><context-param></context-param><filter><!--过滤器名,可以随便取,当web应用中有多个过滤器时不允许重名.--><filter-name>SampleFilter</filter-name><!--具体的过滤器的类的完整的包名+类名。注意:不能写错了。否则容器不能正确的实例化过滤器--><filter-class>mypack.SampleFilter</filter-class><init-param><!-- 参数名 --><param-name>initParam1</param-name><!-- 参数值 --><param-value>2</param-value></init-param></filter><!-- Define the SampleFilter Mapping --><filter-mapping><!--过滤器名,注意要和上面的<filter-name>里的名字一样。--><filter-name>SampleFilter</filter-name><!-- 指定过滤器负责过滤的URL。这里指定了*.jsp表示在访问任何一个jsp页面时都会先使用mypack.SampleFilter过滤器进行过滤。如果写成login.jsp.则只有在访问login.jsp时才会调用该过滤器进行过滤。--><url-pattern>*.jsp</url-pattern></filter-mapping><servlet><!-- Servlet名字,可以随便取,有多个Servlet时不允许重名--><servlet-name>SampleServlet</servlet-name><!--指定实现这个Servlet的类。完整的包名+类名--><servlet-class>mypack.SampleServlet</servlet-class><!--定义Servlet的初始化参数(包括参数名和参数值)一个<servlet>元素里可以有多个<init-param>元素。在Servlet类中通过ServletConfig类的来访问这些参数。--><init-param><!-- 参数名 --><param-name>initParam1</param-name><!-- 参数值 --><param-value>2</param-value></init-param><!--指定当前Web应用启动时装载Servlet的次序。当这个数>=0时,容器会按数值从小到大依次加载。如果数值<0或没有指定,容器将载Web客户首次访问这个Servlet时加载。--><load-on-startup>1</load-on-startup></servlet><!-- Define the SampleServlet Mapping --><servlet-mapping><!--必须和<servlet>里的<servlet-name>内容一样--><servlet-name>SampleServlet</servlet-name><!--指定访问这个Servlet的URL。这里给出的是对于整个Web应用的相对URL路径。--><url-pattern>/sample</url-pattern></servlet-mapping><session-config><!--设 定HttpSession的生命周期。这里以分钟计算。下面的设定指明Session在最长不活动时间为10分钟。过了这个时间,Servlet容器将它 作为无效处理。注意这里和程序里指定的计数单位不同,程序里是以秒为单位。<session-config>只有<session- timeout>这个元素--><session-timeout>10</session-timeout></session-config><!— 配置会话侦听器,class表示一个HttpSessionListener或 HttpSessionActivationListener 或 HttpSessionAttributeListener或HttpSessionBindingListener的实现类。该节点允许多个 --><listener><listener-class>com.cn.SessionListenerImpl</listener-class></listener><!-- 在 用户访问Web应用时,如果仅给出Web应用的根访问URL,没有指定具体的文件名,容器会调用<weblcome-file- list> 元素里指定的文件清单。<welcome-file-list>里允许有多个<welcome-file>元 素,每个元素代表一个文件。容器会先找第一文文件件是否存在,如果存在这把这个文件返回个客户,不再进行其他文件的查找。如果不存在则找第二个文件,依次 类推。如果所有文件都不存在,则跑出404错误--><welcome-file-list><welcome-file>login.jsp</welcome-file><welcome-file>index.htm</welcome-file></welcome-file-list><!-- 设置Web应用引用的自定义标签库。下面的代码定义了一个/mytaglib标签库,它对应的TLD文件为/WEB-INF/mytaglib.tld --><taglib><taglib-uri>/mytaglib</taglib-uri><taglib-location>/WEB-INF/mytaglib.tld</taglib-location></taglib><!-- 如果Web应用访问了由Servlet容器管理的某个JNDI Resource必须在这里声明对JNDI Resource的引用 --><resource-ref><!-- 对应用资源的说明 --><description>DB Connection</description><!-- 指定所引用资源的JNDI名字 --><res-ref-name>jdbc/sampleDb</res-ref-name><!-- 指定所引用资源的类名字 --><res-type>javax.sql.DataSource</res-type><!-- 指定管理所引用资源的Manager, 它有两个可选值:Container和Application.Container表示由容器来创建和管理Resource,Application表示由Web应用来管理和创建Resource --><res-auth>Container</res-auth></resource-ref><security-constraint><web-resource-collection><!-- 这个名字是必须的,由工具使用,别的地方不使用 --><web-resource-name>my application</web-resource-name><!-- 指定要受约束的资源,至少有一个。可以有多个. --><uri-pattern>/*</uri-pattern><!-- 描 述了度可与URL模式指定的资源哪些方法是受约束的,如果没有<http-method>元素,表示任何角色的人都无法访问任何http的方 法  。这里放置了GET方法,表示只有GET方法是受约束的。其他任何角色的人可以访问POST和其他的方法。但不能访问GET方法。--><http-method>GET</http-method></web-resource-collection><!-- 如果没有<auth-constraint>表示所有角色都能访问GET方法,如果是<auth-constraint/>表示任何角色都不能访问GET方法 --><auth-constraint><!-- 可选的。表示哪些角色能够在指定的资源上调用受约束的方法。这里表示只有拥有Admin和Member角色的人能够访问GET方法<security-role>>里的<role-name>值一样 --><role-name>Admin</role-name><role-name>Member</role-name></auth-constraint></security-constraint><!-- 将指定的角色映射到web.xml里 --><security-role><description>The role that is required to log into the my Application</description><!-- 以下的角色和tomcat-users.xml里的<tomcat-users>里的<role rolename=""/>里的rolename属性值对应 --><role-name>Guest</role-name><role-name>Admin</role-name><role-name>Member</role-name></security-role><!-- 如果要想进行认证,必须有<login-config>--><login-config><!-- 认证方式。有4种:BASIC:基本。 DIGEST:摘要。CLIENT-CERT:客户证书(能提供最高强度的认证)。FORM:表单 --><auth-method>FORM</auth-method><realm-name>Tomcat Servet Configuraton Form-Based Authentication Area</realm-name><form-login-config><form-login-page>/login.jsp</form-login-page><form-error-page>/error.jsp</form-error-page></form-login-config></login-config>
</web-app>

转载于:https://www.cnblogs.com/jing99/p/10914953.html

Spring web.xml详解相关推荐

  1. Web.xml详解(转)

    这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一.            Web.xml详解: (一)  web.xml加载过程(步骤) 首 ...

  2. Spring Web MVC详解

    Spring Web MVC详解 原创 2016年03月23日 10:55:57 标签: 421 编辑 删除 2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java ...

  3. Stuts的Web.xml 详解

    1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...

  4. xml发生错误_WEB之web.xml详解

    web.xml的作用 web.xml,一个Tomcat工程中最重要的配置文件.web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器.监听器.Servlet等等.我试了一下,没有w ...

  5. 《深入理解 Spring Cloud 与微服务构建》第十六章 Spring Boot Security 详解

    <深入理解 Spring Cloud 与微服务构建>第十六章 Spring Boot Security 详解 文章目录 <深入理解 Spring Cloud 与微服务构建>第十 ...

  6. 全面的Spring Boot配置文件详解

    全面的Spring Boot配置文件详解 Spring Boot在工作中是用到的越来越广泛了,简单方便,有了它,效率提高不知道多少倍.Spring Boot配置文件对Spring Boot来说就是入门 ...

  7. SpringMVC基础--spring MVC配置详解

    牧涛 --<-<-<@态度决定一切→_→... 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 171  文章- 3  评论- 79  spring MVC配置详解 现在主流的 ...

  8. Spring启动过程详解

    Spring启动过程详解 前言 spring容器启动过程 AnnotationConfigApplicationContext 有参数构造方法 无参数构造 AnnotatedBeanDefinitio ...

  9. Spring Security应用详解(集成SpringBoot)

    Spring Security应用详解 集成SpringBoot 工作原理 认证流程 授权流程 集成SpringBoot 1.Spring Boot介绍 Spring Boot是一套Spring的快速 ...

最新文章

  1. 一些大佬博客里的个签
  2. 服务器装什么系统可以模拟器多开,安卓模拟器多开哪个最好 流畅不卡、省资源、群控刷机都有...
  3. Vsftp与PAM虚拟用户
  4. windows共享内存
  5. etlgr是什么服务器_ETL是指什么 - 金融行业 - ITPUB论坛-中国专业的IT技术社区
  6. typeof关键字简介
  7. nullnullUVa 10066 - The Twin Towers(LCS水题)
  8. VS2010下开发WebApi 基本步骤
  9. MATLAB 绘制对数图操作陷阱 hold on的位置
  10. 寂静岭2java攻略_寂静岭2攻略
  11. Windows上安装ubantu
  12. Windows Edge浏览器右键菜单透明、难以分辨问题的解决办法
  13. python语言属于科学计算语言吗_python语言属于( )
  14. B S架构 服务器虚拟化,基于KVM的B/S架构虚拟化管理系统
  15. 深聊性能测试,从入门到放弃之: Windows系统性能监控(一) 性能监视器介绍及使用。
  16. Android cec设备,Android和HDMI CEC
  17. 千万人未确认未确认未确认请问让我去我去任务确认
  18. 买内存条需要知道的信息
  19. 【牛客网 - 华为机试 - HJ4 字符串分割】
  20. Spoon Virtual Application Studio 绿色便携软件制作工具

热门文章

  1. java国际化---native2ascii.exe 的使用方法
  2. android.view.InflateException: Binary XML file line #34: Error inflating class
  3. T-SQL 之 多表联合更新
  4. Solr Facet 查询
  5. 在线富文本编辑器FckEditor配置(.Net Framework 3.5)
  6. 菜鸟学SSH(八)——Hibernate对象的三种状态
  7. 推荐一款生成SQL插入语句的软件
  8. Markdown用法
  9. 是否使用有硼砂的眼用品
  10. ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项