美文网首页
servlet-3.0 基础摘要

servlet-3.0 基础摘要

作者: 春天里的布谷鸟 | 来源:发表于2017-10-10 16:38 被阅读58次

    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,如果不存在就立即报错,因此你的项目无法打包。解决方法是

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
    <failOnMissingWebXml>false</failOnMissingWebXml>
    </configuration>
    </plugin>

    配置上 failOnMissingWebXml

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

    image.png

    内容是:


    image.png

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

    相关文章

      网友评论

          本文标题:servlet-3.0 基础摘要

          本文链接:https://www.haomeiwen.com/subject/dctbyxtx.html