关于web.xml,你知道多少?

关于web.xml,你知道多少?

本篇主要用于介绍用于web开发中的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>
    ...
</web-app>
  • DOCTYPE 用于指定文档的类型定义。 web-app为根元素,PUBLIC意味着DTD文件可以被公开使用,该文档由Sun Microsystems, Inc.维护。所描述的文档类型是DTD Web Application 2.3,而且DTD是用英文书写的。http://java.sun.com/dtd/web-app_2_3.dtd为具体的DTD文档地址。
  • web-app为具体的web项目相关配置。
web-app 子元素

web-app (icon?, 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*)

问号(?)表示子元素是可选的,而且只能出现一次,星号(*)表示子元素可在部署描述符中出现零次或多次。
在servlet2.3中,子元素必须按照DTD文档规定的顺序出现,如servlet必须在servlet-mapping之前声明,而在servlet2.4中,顺序并不重要。

各个标签的作用说明如下:

标签说明
icon指定该应用用于IDE和GUI工具的图像文件,包括small-icon和large-icon两个子标签。(small-icon中定义16*16的jpeg或者gif图片,large-icon中定义32*32的jpg或gif文件)
display-name定义应用的名称,用于tomcat应用管理中显示的名称。
description应用描述
distributable空标签用于指定是否分布式处理
context-param声明应用范围内的初始化参数
filter过滤器,包含过滤器名称和javax.servlet.Fileter实现类
filter-mapping声明指定过滤器的映射,可以映射到一个Servlet或者URL模式
listenerServlet2.3中提供对程序的监听功能,主要包括对Session和ServletContext的创建、修改和删除事件的监听。
servlet声明Servlet
servlet-mapping声明Servlet的映射,服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。通过使用url-pattern可以指定更改缺省URL为多个URL。
session-config声明session失效时间,另可通过编程实现,HttpSession的setMaxInactiveInterval方法设定回话超时值。
mime-mapping声明指定扩展名文件与mine类型的映射关系
welcome-file-list声明首页文件名称,按照定义顺序查找。
error-page声明指定HTTP状态码或者异常类型所对应的页面
taglib声明JSP标记库文件位置,不需要挨个修改JSP中的声明。
resource-env-ref声明与资源相关的一个管理对象,如JNDI等。
resource-ref声明资源工厂所需的外部资源
security-constraint允许不通过编程就可以限制对某个资源的访问
login-config用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权
security-role指定用于安全约束中的安全角色的声明
env-entry指定应用环境入口
ejb-ref指定EJB的home接口的引用
ejb-local-ref声明对EJB的本地home的引用

注:下面的描述中(*)表示可声明多次,(?)表示可以声明一次。

  • icon
<icon>
    <small-icon>(?)16*16的GIF或者JPEG图像文件地址(以“/”开头的完整路径)</small-icon>
    <large-icon>(?)32*32的GIF或者JPEG图像文件地址(以“/”开头的完整路径)</large-icon>
</icon>
  • display-name 定义应用的名称,用于tomcat应用管理中显示的名称
<display-name>应用名称</display-name>
  • description 应用描述
<description>应用描述</description>
  • distributable 空标签用于指定是否分布式处理
<distributable/>
  • context-param 声明应用范围内的初始化参数
<context-param>
    <param-name>参数名称</param-name>
    <param-value>参数值</param-value>
    <description>(?)描述</description>
</context-param>

示例:

<?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>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/resources/spring*.xml</param-value>
    </context-param>
</web-app>
  • filter 过滤器,包含过滤器名称和javax.servlet.Fileter实现类,在请求和响应被Servlet处理之前和之后,可以使用过滤器对其进行处理。
<filter>
    <icon>(?)</icon>
    <display-name>(?)</display-name>
    <description>(?)</description>
    <filter-name>过滤器名称</filter-name>
    <filter-class>javax.servlet.Filter的实现类</filter-class>
</filter>

示例:

<?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>
    <filter>
        <filter-name>TestFilter</filter-name>
        <filter-class>com.meepai.TestFilter</filter-class>
    </filter>
</web-app>
  • filter-mapping 声明指定过滤器的映射,可以映射到一个Servlet或者URL模式
<filter-mapping>
    <filter-name>过滤器名称,必须指定一个存在的过滤器</filter-name>
    <!-- 注意使用URL模式或者Servlet方式 -->
    <url-pattern>(?)过滤指定的URL地址,支持通配符</url-pattern>
    <servlet-name>(?)过滤指定的Servlet</servlet-name>
</filter-mapping>

示例:

<?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>
    <filter>
        ...
    </filter>
    <filter-mapping>
        <filter-name>TestFilter</filter-name>
        <servlet-name>TestServlet</servlet-name>
    </filter-mapping>
</web-app>
  • listener| Servlet2.3中提供对程序的监听功能,主要包括对Session和ServletContext的创建、修改和删除事件的监听。
<listener>
    <listener-class>实现相应接口的监听类</listener-class>
</listener>

示例:

