部署描述符
<?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_3_0.xsd"
[metadata-complete="true|false"]
version="3.0">
</web-app>
说明:
- xsi:schemaLocation 属性指定了模式文档的位置,以便可以进行验证。
- version 属性指定了Servlet规范的版本。
- metadata-complete 可选属性,指定部署描述符是否是完整的,若值为true,则Servlet/JSP容器将忽略Servlet注解,若值为false或不存在,则类容器必须检查类文件的Servlet注解,并扫描web fragments文件。
- web-app元素是文档的根元素,并且可以具有如下子元素
- Servlet声明
- Servlet映射
- ServletContext初始化参数
- 会话配置
- 监听器类
- 过滤器定义和映射
- MIME类型映射
- 欢迎文件列表
- 错误页面
- JSP特定的设置
- JNDI设置
context-param
可用 context-param 元素传值给 ServletContext 。这些值可以被任何 Servlet / JSP页面读取。
context-param 元素由名称/值对构成,并可以通过调用 ServletContext 的 getInitParameter 方法来读取。可以定义多个 context-param 元素,每个参数名在本应用中必须唯一。ServletContext.getInitParameterNames() 方法会返回所有的参数名称。
每个 context-param 元素必须包含一个 param-name 元素和一个 param-value 元素。param-name 定义参数名,而 param-value 定义参数值。另有一个可选的元素,即 description 元素,用来描述参数。
下面是 context-param 元素的两个例子:
<context-param>
<param-name>name1</param-name>
<param-value>value1</param-value>
</context-param>
<context-param>
<param-name>name2</param-name>
<param-value>value2</param-value>
<description>the param's description</description>
</context-param>
distributable
若定义了 destributable 元素,则表明应用程序已部署到分布式的 Servlet / JSP 容器。distributable 元素必须是空的。例如,下面是一个 distributable 例子:
<distributable/>
error-page
error-page元素包含一个 HTTP 错误代码与资源路径或 Java 异常类型与资源路径之间的映射关系。error-page 原定义容器在特定 HTTP 错误或异常时应返回的资源路径。error-page 元素由如下成分构成:
- error-code,指定一个 HTTP 错误代码
- exception-type,指定 Java 的异常类型(全路径名称)
- location,指定要被显示的资源位置
下面的配置告诉 Servlet / JSP 容器,当出现 HTTP 404时,显示位于应用目录下的 error.html 页面。
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
下面的配置告诉 Servlet / JSP 容器,当发生 ServletException 时,显示 exception.html 页面。
<error-page>
<exception-type>javax.servlet.ServletException</exception-type>
<location>/exception.html</location>
</error-page>
filter
filter指定一个 Servlet 过滤器,改元素至少包含一个 filter-name 元素和一个 filter-class 元素。此外,它也可以包含以下元素:icon、display-name、descriptin、init-param 以及 async-supported
- filter-name 元素定义了过滤器的名称。过滤器名称必须全局唯一。
- filter-class 元素指定过滤器类的全路径名称。可由 init-param 元素来配置过滤器的初始参数(类似于<context-param>),一个过滤器可以由多个 init-param 。
<filter>
<filter-name>Upper Case Filter</filter-name>
<filter-class>com.example.UpperCaseFilter</filter-class>
</filter>
<filter>
<filter-name>ImageFilter</filter-name>
<filter-class>com.example.ImageFilter</filter-class>
<init-param>
<param-name>frequency</param-name>
<param-value>1909</param-value>
</init-param>
<init-param>
<param-name>resolution</param-name>
<param-value>1024</param-value>
</init-param>
</filter>
filter-mapping
过滤器映射元素指定过滤器要被映射到的一个或多个资源。过滤器可以被映射到 servlet 或者 URL 模式。将过滤器映射到 servlet 会致使过滤器对该 servlet 产生作用。将过滤器映射到 URL 模式,则会使其对所有 URL 模式匹配的资源进行过滤。过滤的顺序与过滤器映射元素在部署描述符中的顺序一致。
过滤器映射元素中包含一个 filter-name 元素和一个 URL 模式元素或者 servlet-name 元素。
filter-name 元素的值必须与利用 filter 元素声明的某一个过滤器名称相匹配
下面的例子中是两个过滤器元素和与之对应的过滤器映射元素。
<filter>
<filter-name>Logging Filter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<servlet-name>FirstServlet</servlet-name>
</filter-mapping>
<filter>
<filter-name>Security Filter</filter-name>
<filter-class>com.example.SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Security Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
listener
listener元素用来注册一个监听器,其子元素 listener-class 包含监听器类的全路径名。如下是一个实例:
<listener>
<listener-class>com.example.AppListener</listener-class>
</listener>
locale-encoding-mapping-list 和 locale-encoding-mapping
local-encoding-mapping-list 包含了一个或多个 locale-encoding-mapping 元素。每个 locale-encoding-mapping 定义了 locale 以及编码的映射,分别用 locale 以及 encoding 元素定义,locale 元素的值必须是定义在 ISO 639 中的语言编码,如 en,或是采用 “语言编码_国家编码” 格式,如 en_US。其中,国家编码值必须定义在 ISO 3166 中。
如下是一个示例:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>ja</locale>
<encoding>Shift_JIS</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
login-config
login-config 元素包括 auth-method、realm-name 以及 form-login-config 元素,每个元素都是可选的。
- auto-config 元素定义了认证方式,可选值为 BASIC、DIGEST、FORM、CLIENT-CERT。
- realm-name 元素定义了用于 BASIC 以及 DIGEST 认证方式的 realm 名称。
- form-login-config 则定义了用于 FORM 认证方式的登陆页面和失败页面。若没有采用 FORM 认证方式,则该元素被忽略。form-login-config 元素包括 form-login-page 和 form-error-page 两个子元素。
- form-login-page 配置了显示登陆页面的资源路径,路径为应用目录的相对路径,且必须以 “/” 开始;
- form-error-page 则配置了登陆失败时显示错误页面的资源路径,同样,路径为应用目录的相对路径,且必须以 “/” 开始。
BASIC 认证示例:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Members Only</realm-name>
</login-config>
DIGEST 认证示例:
<login-config>
<auth-method>DIGEST</auth-method>
<realm-name>Manager Only</realm-name>
</login-config>
FORM 认证示例:
<login-config>
<auth-method>FORM</autn-method>
<form-login-config>
<form-login-page>/loginForm.jsp</form-login-page>
<form-error-paga>/errorPage.jsp</form-error-page>
</form-login-config>
</login-config>
mime-mapping
mime-mapping 元素用来映射一个MIME类型到一个扩展名,它由一个 extension 元素和一个 mime-type 元素组成,示例如下:
<mime-mapping>
<extension>txt</entension>
<mime-type>text/plain</mime-type>
</mime-mapping>
security-constraint
security-constraint 元素允许对一组资源进行限制访问。
security-constraint 元素有如下子元素:一个可选的 display-name 元素,一个或多个 web-resource-collection 元素,可选的 auth-constraint 元素和一个可选的 user-date-constraint 元素。
- web-resource-collection 元素标识了一组需要进行限制访问的资源集合。这里,你可以定义 URL 模式和所限制的 HTTP 方法。如果没有定义 HTTP 方法,则表示应用于所有的 HTTP 方法。web-resource-collection 元素包含一个 web-resource-name 元素,一个可选的 description 元素、零个或多个 url-pattern 元素,以及零个或多个 http-method 元素。
- web-resource-name 元素指定受保护资源的名称。
- http-method 元素指定 HTTP 方法,如GET,POST,TRACE。
- auth-constraint 元素指明哪些角色可以访问受限制的资源集合。如果没有指定,则应用于所有的角色。auth-constraint 元素包含一个可选的 description 元素、零个或多个 role-name 元素。role-name 元素指定角色名称。
- user-date-constraint 元素用于指示在客户端和 Servlet/JSP 容器传输的数据是否受保护。user-date-constraint 元素包含一个可选的 description 元素和一个 transport-guarantee 元素。
- transport-guarantee 元素的取值范围有:NONE、INTEGRAL 或 CONFIDENTIAL 。NONE 表示该应用程序不需要安全传输保障。
- INTEGRAL 意味着服务器和客户端之间的阿数据在传输的过程中不能被篡改。
- CONFIDENTIAL 意味着必须加密传输数据。大多数情况下,安全套接字层(SSL)会被应用于 INTEGRAL 或 CONFIDENTIAL。
- transport-guarantee 元素的取值范围有:NONE、INTEGRAL 或 CONFIDENTIAL 。NONE 表示该应用程序不需要安全传输保障。
<security-constraint>
<web-resource-collection>
<web-resource-name>Members Only</web-resource-name>
<url-pattern>/members/*</url-pattern>
</web-rescource-collection>
<auth-constraint>
<role-name>payingMember</role-name>
</auth-constraint>
</security-constraint>
<loging-config>
<auth-method>Digest</auth-method>
<realm-name>Digest Access Authentication</realm-name>
</loging-confif>
security-role
security-role 元素声明用于安全限制的安全角色。这个元素有一个可选的 description 元素和 role-name 元素。
<security-role>
<role-name>payingMember</role-name>
</security-role>
Servlet
Servlet 元素用来配置 Servlet,包括如下子元素:
- 一个可选的 icon 元素
- 一个可选的 description 元素
- 可选的 display-name 元素
- 一个 servlet-name 元素
- 一个 servlet-class 元素或一个 jsp-file 元素
- 零个或更多的 init-param 元素
- 一个可选的 load-on-startup 元素
- 可选的 run-as 元素
- 可选的 enabled 元素
- 可选的 async-supported 元素
- 可选的 multipart-config 元素
- 零个或多个 security-role-ref 元素
一个 Servlet 元素至少必须包含一个 servlet-name 元素和一个 servlet-class 元素,或者一个 servlet-name 元素和一个 jsp-file 元素
servlet-name 元素定义的 Servlet 名称在应用程序中必须是唯一的。
servlet-class 元素指定的类名为全路径名。
jsp-file 元素指定 JSP 页面的路径,该路径是应用程序的相对路径,必须以“/”开始。
init-param 的子元素可以用来传递一个初始参数给 Servlet。init-param 元素的构成同 context-param。
可以使用 load-on-startup 元素在 Servlet / JSP 容器启动时自动加载 Servlet。加载一个 Servlet 是指实例化 Servlet 和调用它的 init 方法。使用此元素可以避免由于加载 Servlet 而导致对第一个请求的响应延迟。如果改元素指定了 jsp-file 元素,则 JSP 文件被编译成 Servlet ,并加载该 Servlet。
load-on-startup 可以指定一个整数值来指定加载顺序。例如,若果有两个 Servlet 且都包含一个 load-on-startup 元素,则值小的 Servlet 优先加载。若没有指定值或值为符数,则由 Web 容器决定如何加载。若两个 Servlet 具有相同的 load-on-startup 值,则加载 Servlet 的顺序不能确定。
run-as 用来覆盖调用 EJB 的安全标识。角色名时当前 Web 应用程序定义的安全角色之一。
security-role-ref 元素映射在调用 Servlet 的 isUserInRole 方法时角色名到应用程序定义的安全角色。security-role-ref 元素包含一个可选的 description 元素,一个 role-name 元素和一个 role-link 元素。
role-link 元素用于安全角色映射到一个已定义的安全角色,必须包含一个定义在 security-role 元素中的安全角色。
async-supported 元素是一个可选的元素,其值可以时 True 或 False。它表示 Servlet 是否支持异步处理。
enabled 元素也是一个可选的元素,其值可以是 True 或 False。若设置此元素为 False, 则禁用这个 Servlet
例如,映射安全角色“PM”与角色名字 “payingMember” 的配置如下:
<security-role-ref>
<role-name>PM</role-name>
<role-link>payingMember</role-link>
</security-role-ref>
这样,若属于 payingMember 角色的用户调用 Servlet 的 isUserInRole (“payingMember”)方法,则结果为真。
下面时 Servlet 的两个例子:
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.brainysoftware.UploadServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SecurityServlet</servlet-name>
<servlet-class>com.brainysoftware.SecureServlet</servlet-class>
<load-on-startup>20</load-on-startup>
</servlet>
(待续)