servlet-3.0 基础摘要

servlet3.0 的新特性

  • 新增了几个注解 @WebServlet 、@WebFilter、@WebListener 用来替代之前在web.xml 中的 servlet、filter、listener的配置

  • 动态新增servlet、filter、listener的能力,这个绝对是开创性的,在servlet2.0时代,一旦servlet容器启动就没法在变了。

  • @MultipartConfig 用来简化servlet中文件上传的处理

  • 基于plugin模式的开发模式

使用心得

  1. web.xml 真的能删掉吗?
    可以,但是如果你使用maven构建工程的话在打包的时候就会遇到问题,因为默认情况下maven-war-plugin在打包的时候回去检查web.xml,如果不存在就立即报错,因此你的项目无法打包。解决方法是


org.apache.maven.plugins
maven-war-plugin

false

配置上 failOnMissingWebXml

  1. 动态新增servlet、filter、listener的能力,是如何做到的?
    在servlet-3.0中增强了ServletContext的功能,增加了几个方法可以用来新增servlet、filter、listener,api如下:
  • ServletRegistration.Dynamic addServlet(String servletName,Class servletClass)
  • ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
  • ServletRegistration.Dynamic addServlet(String servletName, String className)
  • T createServlet(Class clazz)
  • ServletRegistration getServletRegistration(String servletName)
  • Map getServletRegistrations()

简单的说,只要我们能拿到ServletContext对象,就可以随时随地的新增servlet、filter、listener,那么哪些地方可以得到ServletContext对象呢?
1、servletContextListener 启动的时候可以得到该对象,这个很简单。
2、servlet 3.0 新增了一个新的接口:ServletContainerInitializer ,这个接口是在容器启动的时候会扫描claspath下所有实现该接口的实现类,然后调用onStartup方法,在这个类中传入了ServletContext对象,因此也可以动态新增。但这个地方有个问题,我实现了这个接口,servlet容器如何知道呢?他怎么扫描到这个实现类呢?在META-INF/service中增加配置,这个其实就是使用了spi原理来做服务的发现。

  1. servlet3.0和springmvc结合
    在springmvc环境中我们使用spring提供的WebApplicationInitializer来动态新增servlet、filter、listener。原理就是利用ServletContainerInitializer来实现的,大家可以看下spring-web.jar这个jar包的spi实现。

  2. 基于plugin模式的开发模式 ?
    简单说,我准备一个jar包,里面包含了一个servlet的配置。然后引入这个jar到其他任何一个servlet3的工程里,不需要写一行代码,新工程就可以马上访问这个servlet了。
    原理是在利用了servlet3提供的web-fragment.xml来实现的,顾名思义web-fragment是web的一个片段,将这个片段放到WEB-INF/下即可

servlet-3.0 基础摘要_第1张图片
image.png

内容是:


servlet-3.0 基础摘要_第2张图片
image.png

除了标记头和web.xml不一样,其他都一样。

你可能感兴趣的:(servlet-3.0 基础摘要)