<?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>
    <listener>
        <listener-class>com.meepai.TestSessionListener</listener-class>
    </listener>
</web-app>
  • servlet| 声明Servlet
<servlet>
    <icon>(?)</icon>
    <display-name>(?)</display-name>
    <description>(?)</description>
    <servlet-name>Servlet名称</servlet-name>
    <!-- 选择指定jsp-file或者servlet-class -->
    <servlet-class>指定servlet的完全限定名</servlet-class>
    <jsp-file>指定jsp文件作为servlet来服务,该路径为以“/”开头的完整路径</jsp-file>
    <!-- (*)servlet初始化参数 -->
    <init-param>
        <param-name>参数名</param-name>
        <param-value>参数值</param-value>
        <description>描述</description>
    </init-param>
    <!-- (?) -->
    <load-onstartup>
        表示WEB容器载入该Servlet的顺序;数值小的优先加载;0或者负值由容器决定加载顺序;相同取值由容器决定加载顺序。
    </load-onstartup>
    <!-- (?)如果定义run-as元素,将重写用于调用WEB应用中servlet所设定的EJB的安全身份 -->
    <run-as>
        <description>(?)</description>
        <role-name>当前WEB应用中定义的一个安全角色名称</role-name>
    </run-as>
    <!-- (*)定义servlet中isUserInRole(String name)调用的角色名与WEB应用安全角色之间的映射 -->
    <security-role-ref>
        <description>(?)</description>
        <role-name>角色名</role-name>
        <role-link>将安全角色引用链接到已定义的安全角色(该角色必须是已经在security-role元素中定义的角色)</role-link>
    </security-role-ref>
</servlet>

示例:

<?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>
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.meepai.TestServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
</web-app>
<servlet-mapping>
    <servlet-name>Servlet名称</servlet-name>
    <url-pattern>指定URL地址,支持通配符</url-pattern>
</servlet-mapping>

示例:

