Servlet 3.0的AsyncListener接口

一、Servlet 3.0介绍
Servlet 3.0作为 JavaEE 6规范中一部分,随着JavaEE 6规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化Web应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了Java社区的一片赞誉之声:
1)异步处理支持
 在Servlet 3.0版本之前,Servlet线程需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该Servlet线程。而有了异步处理特性,Servlet线程不再需要一直阻塞,在接收到请求之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这可以大幅度降低服务器的资源消耗,并且提高并发处理速度。
2)新增的注解支持
Servlet 3.0版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得web.xml部署描述文件不再是必选项了。
3)功能可插拔支持

二、服务器推技术
 在Servlet 2.5中,页面发送一次请求是顺序执行的,即在Servlet的Service中开启一个线程,线程处理后的结果是无法返回给页面的,Servlet执行完毕后,Response就关闭了,无法将后台更新数据即时更新到页面端。
 服务器推技术的实现
1)定时发送请求,页面有刷新,不友好
2)Ajax轮询,然后通过js更新页面数据
 相比前者虽然友好,访问量太大时,服务器会增加压力,小型应用可以考虑用
3)反向Ajax(即Comet技术)
 利用Http 1.1长连接的特性,即通过轮询,但客户端每次发送请求时服务器不会立即返回响应,而是等待服务器有新数据时才返回或者没有新数据而连接超时返回。
 相比于ajax轮询,减少了服务端压力,但一个缺点,不是所有浏览器都支持。
 在Servlet 3.0中提供了异步支持,当数据返回页面后,Request并没有关闭,当服务器端有数据更新时,就可以推送了。

三、Servlet 3.1规范的改进
GlassFish 4.0以上版本率先实现了Servlet 3.1规范。Servlet 3.1规范的新特性有:
1)更便利的注解支持
 提供了@WebServlet、@WebFilter、@WebListener、@WebInitParam等注解的支持
2)可插拔的设计
Web模块化:可以将一个项目分成N个模块,然后通过扫描模块下的META-INF/web-fragment.xml进行装配。
 容器启动时的可插拔:使用ServletContainerInitializer实现,可以在容器启动时自动回调其onStartup方法,插入一些功能。
 零XML配置的类SpringMVC:使用ServletContainerInitializer即SpringMVC注解配置实现无XML化的SpringMVC配置。
3)异步处理支持
Servlet的异步支持:
- 通过Servlet提供的异步支持完成了Comet:Streaming(长连接)和Ajax长轮询
- 使用Servlet提供的AsyncListener进行状态回调
- 最后通过Ajax长轮询实现了一个聊天室功能
SpringMVC对Servlet的异步支持:
- 使用SpringMVC框架提供的异步支持实现Comet:Streaming(长连接)和Ajax长轮询
- 使用SpringMVC框架提供的Callable实现异步计算
- 使用SpringMVC框架提供的DeferredResult实现延迟结果(实现Ajax长轮询)
- Spring框架没有提供长连接实现,具体还得使用原生支持
- 最后通过ajax长轮询实现了一个聊天室功能
4)非阻塞I/O
 5)HTTP协议升级

四、Servlet的监听器
Servlet的监听器即Listener,它可以监听来自客户端的请求、完成服务器端的操作等。通过监听器,可以自动触发一些操作,比如:监听在线用户的数量,当增加一个HttpSession时,就触发一个sessionCreated(HttpSessionEvent se)方法,这样就可以给在线人数加1了。
 常用的监听器接口有:
1. ServletContextListener
监听ServletContext。当创建ServletContext时,触发contextInitialized(ServletContextEvent sce)方法;当销毁ServletContext时,触发contextDestroyed(ServletContextEvent sce)方法。
2. ServletContextAttributeListener
监听对ServletContext属性的操作,比如增加、删除、修改属性。
3. HttpSessionListener
监听HttpSession的操作。当创建一个Session时,触发session Created(HttpSessionEvent se)方法;当销毁一个Session时,触发sessionDestroyed(HttpSessionEvent se)方法。
4. HttpSessionAttributeListener
监听HttpSession属性的操作。当在Session增加一个属性时,触发attributeAdded(HttpSessionBindingEvent se)方法;当在Session删除一个属性时,触发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,触发attributeReplaced(HttpSessionBindingEvent se)方法。

Servlet 3.0的监听器跟Servlet 2.5的监听器差别不大,唯一的区别就是增加了对注解的支持。在3.0以前,监听器的配置需要配置到web.xml文件。在3.0中,监听器的配置既可以放入web.xml文件,还可以使用注解进行配置。对于使用注解的监听器就是在监听器类上使用@WebListener进行注释,这样Web容器就会把这个类当成是一个监听器进行注册和使用。
 如果是采用web.xml配置文件的方式,那么就是这样:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/35c893f9ad55cda7ace682fc9fa9a0f1.html