青青子衿穿越小说:Java EE 6 之 Servlet 3.0

来源:百度文库 编辑:九乡新闻网 时间:2024/07/14 15:58:56

Servlet之所以没有像之前的ejb那样被受到那么多的诟病,是因为servlet的设计确实非常好。在最新的Java EE6版本里,这么多年都没有多少重大改动的Servlet终于添加了很多新的功能。下面我们一个一个来看

1. 基于annotation的配置

自从java 5增加了annotation后,现在annotation已经广范用于各种框架,确实减少了很多的编写配置文件的工作。现在终于可以不用写web.xml,只要通过WebServlet, WebFilter, WebListener这几个annotation就可以轻易的配置Servlet, filter和listener了。而且, web.xml已经是可选的了,就算没有它,也一样运行。

2. 异步请求处理

Servlet 3.0 新添加了一个类AsyncContext,可以通过ServletRequest活得。如果调用了ServletRequest的startAsync(),那么这个请求将会被异步处理,这意味着即使当前的线程执行结束,也不会给发送会响应,而是要等到AsyncContext的complete()方法被调用。通过AsyncContext,一样可以取到ServletRequest,和ServletResponse对象,这意味着即使最初Servlet执行的线程执行结束,也一样可以取到那次请求数据和返回客户端数据。

在通常的Servlet设计中,servlet容器会为每个客户端的请求分配一个线程,如果处理请求的过程中需要等待某种很慢的资源,在访问量大的时候,可能导致servlet容器的线程池耗光,从而无法响应后续的请求。有了异步处理的servlet之后,可以将这些线程解放出来,把它们放到一个队列里等待。比起线程,普通的对象还是要占用较少资源的。

3. Web Fragments

Web容器加载的时候,会扫描WEB-INF/lib下的jar, 如果这个jar的有META-INF/web-fragment.xml,那这这个web-fragment.xml内的配置信息也会被使用。这个功能对做web框架很有用。很多web框架都是通过自定义自己的servlet, filter或listener实现的,现在,框架的开发者可以将默认的配置放到自己的jar里,使用者只要把jar丢到WEB-INF/lib/目录下就可以使用框架了,更加方便。通过web-fragment, 可以更容易的对一个war实现部署上的模块化。

4. 动态注册Web application组件

这个功能的意思是指,应用程序可以在运行时注册servlet, filter和listener。ServletContext里多了addFilter(), addServlet()等方法,来给用户调用。很奇怪的是,我只看到注册组件的,没有看到注销组件的,如果只能加不能减的话,那这一功能估计只能看作是通过xml配置的另一种方法。

5. 容器启动回调

如果WEB-INF/lib下有某个jar文件包含META-INF/services/javax.servlet.ServletContainerInitializer文件,且该文本文件内的类名所对应的类实现了javax.servlet.ServletContainerInitializer接口,那么这个类所实现的该接口方法会在容器启动时被调用。 这个接口方法是onStartup(java.util.Set<>> c, ServletContext ctx) , 其中c是一个类的集合。你必须在这个方法上使用HandlesTypes annation,这个annotation会指定一些类,而所有实现了,集成了或标注了这个些类的类会做成一个结合作为参数传给onStartup方法。说起来复杂,写起来简单:

@HandlesTypes({A.class})
public void onStartup(Set> c, ServletContext ctx){
   //
}

对于上面的例子,c集合里的类要么实现了A,要么集成了A,要么标注了A。
看来这个功能还是为了自定义框架用的。

6. 自定义session cookie

以前Session cookie的名字一般固定为JSESSIONID,现在通过ServletContext可以获得SessionCookieConfig对象,而该对象可以让我们自定义session cookie的名字等属性。

7. multipart支持

编写接受上传文件的程序更容易了,通过HttpServletRequest对象可以获得Part对象,每一个Part代表了上传的一个文件。调用Part.write(String)方法,可以很轻松的把上传的文件保存为参数指定的文件名。

结论

可以看出,这些更改,都无疑使Servlet编程更容易更灵活了。所以还是很期待能在项目中使用Servlet 3.0 。

相关文章:

  1. Java EE,王者回来
  2. Java EE 的依赖注入功能有限,不能注入到非管束的普通类里面
  3. Java EE的不足
  4. 如何保证jms消息的顺序性
  5. JavaEE组件的并发与无状态