servlet3.0 的新特性
新增了几个注解 @WebServlet 、@WebFilter、@WebListener 用来替代之前在web.xml 中的 servlet、filter、listener的配置
动态新增servlet、filter、listener的能力,这个绝对是开创性的,在servlet2.0时代,一旦servlet容器启动就没法在变了。
@MultipartConfig 用来简化servlet中文件上传的处理
基于plugin模式的开发模式
使用心得
- 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
- 动态新增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原理来做服务的发现。
servlet3.0和springmvc结合
在springmvc环境中我们使用spring提供的WebApplicationInitializer来动态新增servlet、filter、listener。原理就是利用ServletContainerInitializer来实现的,大家可以看下spring-web.jar这个jar包的spi实现。基于plugin模式的开发模式 ?
简单说,我准备一个jar包,里面包含了一个servlet的配置。然后引入这个jar到其他任何一个servlet3的工程里,不需要写一行代码,新工程就可以马上访问这个servlet了。
原理是在利用了servlet3提供的web-fragment.xml来实现的,顾名思义web-fragment是web的一个片段,将这个片段放到WEB-INF/下即可
内容是:
除了标记头和web.xml不一样,其他都一样。