Apache Tomcat 4.0的新特性

(作者:Robot)

(编者按:tomcat是JSP技术发展的先锋,我已经搞不清tomcat现在到第几版了。4.0版应该是未来的最新的一个版本,将随着servlet/jsp新标准的推出而推出。通过本文的介绍,也许你可以看到一些jsp的未来。)

简介
Tomcat4.0包含三个主要的部分,包括:
* Catalina - 一个符合Servlet API规范2.3的Servlet Container
* Jasper - 一个符合JSP规范1.2的JSP编译器和运行环境
* Webapps - Tomcat中包含的一些例子和用于测试的web例程,以及相关文档。

Tomcat4.0的一个主要目的是支持目前正在处于测试版的Servlet2.3规范和JSP1.2规范的新特性。本文主要介绍Tomcat4.0实现的这些新特性以及这些新特性目前在tomcat中的实现情况。

Servlet API 规范2.3

应用程序中的事件:
你可以在web.xml文件中注册相应的事件监听器,当这些事件发生时,在应用程序中可以收到相应的事件通知,这些事件包括:
- 应用启动
- 应用关闭
- 应用的属性的增加、删除、被替换 
- Session创建
- Session失效、超时
- Session的属性的增加、删除、被替换

事件监听器的功能被加入到Catalina,看来效果非常好。在Webapps中的web应用examples中就有两个监听器的例子用于通过ServerletContext.log()记录相应的事件。

Servlet Fliter
你能够在web.xml文件中注册类似与Catalina核心中Valves功能类似的的Filter。Filter主要具有以下特性:
- Filter能够映射成相应的URL或特定的Servlet。
- Filter能被用于对request,reponse对象进行预处理、或后处理。
- Filter能封装request、response对象,比如可以对对象中的内容进行转换。
- Filter能够对访问请求直接响应,然后返回给客户端,而不仅仅进行访问请求的传送,比如,你可以在应用级进行用户认证。

与这些特性相关联,当servlet传递参数给RequestDispatcher时就可以做这种类型的封装。而在以前,你只能将初始的request对象传递给Servlet Container,并且从Servlet Container中得到返回的response对象。Servlet filter的功能目前已经加入到Catalina中,并通过了初步测试。在应用examples中有一个filter用于路径映射和向调用servlet的映射("/servlet/*"),其中存放了最终传递给执行Servlet的request对象属性。

安装扩展库的依赖关系

Web应用程序或WEB-INF/lib中的jar文件,现在可以声明对特定版本外部库的依赖关系,这些外部库是由Servlet Container作为共享扩展提供的。在Catalina中目前还没有完全实现这部分功能。

国际化支持
Catalina现在支持从Locale向字符集的映射,在ServletRequest中增加了一个新的方法setCharacterEncoding() ,在这一方面,还需要有个多的测试和功能增强。


Web应用的类装载器
Servlet规范草案中9.6.2节中定义了与Web应用中类装载器相关的需求和建议。这些需求在Catalina中被遵照执行。

Servlet 2.3应用程序分发描述符的DTD
在Catalina中包括一个非正式的用于解析web.xml文件的DTD(catalina/src/conf/web_23.dtd)
它将被正式发布的DTD所替代。



JSP规范1.2
JSP 对Include flush="false"的支持
这个变化通过在标准或定制的标记中嵌套使用<jsp:include>标记,允许利用内含的servlet进行缓存、处理,并产生的输出。这个变化取决于前述的对RequestDispatcher.include()的功能的增强功能。

JSP页面的XML视图
JSP1.2的实现要求输入不仅要符合JSP语法,而且要符合XML语法。目前正在将Jasper的parser进行转换,使得其能接受任何一种类型的输入。

属性编辑器的利用
假如一个应用对java类的一个特定属性注册了一个属性编辑器(PropertyEditor),那么这个属性编辑器的setAsText()方法将用于将文本格式的属性(比如request对象的一个参数)转换为该属性的内部表示。假如没有定义属性编辑器,那么就采用前述的缺省属性编辑器进行转换。

定制标记库验证页面的合法性
在定制标记库中增加了一个新的编译阶段用于检查页面的XML视图,如果检测到错误,就抛出一个转换时异常。在这当中,可用于验证:
- 从语义上不能被TLD中定义的信息验证的嵌套定制标记
- 误用或滥用JSP中定制标记特性。比如,你可以用一个验证子禁止JSP使用Java语句块。

增强的迭代支持
增强了的定制tag机制支持在不做内容嵌套的前提下进行迭代的能力。这将优化这类非常常见的例子的性能,比如通过迭代来表示一个表格的处理结果,而不用显式对表格中每一行进行处理。

定制tag库能够声明应用监听器
一个定制的tag库能够利用servlet2.3中的新特性,声明一个监听器,用于监听应用程序相关的事件。

附加的TLD元素
在许多简单的例子中,声明变量时,采用附加的TLD元素可不用书写TagExtraInfo类

在Tag接口中增加resetCustomAttributes()方法
通过由Servlet Container调用附加的方法,使得在循环调用一个tag的实例前调用该方法