关于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模式 |
listener | Servlet2.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的映射,服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。通过使用url-pattern可以指定更改缺省URL为多个URL。
<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>