Servlet中web.xml文件的配置及注意事项(一)

时间:2023-01-18 13:22:22

     本文是对web应用中web.xml的配置说明,希望对以后的servlet开发有所帮助。

    

       本文使用的服务器是Tomcat服务器,Web应用发布描述文件web.xml是在Servlet规范中定义的。web.xml存放在WEB-INF/目录下,其中一个Servlet项目中只能有一个web.xml文件。web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。

    在分析web.xml文档之前我想先说一下web.xml中根元素<web-app>各子元素的顺序问题,因为在web.xml中元素定义的先后顺序是不能颠倒的(除非在web.xml文件中使用XMLSchema),否则Tomcat服务器可能抛出SAXParseException
     
顺序如下:

                     <web-app>
                     <display-name>
                     <description>
                     <distributable>
                     <context-param>
                     <filter>
                      <filter-mapping>
                     <listener>
                     <servlet>
                     <servlet-mapping>
                     <session-config>
                     <mime-mapping>
                     <welcome-file-list>
                     <error-page>
                     <taglib>
                    <resource-env-ref>
                     <resource-ref>
                     <security-constraint>
                      <login-config>
                     <security-role>
                     <env-entry>
                     <ejb-ref>
                     <ejb-local-ref>
web.xml
中的开头几行是固定的,它定义了该文件的字符编码,XML版本以及引用的DTD文件。
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD WebApplication 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

web.xml中顶层元素为<web-app>,其他所有的子元素都必须定义在<web-app>内,

<display-name>元素定义这个web应用的名字,Java Web 服务器的Web管理工具将用这个名字来标志Web应用。

<description>元素用来声明Web应用的描述信息

<context-param>元素用来配置外部引用的,在servlet中如果要获得该元素中配置的值,context-param元素声明应用范围内的初始化参数。

String param-value =getServletContext().getInitParameter("param-name")

<filter>
        <filter-name>SampleFilter</filter-name>
       <filter-class>com.lpdev.SampleFilter</filter-class>
</filter>
<filter-mapping>
       <filter-name>SampleFilter</filter-name>
       <url-pattern>*.jsp</url-pattern>
</filter-mapping>
以上是配置了一个servlet过滤器,对于servlet容器收到的客户请求以及发出的响应结果,servlet都能检查和修改其中的信息,以上代码指名当客户请求访问Web应用中的所有JSP文件时,将触发SampleFilter过滤器工作,具体的过滤事务在由<filter-class>中指定的类来完成

 <servlet>
  <servlet-name>IncludeServlet</servlet-name>
  <servlet-class>com.lpdev.IncludeServlet</servlet-class>
  
  <init-param>
     <param-name>copyright</param-name>
     <param-value>/foot.jspf</param-value>
     <load-on-startup>1</load-on-startup>
  </init-param>
 </servlet>
配置Servlet<servlet-name>servlet的名字,<servlet-class>是实现这个Servlet的类,<init-param>定义Servlet的初始化参数(参数名和参数值),一个Servlet可以有多个<init-param>,在Servlet类中通过getInitParameter(String name)方法访问初始化参数

 <servlet-mapping>
  <servlet-name>IncludeServlet</servlet-name>
  <url-pattern>/IncludeServlet</url-pattern>
 </servlet-mapping>
配置Servlet映射,<servlet-mapping>元素用来设定客户访问某个ServletURL,这里只需给出对于整个web应用的相对的URL路径,<url-pattern>中的“/”表示开始于Web应用的根目录例如,如果你在你本地机器上使用Tomcat4.1.x,并且创建了名为“myapp”的应用程序,<url-pattern>/IncludeServlet</url-pattern>Servlet的完整web地址就是http://localhost:8080/myapp/IncludeServlet

<session-config>元素用来设定HttpSession的生命周期,该元素只有一个<session-timeout>属性,时间单位是

<welcome-file-list>当用户访问web时,如果仅仅给出web应用的Root URL,没有指定具体文件名,容器调用该配置,该元素可以包含多个<welcome-file>属性。

<taglib>元素用来设置web引用的tag library,例示定义了一个“/mytaglib”标签库,它对应的tld文件为:/WEB_INF/mytaglib.tld
<taglib>
    <taglib-url>/mytaglib</taglib-url>
   <taglib-locationg>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>

<resource-ref>如果web应用由Servlet容器管理的某个JNDI Resource,必须在web.xml中声明对这个JNDI Resource的引用。
<resource-ref>
    <description>DB Connection</description> //
说明
    <res-ref-name>jdbc/sampleDB</res-ref-name> //
引用资源的JNDI名字
    <res-type>javax.sql.DataSource</res-type> //
引用资源的类名字
    <res-auth>Container</res-auth> //
管理引用资源的Manager
</resource-ref>

<security-constraint>用来为Web应用定义安全约束
 <security-constraint>
    <web-resource-collection>//
声明受保护的web资源
      <web-resource-name>ResourceServlet</web-resource-name>//
标识受保护web资源
      <url-pattern>/ResourceServlet</url-pattern>//
指定受保护的URL路径
      <http-method>GET</http-method>//
指定受保护的方法
       <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>//
可以访问受保护资源的角色
       <description>this applies only toadmin secrity role</description>
       <role-name>admin</role-name>
    </auth-constraint>
    <user-data-constraint>
       <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
 </security-constraint>

<login-config>元素指定当Web客户访问受保护资源时,系统弹出的登陆对话框的类型。例示配置了基于表单验证的登陆界面
<login-config>
    <auth-method>FORM</auth-method>//BASIC(
基本验证法)DIGEST(摘要验证)FORM(表单验证)
    <real-name>
设定安全域的名称</realname>
    <form-login-config>
       <form-login-page>/login.jsp</form-login-page>
       <form-error-page>/error.jsp</form-error-page>
    </form-login-config>

<security-role> 指明这个 Web 应用引用的所有角色名字
<security-role>
    <description>
描述 </description>
    <role-name>admin</role-name>
</security-role>

其中,在对于一个项目中有多个Servlet的情况下,我们可以在web.xml中进行部署,其关键部分就是:

<servlet>

       <servlet-name>UseBeanServlet</servlet-name>
       <servlet-class>test.UseBeanServlet</servlet-class>
 </servlet>
 <servlet-mapping>
       <servlet-name>Test</servlet-name>
       <url-pattern>/Test</url-pattern>
 </servlet-mapping>

它们之间可以在文档中先把<servlet></servlet>罗列出来,然后按上面的次序<servlet-mapping></servlet-mapping>一一对应,也可以让它们成对出现。这样就可以实现多servlet的部署了。

请记住:XML元素不仅是大小写敏感的,而且定义它们的次序也很重要。例如,web-app元素内所有servlet元素必须位于所有servlet-mapping元素(之前,而且还要位于过滤器或文档相关的元素(如果有的话)之前。类似地,servlet的servlet-name子元素也必须出现在servlet-class之前。