Servlet3.0新特性
servlet3.0新增加如下特性:
1)注解,javax.servlet.annotation包下,如:@WebServlet,
可以不用在web.xml中配置了,如果想使用注解,需要在web.xml中设置参数:metadata-complet="false", 设置true时注解就无效了。
2)插件支持,类似于struts中的插件。
把servlet打成一个jar包(META-INF/web-fragment.xml中配置servlet), 然后分发到你想使用到的web工程
3)servlet的异步处理支持,(默认情况下servlet没有开启异步,需要设置asyncSupported=true)
对于耗时的请求操作,‘servlet线程’接收到浏览器请求后,可以开启一个‘小线程’去处理这个耗时操作,而让‘servlet线程’直接结束,回到容器的‘servlet线程池’中闲置,从而可以为其他的用户请求服务,‘小线程’在处理完耗时操作后,直接将处理完的结果输出到客户端浏览器,‘小线程’结束。
在servlet3.0之前,‘servlet线程’会一直阻塞,直到耗时操作完成之后,‘servlet线程’才会闲置,一旦遇到大并发时,‘servlet线程’就会不够用(Tomcat下默认150个‘servlet线程’)。
servlet3.0的ServletContext在初始化的时候,可以动态添加servlet/filter/listener:
1 ServletRegistration.Dynamic addServlet(java.lang.String servletName, java.lang.Class<? extends Servlet> servletClass)
2 ServletRegistration.Dynamic addServlet(java.lang.String servletName, Servlet servlet)
3 ServletRegistration.Dynamic addServlet(java.lang.String servletName, java.lang.String className)
2 ServletRegistration.Dynamic addServlet(java.lang.String servletName, Servlet servlet)
3 ServletRegistration.Dynamic addServlet(java.lang.String servletName, java.lang.String className)
注意:只能在容器初始化时才能调用,否则会抛出异常:
IllegalStateException
- if this ServletContext has already been initialized如果可以动态部署servlet多好呀,为什么servlet3.0限制不准这样做呢?安全方面考虑?
参考:
http://www.ibm.com/developerworks/cn/java/j-lo-servlet30/index.html?ca=drs-cn-0423