J2EE1.4新特性之Servlet2.4新特性 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
在J2EE1.4最新的Servl 功能。
|
et 2.4版中,加入了一些新的功
|
能,下面我们介绍其中主要的常用
|
1、XML Schema定义Web查询部署描述文件 |
Servlet 2.3之前的版 示:
|
本使用DTD作为部署描述文件的
|
定义,其web.xml的格式为如下所
|
<?xml version="1.0" encoding="IS0-8859-1"?> |
PUBLIC "-//sunMi
|
crosystems,Inc.//DTD WebAppl
|
ication 2.3f//EN"
|
"http://java.sun.com/j2ee/dtds/web-app_2.3.dtd"> |
Servlet 2.4版首次使用XML Schema web.xml语法。同时XML Schema提供了更
|
定义作为部署描述文件,这样Web容器更容易校验 好的扩充性,其web.xml中的格式如下所示:
|
<?xml version="1.0" encoding="UTF-8"?> |
<web-app version="2.4" xm
|
lns="http://java.sun.com/xml/ns/j2ee"
|
xmlns:work
|
flow="http://www.workflow.co
|
m"
|
xmins:xsi="http://www.
|
w3.org/2001/XMLSchema-instance"
|
xsi:schemaLocati
|
on="http://java.sun.com/xml/
|
ns/j2ee
|
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> |
虽然上面显示两个版本 方法和Servlet 2.3版大致
|
的开头几行有差别,Servlet 2. 相同。
|
4版程序web.xml中Web构件的设置
|
Servlet 2.4版在事件 rvletRequestListener,Se 管理和控制与ServletReque 监听器的结构。
|
监听器中加入了ServletRequest rvletRequestAttributeListene st动作有关的事件。下面的程序
|
监听器,包括:Se r和其他相关类。这些类可以用来 显示了一个典型的ServletRequest
|
import javax.setvlet.ServletContext; |
import javax.servlet.Servlet
|
RequestListener;
|
import javax.servlet.Servlet
|
RequestAttributeListener;
|
import javax.ser
|
vlet.http.HttpServletRequest
|
;
|
public final cla
|
ss RequestListener implemen
|
ts SerVletRequestListener,
|
ServletRequestAttributeListe
|
ner,ServletContextListener{
|
public void requestl
|
nitialized(javax.servlet.Ser
|
vletRequestEvent event){
|
public void attribut
|
eAdded(javax.servlet.Servlet
|
RequestAttributeEvent event){
|
public void attributeRemoved(jav {
|
ax.servlet.ServletRequestAttributeEvent event)
|
public void attribut event){
|
eReplaced(javax.servlet.Serv
|
letRequestAttributeEvent
|
public void attributeDestroyed(j event){
|
avax.servlet.ServletRequestAttributeEvent
|
Servlet 2.4版的Web程 以根据请求分发器(request 可以通过在web.xml中使用
|
序增强了filter和request disp dispatcher)所使用的方法有条 元素设定过滤器作用的条件(下
|
atcher的配合功能,这样过滤器可 件地对Web请求进行过滤。编程者 图1):
|
·只有当request直接来自客户,过滤器才生效,对应为REQUEST条件。 |
·只有当request被一 ),对应称为FORWARD条件。
|
个请求分发器使用forward()方
|
法转到一个Web构件时(采用或定义
|
·类似地,只有当request被一个请 用或定义),对应称为INCLUDE条件。
|
求分发器使用include()方法转到一个Web构件时(采
|
·只有当request被一 对应称为ERROR条件。
|
个请求分发器使用“错误信息页
|
”机制方法转到一个Web构件时,
|
·第五种过滤器作用的条件可以是上面四种条件的组合。 |
下面的程序中的定义了当客户请求/i 来过滤请求。但是如果到达URL为/icsamp dispatcher转发过来的,这个过滤器不工
|
csamples/* 样式的URL时,Security Filter会被用 les/* 的Web构件的请求是从一个request 作。
|
<filter-name>Security Filter</filter-name> |
<url-pattern>/icsamples/*</url-pattern> |
如果使用下面的程序设置,在中加入 dispatcher使用include()方法包括Reque 直接从客户发来,或request dispatcher 。
|
INCLUDE,Security Filter只有在被一个request stRecorderServlet时才会工作。在其他情况(如请求 使用forward方法)下,Security Filter都不会工作
|
<fliter-name>Security Filter</filter-name> |
<servlet-name>RequestRecorderServlet</servlet-name> |
<dispatcher>INCLUDE</dispatcher> |
下面的程序设置定义了
|
Security Filter当request由客
|
户直接发出或request
|
dispatcher使用forward方法时能工作。 |
<filter-name>Security Filter</filter-name> |
<url-pattern>/icsamples/*</uri-pattern> |
<dispatcher>FORWARD</dispatcher> |
<dispatcher>REQUEST</dispatcher> |
程序例6显示了一个在 的参数"type",决定如何处 可以向URL为/admin或/cont 。过滤器和Web资源的关系 ”,ReqDispatcherServlet ispatcherFilterIcd会被使 ERROR”ReqDispatcherServ 被使用,因为在定义了ERRO
|
中使用的例子。程序7定义的Req 理请求。在其中使用了两个Requ rol的servlet转发请求。当请求 可以在web.xml中定义。如果用 的RequestDispatcher会调用inc 用,因为在定义了INCLUDE;如 let会调用resp.sendError()方 R。
|
DispatcherServlet根据用户请求 estDispatcher(rd,和rd2),它们 被转发后,适当的过滤器会起作用 户输入的Web请求参数为“INCLUDE lude 方法,这样D 果用户输入的 Web请求参数为“ 法,这样DispatcherFilterErr会
|
<filter-name>DispatcherFilterIcd</filter-name> |
<url-pattern>/admin</url-pattern> |
<dispatcher>INCLUDE</dispatcher> |
<filter-name>DispatcherFilterErr</filter-name> |
<url-pattern>/errorpage</url-pattern> |
<dispatcher>ERROR</dispatcher> |
import javax.servlet.http.*; |
public class ReqDispatcherSe
|
rvlet extends HttpServlet
|
public void init(ServletConf
|
ig config) throws ServletException
|
public void serv
|
ice(HttpServletRequest req,H
|
ttpServletResponse resp)
|
throws ServletException,IOException |
PrintWriter out=resp.getWriter(); |
if((req.getParameter("type"))!=null) |
type = req.getParameter("type"); |
resp.setContentType("text/html"); |
out.println("ReqDispacherServelt"); |
out.println("Ser
|
verName:"+req.getServerName(
|
)+"ServerPort:"+
|
RequestDispatche
|
r rd=req.getRequestDispatche
|
r("/admin");
|
RequestDispatche
|
r rd2=req.getRequestDispatch
|
er("/control");
|
if(type.equals("REQUEST")) |
if(type.equals("FORWARD")) |
if(type.equals("INCLUDE")) |
resp.sendError(4
|
04,"Error from ReqDispacher
|
Servlet");
|
if(type.equals("CONTROL")) |
System.out.println("ReqDispa
|
cherServlet:destroy()");
|
Servlet 2.4增加了Web
|
程序国际化功能,在web.xml中
|
可以定义网站的字符编码方式。
|
<locale-encoding-mapping-list> |
<locale-encoding-mapping> |
<encoding>gb2312</encoding> |
</locale-encoding-mapping> |
</locale-encoding-mapping-list> |
当客户请求了特定语言 方法设置一个Web响应的语
|
的Web资源时,servlet程序通过 言属性。
|
ServletResponse接口的setLocale
|
在Servlet 2.4中增加了logout和log API查看其用法。
|
in方法方便安全管理。大家可以参考Servlet 2.4的
|
|
|
|
|
|