Servlet 3.0 新特性

Servlet 3.0 规范的 JSR 315 已经进入到了 proposed final draft 阶段,想必很快就会在 Java EE 6 中释出。 新版本的 Servlet 规范变动比较大,不单单只是 API 的变动,而是引入了很多新特性。

那么都有哪些新特性呢:

支持注释

Servlet、Filter、Listener 都可使用注释,且不必如之前版本那样,必须实现 Servlet, Filter, Listener 等接口。

@Servlet(urlMapping={“/foo”, “/bar”}, name=”MyServlet”)
public class SampleUsingAnnotationAttributes {
    @GET
    public void handleGet(HttpServletRequest req, HttpServletResponse res)
    {
        ....
    }
}

这使得开发人员可以不必在部署描述符中注册。当然,在部署描述符中注册仍然受支持,而且需注意的是,部署描述符优先于注释。换句话说,部署描述符覆盖通过注释机制所规定的配置信息。

Web 部署描述符的 3.0 版本在 web-app 元素上包含一种名为 metadata-complete 的新属性。该属性定义了 web 描述符是否完整,或者 web 应用程序的类文件是否针对指定部署信息的注释而进行检查。如果该属性被设置为 true,则部署工具必须忽略类文件中所存在的任何 servlet 注释,并只使用描述符中所提及的配置细节。否则,如果没有指定该值或者该值被设置为 false,容器必须针对注释而扫描应用程序的所有类文件。这个属性提供了在应用程序启动阶段启用或者禁用注释扫描以及对注释的处理。

因此,如果所有组件都集中在部署描述符中声明,那么最好将 metadata-complete 设置为 true,免去扫描以提升启动速度。

可插拔、易扩展

在 Servlet 3.0 中,部署描述符可以分成多个部分,即支持模块 web.xml 。各模块 web.xml 必须包含保存 web 片段细节的 <web-fragment> 这一新元素。如果该片段被打包到一个 .jar 文件中,则 web.xml 文件必须包含在 .jar 文件的 META-INF 目录下。在部署时,加载器会扫描应用程序的类路径,查找所有 web 片段并加以处理。前面讨论过的 metadata-complete 标志在应用程序启动期间控制 web 片段的扫描。以下显示了一个示例 web 片段:

<web-fragment>
<servlet>
  <servlet-name>myservlet</servlet-name>
  <servlet-class>samples.MyServlet</servlet-class>
</servlet>
<listener>
  <listener-class>samples.MyListener</listener-class>
</listener>
</web-fragment>

为支持可插拔特性,Servlet 3.0 的 ServletContext API 为在运行期增加 servlets 和过滤器提供了支持。这些新的 API 使您能通过编程来声明 servlets、过滤器类及其 URL 映射。这些类在应用程序启动或者运行期间进行初始化。最重要的是,您只能通过 ServletContext 的 contextInitialized 方调用这些 API。通过编程添加 servlet 和过滤器类的代码示例如下所示:

@ServletContextListener
public class MyListener {
    public void contextInitialized (ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();

        //Declare servlet and servlet mapping
        sc.addServlet("myServlet", "Sample servlet", "samples.MyServlet", null, -1);
        sc.addServletMapping("myServlet", new String[] {"/urlpattern/*"});

        //Declare filter and filter mapping
        sc.addFilter("myFilter", "Sample Filter", " samples.MyFilter", null);
        sc.addFilterMapping("myFilter", new String[] {"/urlpattern/*"}, "myServlet",
        DispatcherType.REQUEST, false);
    }
}

请求的异步处理

在传统的请求处理模型下,每个接收请求的 servlet 线程都必须对该请求声明周期负责到底,即使在请求处理过程中需长时间等待中间处理结果(譬如等待数据库查询结果),该线程仍要坚持等待。这种处理模型下,不可避免将导致大量请求在无法被有限servlet线程处理时所导致的排队现象。

新的 Servlet 编程模型允许在请求处理过程中挂起和恢复对请求的处理,使 servlet 以异步、非阻塞的方式响应请求(这就是编程的 Comet 样式)。

当一项请求被挂起时,处理请求的线程将在不生成任何响应的情况下返回给容器并准备执行其他任务。处理请求的 resume 方法恢复请求处理。只要当所请求的资源可用时,处理事件的线程才恢复被挂起的请求并进行处理以生成响应。

安全性

其它杂项

参考资料:

  1. Servlet 3.0 简介
  2. JavaTM Servlet 3.0 API: What’s new and exciting
By javafuns on July 3, 2009 at 22:27 · Views: 247 · Permalink
Categorized in: Java · Tagged with: ,
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Leave a Reply


  • Highest Rated

  • My PicasaPhotos

    IMG_0693.JPG

    IMG_0664.JPG

    IMG_0872.JPG

  • RSS My del.icio.us

  • My RSS