2011年11月18日星期五

JavaEE_012:JavaEE6 新特性之三:Servlet3.0(4)

除了前面介绍的三大特性,Servlet3.0还具有以下这些特性。

1. 增强的ServletContext API
ServletContext 支持在运行时动态部署Servlet、Filter、Listener,以及为 Servlet 和过滤器增加 URL 映射等等。
以 Servlet 为例,ServletContext 为动态配置 Servlet 增加了如下方法:
(1)ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)
(2)ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
(3)ServletRegistration.Dynamic addServlet(String servletName, String className)
(4)<T extends Servlet> T createServlet(Class<T> clazz)
(5)ServletRegistration getServletRegistration(String servletName)
(6)Map<String,? extends ServletRegistration> getServletRegistrations()
其中前三个方法的作用是相同的,只是参数类型不同而已。
通过 createServlet() 方法创建的 Servlet,通常需要做一些自定义的配置,然后使用 addServlet() 方法来将其动态注册为一个可以用于服务的 Servlet。
两个 getServletRegistration() 方法主要用于动态为 Servlet 增加映射信息,这等价于在 web.xml( 抑或 web-fragment.xml) 中使用 标签为存在的 Servlet 增加映射信息。
以上 ServletContext 新增的方法要么是在 ServletContextListener 的 contexInitialized 方法中调用,要么是在 ServletContainerInitializer 的 onStartup() 方法中调用。
ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer 的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理,我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类,过滤掉不希望给 onStartup() 处理的类。

2. HttpServletRequest 对文件上传的支持
此前,对于处理上传文件的操作一直是让开发者头疼的问题,因为 Servlet 本身没有对此提供直接的支持,需要使用第三方框架来实现,而且使用起来也不够简单。
如今这都成为了历史,Servlet 3.0 已经提供了这个功能,而且使用也非常简单。
为此,HttpServletRequest 提供了两个方法用于从请求中解析出上传的文件:

Part getPart(String name)
Collection<Part> getParts()
前者用于获取请求中给定 name 的文件,后者用于获取所有的文件。
每一个文件用一个 javax.servlet.http.Part 对象来表示。该接口提供了处理文件的简易方法,比如 write()、delete() 等。
至此,结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单,如下所示:
Part photo = request.getPart("photo");
photo.write("/tmp/photo.jpg");
// 可以将两行代码简化为 request.getPart("photo").write("/tmp/photo.jpg") 一行。

另外,开发者可以配合前面提到的 @MultipartConfig 注解来对上传操作进行一些自定义的配置,比如限制上传文件的大小,以及保存文件的路径等。
需要注意的是,如果请求的 MIME 类型不是 multipart/form-data,则不能使用上面的两个方法,否则将抛异常。

3. Configure cookie session name

4. Security with @ServletSecurity

没有评论: