一个很详细的web.xml讲解

1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。 

2、紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。 

3、容器将<context-param>转换为键值对,并交给servletContext。 

4、容器创建<listener>中的类实例,创建监听器。 

一、Web.xml的作用?

作用是用来初始化配置信息的。

比如:Welcome页面、servletservlet-mappingfilterlistener、启动加载级别等。

二、Web.xml是每个J2EE工程所必需的吗?

当你的工程不需要上述配置时,就不需要web.xml来配置你的Application

三、节点元素Load-on-startup

Load-on-startup 元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存在,那么容器会在该servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。  

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是: 

标记容器是否在启动的时候就加载这个servlet。 

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet; 

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。 

正数的值越小,启动该servlet的优先级越高。 

四、加载顺序

首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:ServletContext -> listener -> filter -> servlet

        同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet

        对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。

        servlet 同 filter 类似,此处不再赘述。

       由此,可以看出,web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

五、常用标签及其功能

1. Schema文件

每个xml文件都有定义它书写规则的Schema文件,也就是说javaEE的定义web.xml所对应的xml Schema文件中定义了多少种标签元素,web.xml中就可以出现它所定义的标签元素,也就具备哪些特定的功能。web.xml的模式文件是由Sun 公司定义的,每个web.xml文件的根元素为<web-app>中,必须标明这个web.xml使用的是哪个模式文件。如: 

[html]   view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3. xmlns="http://java.sun.com/xml/ns/javaee"  --命名空间,类似包名,因为xml的标签可自定义,需要命名空间来区分  
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" --xml遵循的标签规范  
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6. <a href="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd\" "="">http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" --用来定义xmlschema的地址,也就是xml书写时需要遵循的语法,两部分组成,前面部分就是命名空间的名字,后面是xsd(xmlschema)的地址  
  7. >  
  8. </web-app>  

    web.xml的模式文件中定义的标签并不是定死的,模式文件也是可以改变的,一般来说,随着web.mxl模式文件的版本升级,里面定义的功能会越来越复杂,标签元素的种类肯定也会越来越多,但有些不是很常用的,我们只需记住一些常用的并知道怎么配置就可以了。 

2. 关于欢迎页面

访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中指定欢迎页。但 web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂起来后,web.xml的确有非常大用处,所以,默认创建的动态web工程在WEB-INF文件夹下面都有一个web.xml文件。

指定欢迎页面,例如: 

[html]   view plain  copy
  1. <welcome-file-list>  
  2.      <welcome-file>index.jsp</welcome-file>   
  3.      <welcome-file>index1.jsp</welcome-file>   
  4.    </welcome-file-list>  
PS在用户访问Web应用时,如果仅给出Web应用的根访问URL,没有指定具体的文件名,容器会调用<weblcome-file- list> 元素里指定的文件清单。<welcome-file-list>里允许有多个<welcome-file>元 素,每个元素代表一个文件。显示时按顺序从第一个找起,如果第一个存在,就显示第一个,后面的不起作用。如果第一个不存在,就找第二个,以此类推,如果所有文件都不存在,则抛出404错误。

3. 命名与定制URL我们可以为ServletJSP文件命名并定制URL,其中定制URL是依赖命名的,命名必须在定制URL前。下面拿servlet来举例: 

(1)、为Servlet命名: 

[html]   view plain  copy
  1. <servlet>   
  2.      <servlet-name>servlet1</servlet-name>   
  3.      <servlet-class>org.whatisjava.TestServlet</servlet-class>   
  4. </servlet>  
(2) 、为 Servlet 定制 URL  
[html]   view plain  copy
  1. <servlet-mapping>   
  2.      <servlet-name>servlet1</servlet-name>   
  3.      <url-pattern>*.do</url-pattern>   
  4. </servlet-mapping>  

4. 详解web.xml

