目录
应用生命周期事件
事件监听器
应用事件监听器是实现一个或多个
Servlet
事件监听器接口的类。它们是在部署
Web
应用时,实例化并注册
到
Web
容器中。它们由开发人员在
WAR
包中提供。
Servlet
事件监听器支持在
ServletContext
、
HttpSession
和
ServletRequest
状态改变时进行事件通知。
Servlet
上下文监听器是用来管理应用的资源或
JVM
级别持有的状态。
HTTP
会话监听器是用来管理从相同客户端
或用户进入
web
应用的一系列请求关联的状态或资源。
Servlet
请求监听器是用来管理整个
Servlet
请求生命
周期的状态。异步监听器是用来管理异步事件,例如超时和完成异步处理。
可以有多个监听器类监听每一个事件类型,且开发人员可以为每一个事件类型指定容器调用监听器
bean
的
顺序。
监听器类配置
提供监听器类
Web
应用的开发人员提供实现了一个或多个在
javax.servlet API
中的监听器接口的监听器类。每一个监听器
类必须有一个无参构造器。监听器类打包到
WAR
包中,或者在
WEB-INF/classes
归档项下,或者在
WEB-INF/lib
目录的一个
JAR
内部。
部署声明
监听器类在
Web
应用部署描述符中使用
listener
元素声明。它们根据类名列出的顺序就是它们被调用的顺
89
序。与其他监听器不同,
AsyncListener
类型的监听器可能仅通过编程式注册(使用一个
ServletRequest
)。
监听器注册
Web
容器创建每一个监听器类的一个实例,并在应用处理第一个请求之前为事件通知注册它。
Web
容器根
据他们实现的接口注册监听器实例,且按照它们出现在部署描述符中的顺序。在
Web
应用执行期间,监听
器按照它们注册的顺序被调用,但也有例外,例如,
HttpSessionListener.destroy
按照相反的顺序调用。
关闭时通知
在应用关闭时,监听器以它们声明时相反的顺序得到通知,且通知会话监听器在通知上下文监听器之前。
通知会话监听器
session
失效必须在通知上下文监听器关闭之前。
分布式容器
在分布式
Web
容器中,
HttpSession
实例被限到特定的
JVM
服务会话请求,且
ServletContext
对象被限定到
Web
容器所在的
JVM
。分布式容器不需要传播
Servlet
上下文事件或
HttpSession
事件到其他
JVM
。监听器
类实例被限定到每个
JVM
的每个部署描述符声明一个。
映射请求到 Servlet
使用 URL 路径
在收到客户端请求时,
web
容器确定转发到哪一个
Web
应用。选择的
Web
应用必须具有最长的上下文路径
匹配请求
URL
的开始。当映射到
Servlet
时,
URL
匹配的一部分是上下文。
Web
容器接下来必须用下面描述的路径匹配步骤找出
servlet
来处理请求。
用于映射到
Servlet
的路径是请求对象的请求
URL
减去上下文和路径参数部分。下面的
URL
路径映射规则
按顺序使用。使用第一个匹配成功的且不会进一步尝试匹配:
1.
容器将尝试找到一个请求路径到
servlet
路径的精确匹配。成功匹配则选择该
servlet
。
2.
容器将递归地尝试匹配最长路径前缀。这是通过一次一个目录的遍历路径树完成的,使用‘
/
’字符作为
路径分隔符。最长匹配确定选择的
servlet
。
3.
如果
URL
最后一部分包含一个扩展名(如
.jsp
),
servlet
容器将视图匹配为扩展名处理请求的
Servlet
。
扩展名定义在最后一部分的最后一个‘
.
’字符之后。
4.
如果前三个规则都没有产生一个
servlet
匹配,容器将试图为请求资源提供相关的内容。如果应用中定义
了一个“
default
”
servlet
,它将被使用。许多容器提供了一种隐式的
default servlet
用于提供内容。
容器必须使用区分大小写字符串比较匹配。
映射规范
在
web
应用部署描述符中,以下语法用于定义映射:
■ 以‘
/
’字符开始、以‘
/*
’后缀结尾的字符串用于路径匹配。
■ 以‘
*.
’开始的字符串用于扩展名映射。
■ 空字符串“”是一个特殊的
URL
模式,其精确映射到应用的上下文根,即,
http://host:port/<context-root>/
请求形式。在这种情况下,路径信息是‘
/
’且
servlet
路径和上下文路径是空字符串(“”)。
■ 只包含“
/
”字符的字符串表示应用的“
default
”
servlet
。在这种情况下,
servlet
路径是请求
URL
减去上
下文路径且路径信息是
null
。
■ 所以其他字符串仅用于精确匹配。
如果一个有效的
web.xml
(在从
fragment
和注解合并了信息后)包含人任意的
url-pattern
,其映射到多个
servlet
,那么部署将失败。
隐式映射
如果容器有一个内部的
JSP
容器,
*.jsp
扩展名映射到它,允许执行
JSP
页面的要求。该映射被称为隐式映
92
射。如果
Web
应用定义了一个
*.jsp
映射,它的优先级高于隐式映射。
Servlet
容器允许进行其他的隐式映射,只要显示映射的优先。例如,一个
*.shtml
隐式映射可以映射到包含
在服务器上的功能。
安全
介绍
web
应用包含的资源可以被多个用户访问。这些资源常常不受保护的遍历,开放网络如
Internet
。在这样的
环境,大量的
web
应用将有安全需求。
尽管质量保障和实现细节可能会有所不同,但
servlet
容器有满足这些需求的机制和基础设施,共用如下一
些特性:
■
身份认证:
表示通信实体彼此证明他们具体身份的行为是被授权访问的。
■
资源访问控制:
表示和资源的交互是受限于集合的用户或为了强制完整性、保密性、或可用性约束的程
序。
■
数据完整性:
表示用来证明信息在传输过程中没有被第三方修改。
■
保密或数据隐私:
表示用来保证信息只对以授权访问的用户可用。
部署描述文件
本章指定的
Java™Servlet
规范
3.0
版要求
Web
容器支持部署描述文件。部署描述文件表达了应用开发人员、
应用集成人员和
Web
应用部署人员之间的元素和配置信息。
对于
Java Servlet 2.4
和以后的版本,部署描述文件在
XML
模式文档中定义。
部署描述文件元素
所有
servlet
容器的
Web
应用程序部署描述文件需要支持以下类型的配置和部署信息:
■
ServletContext
初始化参数
■
Session
配置
■
Servlet
声明
■
Servlet
映射
■
应用程序生命周期监听器类
■
过滤器定义和过滤器映射
■
MIME
类型映射
■
欢迎文件列表
■
错误页面
■
语言环境和编码映射
■
安全配置,包括
login-config
,
security-constraint
,
security-constraint
,
security-role-ref
和
run-as