Servlet 3.0特性详解之 ServletContext 性能增强

来源:互联网 发布:网络致富平台 编辑:程序博客网 时间:2024/05/17 22:33

ServletContext的性能增强

    ServletContext 对象的功能在新版本中也得到了增强。现在,该对象支持在运行时动态部署Servlet、过滤器、监听器,以及为Servlet和过滤器增加URL映射等。以Servlet为例,过滤器与监听器与之类似。ServletContext为动态配置Servlet增加了如下方法:

◆ServletRegistration.DynamicaddServlet(StringservletName,Class<?extendsServlet>servletClass)

◆ServletRegistration.DynamicaddServlet(StringservletName,Servletservlet)

◆ServletRegistration.DynamicaddServlet(StringservletName,StringclassName)

◆<TextendsServlet>TcreateServlet(Class<T>clazz)

◆ServletRegistrationgetServletRegistration(StringservletName)

◆Map<String,?extendsServletRegistration>getServletRegistrations()

其中前三个方法的作用是相同的,只是参数类型不同而已;通过createServlet()方法创建的Servlet,通常需要做一些自定义的配置,然后使用addServlet()方法来将其动态注册为一个可以用于服务的Servlet。

两个getServletRegistration()方法主要用于动态为Servlet增加映射信息,这等价于在web.xml(抑或web-fragment.xml)中使用<servlet-mapping>标签为存在的Servlet增加映射信息。以上ServletContext新增的方法要么是在ServletContextListener的contexInitialized方法中调用,要么是在ServletContainerInitializer的onStartup()方法中调用。

ServletContainerInitializer也是Servlet3.0新增的一个接口,容器在启动时使用JAR服务API(JARServiceAPI)来发现ServletContainerInitializer的实现类,并且容器将WEB-INF/lib目录下JAR包中的类都交给该类的onStartup()方法处理,我们通常需要在该实现类上使用@HandlesTypes注解来指定希望被处理的类,过滤掉不希望给onStartup()处理的类。

 

HttpServletRequest对文件上传的支持


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

◆PartgetPart(Stringname)
◆Collection<Part>getParts()

前者用于获取请求中给定name的文件,后者用于获取所有的文件。每一个文件用一个javax.servlet.http.Part对象来表示。该接口提供了处理文件的简易方法,比如write()、delete()等。至此,结合HttpServletRequest和Part来保存上传的文件变得非常简单,如下所示:

◆Partphoto=request.getPart(“photo”);
◆photo.write(“/tmp/photo.jpg”);

可以将两行代码简化为request.getPart(“photo”).write(“/tmp/photo.jpg”)一行。另外,开发者可以配合前面提到的@MultipartConfig注解来对上传操作进行一些自定义的配置,比如限制上传文件的大小,以及保存文件的路径等。其用法非常简单,故不在此赘述了。需要注意的是,如果请求的MIME类型不是multipart/form-data,则不能使用上面的两个方法,否则将抛异常。