<?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>
    <servlet>
        ...
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/prj/*</url-pattern>
    </servlet-mapping>
</web-app> 
  • session-config 声明session失效时间,另可通过编程实现,HttpSession的setMaxInactiveInterval方法设定回话超时值。
<session-config>
    <session-timeout>设置回话超时</session-timeout>
</session-config>

示例:

<?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>
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
</web-app> 
  • mime-mapping | 声明指定扩展名文件与mine类型的映射关系
<mime-mapping>
    <extension>扩展名</extension>
    <mime-type>mime类型</mime-type>
</mime-mapping>

示例:

<?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>
    <mime-mapping>
        <extension>txt</extension>
        <mime-type>text/pain</mime-type>
    </mime-mapping>
</web-app> 
  • welcome-file-list 声明首页文件名称,按照定义顺序查找。
<welcome-file-list>
    <welcome-file>(*)首页文件名称</welcome-file>
</welcome-file-list>

示例:

<?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>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app> 
  • error-page 声明指定HTTP状态码或者异常类型所对应的页面
<error-page>
    <!-- 选择状态码或者异常类型方式处理出错页面 -->
    <error-code>状态码</error-code>
    <exception-type>异常类型</exception-type>
    <location>WEB应用中的资源相对于应用目录的路径</location>
</error-page>

示例:

<?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>
    <error-page>
        <error-code>500</error-code>
        <location>/500.html</location>
    </error-page>
</web-app> 
  • taglib 声明JSP标记库文件位置,不需要挨个修改JSP中的声明。
    如果使用2.4的版本,该元素需要声明在jsp-config中。
<taglib>
    <taglib-uri>用于WEB应用中的标记库的URI,与WEB-INF目录对应</taglib-uri>
    <taglib-location>标记库描述符(TLD)文件地址</taglib-location>
</taglib>

示例:

<?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>
    <taglib>
        <taglib-uri>/WEB-INF/test.tld</taglib-uri>
        <taglib-location>/WEB-INF/test.tld</taglib-location>
    </taglib>
</web-app> 
  • resource-env-ref 声明与资源相关的一个管理对象,如JNDI等。
<resource-env-ref>
    <description>(?)</description>
    <resource-env-ref-name>资源的名称 相对于java:comp/env >>context</resource-env-ref-name>
    <resource-env-ref-type>当web应用查找该资源的时候,返回的Java类名的全称</resource-env-ref-type>
</resource-env-ref>

示例:
首先在meta-inf下新建Context.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>  
<Context>  
<!--对于javax.sql.DataSource资源类型 Tomcat容器提供了默认factory org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory -->  
<Resource name="jdbc/mssql" auth="Container"  
          type="javax.sql.DataSource" driverClassName="net.sourceforge.jtds.jdbc.Driver"  
          url="jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=test"  
          username="sa" password="123456" >  
</Resource> 
<!-- 测试资源 -->
<Resource name="bean/testResource" auth="Container"  
          type="com.meepai.TestResource"  factory="org.apache.naming.factory.BeanFactory" projectName="testProj">  
</Resource>  
</Context> 

然后在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>
    <!-- 自定义资源引用 -->
    <resource-env-ref>
        <resource-env-ref-name>bean/testResource</resource-env-ref-name>
        <resource-env-ref-type>com.meepai.TestResource</resource-env-ref-type>
    </resource-env-ref>
    <!-- DataSource引用 -->
    <resource-env-ref>
        <resource-env-ref-name>jdbc/mssql</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
</web-app> 

那么,在Servlet中就可以通过以下方式查找和使用资源:

try {
    Context ctx = new InitalContext();
    Context envCtx = (Context)ctx.lookup("java:/comp/env");
    TestResource testResource = (TestResource)envCtx.lookup("bean/TestResource");
    DataSource ds = (DataSource)envCtx.lookup("jdbc/mssql");
} catch(Exception e){
    ...
}
  • resource-ref | 声明资源工厂所需的外部资源
<resource-ref>
    <description>(?)<description>
    <res-ref-name>资源工厂引用名,该名称是一个与java:/comp/env上下文对应的JNDI名称。</res-ref-name>
    <res-auth>servlet代码通过编程注册到资源管理器,或者是容器将代表servlet注册到资
源管理器。该元素的值必须为Application或Container。</res-auth>
    <res-type>资源类型,java类的完全限定名。</res-type>
    <res-sharing-scope>(?)是否可以共享通过给定资源管理器连接工厂引用获得的连接。该元
素的值必须为Shareable(默认值)或Unshareable。</res-sharing-scope>
</resource-ref>

示例

<?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>
    <resource-ref>
        <description>数据源<description>
        <res-ref-name>jdbc/testDB</res-ref-name>
        <res-auth>Container</res-auth>
        <res-type>javax.sql.DataSource</res-type>
    </resource-ref>
</web-app> 

#说明:关于数据源的配置,可以通过三种方式去实现。包括在tomcat的server.xml中配置全局的JNDI数据库资源,META-INF/Context.xml中配置项目独立的JNDI数据库资源,以及以上的在web.xml中的配置方法。

  • security-constraint 允许不通过编程就可以限制对某个资源的访问
<security-constraint>
    <display-name>(?)</display-name>
    <!-- (+)标识需要限制访问的资源子集,可以定义URL模式和HTTP方法。 -->
    <web-resource-collection>
        <web-resource-name>受保护资源相关联的名称</web-resource-name>
        <description>(?)</description>
        <url-pattern>(*)URL模式约束</url-pattern>
        <http-method>(*)如果不存在HTTP方法,就将安全约束应用于所有的方法。</http-method>
    </web-resource-collection>
    <!-- (?)于指定可以访问该资源集合的用户角色。 -->
    <auth-constraint>
        <description>(?)</description>
        <role-name>(*)安全角色的名称</role-name>
    </auth-constraint>
    <!-- (?)用来显示怎样保护在客户端和Web容器之间传递的数据。 -->
    <user-data-constraint>
        <description>(?)</description>
        <transport-guarantee>NONE(不需要传输保证),INTEGAL(服务器和客户端之间必须以某种方式发送数据,而且传送中不能改变),CONFIDENTIAL(意味着传输的数据必须是加密的数据)</transport-guarantee>
    </user-data-constraint>
</security-constraint>
  • login-config 用login-config元素来指定服务器应该怎样给试图访问受保护页面的用户授权

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

<security-role>
    <description>(?)</description>
    <role-name></role-name>
</security-role>
  • env-entry 声明Web应用的环境项
<env-entry>
    <description>(?)</description>
    <env-entry-name>Web应用环境入口的名称,该名称是一个与java:/comp/env对应的JNDI名称。</env-entry-name>
    <env-entry-value>Web应用环境入口的值。该值必须是一个字符串类型的值,并且对于指定类型的
构造函数是有效的,或者是Character类型。</env-entry-value>
    <env-entry-type>环境入口值的完全限定的Java类型,包括java.lang.Boolean,Byte,Character,String,Short,Integer,Long,Float,Double</env-entry-type>
</env-entry>
  • ejb-ref 指定EJB的home接口的引用
<ejb-ref>
    <description>(?)</description>
    <ejb-ref-name>EJB引用的名称。EJB引用是servlet环境中的一个入口,与java:/comp/env对应。</ejb-ref-name>
    <ejb-ref-type>引用的EJB的期望类型。这个值必须是Entity或Session。</ejb-ref-type>
    <home>包含EJB的home接口的完全限定的名称。</home>
    <remote>包含EJB的remote接口的完全限定的名称。</remote>
    <ejb-link>(?)指定EJB 引用被链接到另一个EJB。</ejb-link>
</ejb-ref>
  • ejb-local-ref | 声明对EJB的本地home的引用
<ejb-local-ref>
    <description>(?)</description>
    <ejb-ref-name>EJB引用的名称</ejb-ref-name>
    <ejb-ref-type>引用的EJB的期望类型</ejb-ref-type>
    <local-home>EJB本地home接口的完全限定的名称</local-home>
    <local>EJB本地接口的完全限定的名称</local>
    <ejb-link>(?)</ejb-link>
</ejb-local-ref>
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值