[html]   view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   
  3. "http://java.sun.com/dtd/web-app_2_3.dtd">   
  4. <web-app>   
  5. <display-name>Sample Application</display-name>   
  6. <description>This is a sample application</description>  
  7. <!-- 在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得 -->  
  8. <context-param>   <!-- 用来设定web站台的环境参数 -->  
  9.     <param-name>my_param</param-name>  
  10.     <param-value>hello</param-value>  
  11. </context-param>  
  12. <filter>   
  13. <!–过滤器名,可以随便取,当web应用中有多个过滤器时不允许重名.–>   
  14. <filter-name>SampleFilter</filter-name>   
  15. <!–具体的过滤器的类的完整的包名+类名。注意:不能写错了。否则容器不能正确的实例化过滤器–>   
  16. <filter-class>mypack.SampleFilter</filter-class>   
  17. <init-param>   
  18. <!– 参数名 –>   
  19. <param-name>initParam1</param-name>   
  20. <!– 参数值 –>   
  21. <param-value>2</param-value>   
  22. </init-param>   
  23. </filter>   
  24. <!– Define the SampleFilter Mapping –>   
  25. <filter-mapping>   
  26. <!–过滤器名,注意要和上面的<filter-name>里的名字一样。–>   
  27. <filter-name>SampleFilter</filter-name>   
  28. <!– 指定过滤器负责过滤的URL。这里指定了*.jsp表示在访问任何一个jsp页面时都会先使用mypack.SampleFilter过滤器进行过滤。如果写成login.jsp.则只有在访问login.jsp时才会调用该过滤器进行过滤。–>   
  29. <url-pattern>*.jsp</url-pattern>   
  30. </filter-mapping>   
  31. <servlet>   
  32. <!– Servlet名字,可以随便取,有多个Servlet时不允许重名–>   
  33. <servlet-name>SampleServlet</servlet-name>   
  34. <!–指定实现这个Servlet的类。完整的包名+类名–>   
  35. <servlet-class>mypack.SampleServlet</servlet-class>   
  36. <!–定义Servlet的初始化参数(包括参数名和参数值)一个<servlet>元素里可以有多个<init-param>元素。在Servlet类中通过ServletConfig类的来访问这些参数。   
  37. >   
  38. <init-param>   
  39. <!– 参数名 –>   
  40. <param-name>initParam1</param-name>   
  41. <!– 参数值 –>   
  42. <param-value>2</param-value>   
  43. </init-param>   
  44. <!–指定当前Web应用启动时装载Servlet的次序。当这个数>=0时,容器会按数值从小到大依次加载。如果数值<0或没有指定,容器将载Web客户首次访问这个Servlet时加载。–>   
  45. <load-on-startup>1</load-on-startup>   
  46. </servlet>   
  47. <!– Define the SampleServlet Mapping –>   
  48. <servlet-mapping>   
  49. <!–必须和<servlet>里的<servlet-name>内容一样–>   
  50. <servlet-name>SampleServlet</servlet-name>   
  51. <!–指定访问这个Servlet的URL。这里给出的是对于整个Web应用的相对URL路径。–>   
  52. <url-pattern>/sample</url-pattern>   
  53. </servlet-mapping>   
  54. <session-config>   
  55. <!–设 定HttpSession的生命周期。这里以分钟计算。下面的设定指明Session在最长不活动时间为10分钟。过了这个时间,Servlet容器将它 作为无效处理。注意这里和程序里指定的计数单位不同,程序里是以秒为单位。<session-config>只有<session- timeout>这个元素–>   
  56. <session-timeout>10</session-timeout>   
  57. </session-config>   
  58. <!— 配置会话侦听器,class表示一个HttpSessionListener或 HttpSessionActivationListener 或 HttpSessionAttributeListener或 HttpSessionBindingListener的实现类。该节点允许多个 –>   
  59. <listener>   
  60. <listener-class>com.cn.SessionListenerImpl</listener-class>   
  61. </listener>   
  62. <!– 在 用户访问Web应用时,如果仅给出Web应用的根访问URL,没有指定具体的文件名,容器会调用<weblcome-file- list> 元素里指定的文件清单。<welcome-file-list>里允许有多个<welcome-file>元 素,每个元素代表一个文件。容器会先找第一文文件件是否存在,如果存在这把这个文件返回个客户,不再进行其他文件的查找。如果不存在则找第二个文件,依次 类推。如果所有文件都不存在,则跑出404错误–>   
  63. <welcome-file-list>   
  64. <welcome-file>login.jsp</welcome-file>   
  65. <welcome-file>index.htm</welcome-file>   
  66. </welcome-file-list>   
  67. <!– 设置Web应用引用的自定义标签库。下面的代码定义了一个/mytaglib标签库,它对应的TLD文件为/WEB-INF/mytaglib.tld –>   
  68. <taglib>   
  69. <taglib-uri>/mytaglib</taglib-uri>   
  70. <taglib-location>/WEB-INF/mytaglib.tld</taglib-location>   
  71. </taglib>   
  72. <!– 如果Web应用访问了由Servlet容器管理的某个JNDI Resource必须在这里声明对JNDI Resource的引用 –>   
  73. <resource-ref>   
  74. <!– 对应用资源的说明 –>   
  75. <description>DB Connection</description>   
  76. <!– 指定所引用资源的JNDI名字 –>   
  77. <res-ref-name>jdbc/sampleDb</res-ref-name>   
  78. <!– 指定所引用资源的类名字 –>   
  79. <res-type>javax.sql.DataSource</res-type>   
  80. <!– 指定管理所引用资源的Manager, 它有两个可选值:Container和Application.Container表示由容器来创建和管理Resource,Application表示由Web应用来管理和创建Resource –>   
  81. <res-auth>Container</res-auth>   
  82. </resource-ref>   
  83. <security-constraint>   
  84. <web-resource-collection>   
  85. <!– 这个名字是必须的,由工具使用,别的地方不使用 –>   
  86. <web-resource-name>my application</web-resource-name>   
  87. <!– 指定要受约束的资源,至少有一个。可以有多个. –>   
  88. <uri-pattern>/*</uri-pattern>   
  89. <!– 描 述了度可与URL模式指定的资源哪些方法是受约束的,如果没有<http-method>元素,表示任何角色的人都无法访问任何http的方 法  。这里放置了GET方法,表示只有GET方法是受约束的。其他任何角色的人可以访问POST和其他的方法。但不能访问GET方法。–>   
  90. <http-method>GET</http-method>   
  91. </web-resource-collection>   
  92. <!– 如果没有<auth-constraint>表示所有角色都能访问GET方法,如果是<auth-constraint/>表示任何角色都不能访问GET方法 –>   
  93. <auth-constraint>   
  94. <!– 可选的。表示哪些角色能够在指定的资源上调用受约束的方法。这里表示只有拥有Admin和Member角色的人能够访问GET方法   
  95. <security-role>>里的<role-name>值一样 –>   
  96. <role-name>Admin</role-name>   
  97. <role-name>Member</role-name>   
  98. </auth-constraint>   
  99. </security-constraint>   
  100. <!– 将指定的角色映射到web.xml里 –>   
  101. <security-role>   
  102. <description>The role that is required to log into the my Application   
  103. </description>   
  104. <!– 以下的角色和tomcat-users.xml里的<tomcat-users>里的<role rolename=""/>里的rolename属性值对应 –>   
  105. <role-name>Guest</role-name>   
  106. <role-name>Admin</role-name>   
  107. <role-name>Member</role-name>   
  108. </security-role>   
  109. <!– 如果要想进行认证,必须有<login-config>>   
  110. <login-config>   
  111. <!– 认证方式。有4种:BASIC:基本。 DIGEST:摘要。CLIENT-CERT:客户证书(能提供最高强度的认证)。FORM:表单 –>   
  112. <auth-method>FORM</auth-method>   
  113. <realm-name>   
  114. Tomcat Servet Configuraton Form-Based Authentication Area   
  115. </realm-name>   
  116. <form-login-config>   
  117. <form-login-page>/login.jsp</form-login-page>   
  118. <form-error-page>/error.jsp</form-error-page>   
  119. </form-login-config>   
  120. </login-config>  
  121. <error-page> <!-- 用来处理错误代码或异常的页面,有三个子元素: -->  
  122.     <error-code>404</error-code> <!-- 指定错误代码 -->  
  123.     <exception-type>java.lang.Exception</exception-type> <!-- 指定一个JAVA异常类型 -->  
  124.     <location>/error404.jsp</location> <!-- 指定在web站台内的相关资源路径 -->  
  125. </error-page>  
  126. <mime-mapping>        <!-- 定义某一个扩展名和某一个MIME Type做对映,包含两个节点 -->  
  127.     <extension>doc</extension>  <!-- 扩展名的名称 -->  
  128.     <mime-type>application/vnd.ms-word</mime-type>  <!-- MIME格式 -->  
  129. </mime-mapping>   
  130. <mime-mapping>  
  131.     <extension>xls</extension>  
  132.     <mime-type>application/vnd.ms-excel</mime-type>  
  133. </mime-mapping>  
  134. </web-app>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值