Spring MVC 3.2 预览:实时更新技术

工程 | Rossen Stoyanchev | 2012 年 5 月 8 日 | ...

上次更新于 2012 年 11 月 5 日(Spring MVC 3.2 RC1)

在我的上一篇博文中,我介绍了Spring MVC 3.2 中基于 Servlet 3 的新异步支持,并讨论了长时间运行的请求。异步处理的第二个非常重要的动机是浏览器需要接收实时更新。示例包括在浏览器中聊天、股票报价、状态更新、实时体育结果等。当然,并非所有示例都同样对延迟敏感,但它们都具有类似的需求。

在标准的 HTTP 请求-响应语义中,浏览器发起请求,服务器发送响应,这意味着服务器在收到浏览器的请求之前无法发送新信息。已经发展出几种方法,包括传统轮询长轮询HTTP 流式传输,最近我们还有WebSocket协议。

传统轮询

浏览器不断发送请求以检查是否有新信息,服务器每次都会立即响应。这适合可以以相当稀疏的间隔进行轮询的场景。例如,邮件客户端可以每 10 分钟检查一次新邮件。它很简单,而且有效。但是,当需要尽快显示新信息时,这种方法效率低下,在这种情况下,轮询必须非常频繁。

长轮询

浏览器不断发送请求,但服务器只有在有新信息要发送时才会响应。从客户端的角度来看,这与传统轮询相同。从服务器的角度来看,这非常类似于长时间运行的请求,并且可以使用第 1 部分中讨论的技术进行扩展。

响应可以保持打开多长时间?浏览器设置为在 5 分钟后超时,而代理等网络中介可能更早超时。因此,即使没有新的信息到达,长轮询请求也应该定期完成,以允许浏览器发送新的请求。这IETF 文档建议使用 30 到 120 秒之间的超时值,但要使用的实际值可能取决于您对将浏览器与服务器分隔开的网络中介的控制程度。

长轮询可以显著减少接收低延迟信息更新所需的请求数量,尤其是在新信息以不规则间隔出现的情况下。但是,更新越频繁,它就越接近传统轮询。

HTTP 流式传输

浏览器向服务器发送请求,服务器在有信息要发送时响应。但是,与长轮询不同,服务器会保持响应打开,并在新更新到达时继续发送更多更新。这种方法消除了轮询的需要,但也与典型的 HTTP 请求-响应语义有更大的偏差。例如,客户端和服务器需要就如何解释响应流达成一致,以便客户端知道一个更新在哪里结束,另一个更新在哪里开始。此外,网络中介可以缓存响应流,从而破坏了这种方法的意图。这就是今天更常使用长轮询的原因。

WebSocket 协议

浏览器向服务器发送 HTTP 请求以切换到 WebSocket 协议,服务器通过确认升级来响应。此后,浏览器和服务器可以在 TCP 套接字上双向发送数据帧。

WebSocket 协议旨在取代轮询的需要,并且特别适用于浏览器和服务器之间需要高频率交换消息的场景。通过 HTTP 的初始握手确保 WebSocket 请求可以穿过防火墙。但是,也存在重大挑战,因为大多数已部署的浏览器不支持 WebSockets,并且在通过网络中介方面存在更多问题

WebSockets 围绕文本或二进制消息的双向交换展开。它导致了一种与基于 RESTful 的 HTTP 架构明显不同的方法。实际上,需要在 WebSockets 之上使用另一种协议,例如 XMPP、AMQP、STOMP 或其他协议,哪些协议将成为主流还有待观察。

WebSocket 协议已经由 IETF 标准化,而WebSocket API处于由 W3C 标准化的最后阶段。许多 Java 实现已经可用,包括 Jetty 和 Tomcat 等 servlet 容器。Servlet 3.1 规范可能会支持初始 WebSocket 升级请求,而单独的JSR-356将定义基于 Java 的 WebSocket API。

回到 Spring MVC 3.2,Servlet 3 异步功能可用于长时间运行的请求以及 HTTP 流式传输,Filip Hanik称之为“客户端 AJAX 调用的服务器版本”。至于 WebSockets,Spring 3.2 中尚不支持,但很可能包含在 Spring 3.3 中。您可以关注SPR-9356以获取进度更新。

下一篇文章转向示例代码,并更详细地解释了新的 Spring MVC 3.2 功能。

Spring MVC 3.2 预览:介绍 Servlet 3,异步支持

工程 | Rossen Stoyanchev | 2012 年 5 月 7 日 | ...

上次更新于 2012 年 11 月 5 日(Spring MVC 3.2 RC1)

概述

Spring MVC 3.2 引入了基于 Servlet 3 的异步请求处理。这是涵盖此新功能并提供理解如何以及为何使用它的上下文的几篇博文中的第一篇。

早期版本的的主要目的是寻求反馈。自从在 3.2 M1 版本发布后首次发布以来,我们在这里和JIRA中都收到了大量的反馈。感谢所有尝试过并发表评论的人!已经进行了许多更改,并且还有时间提供更多反馈!

概览

从编程模型的角度来看,新功能看起来非常简单。控制器方法现在可以返回一个java.util.concurrent.Callable来异步完成处理。Spring MVC 然后将在单独的线程中调用Callable,借助于TaskExecutor。以下是在之前的代码片段


// Before
@RequestMapping(method=RequestMethod.POST)
public String processUpload(final MultipartFile file) {
    // ...
    return "someView";
}

// After
@RequestMapping(method=RequestMethod.POST)
public Callable<String> processUpload(final MultipartFile file) {

  return new Callable<String>() {
    public Object call() throws Exception {
      // ...
      return "someView";
    }
  };
}

控制器方法还可以返回一个DeferredResult(Spring MVC 3.2 中的新类型)以在 Spring MVC 未知的线程中完成处理。例如,响应 JMS 或 AMQP 消息、Redis 通知等。以下是在另一个代码片段


@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<String> quotes() {
  DeferredResult<String> deferredResult…

本周 Spring,2012 年 5 月 1 日

工程 | Josh Long | 2012 年 5 月 1 日 | ...

欢迎来到本周 Spring的另一期!我正在Adrian ColyerSpringOne On The Road - London活动上的精彩主题演讲期间在房间后面写东西。

  1. 你们有没有错过Oleg Zhurakousky的网络研讨会使用 Spring Integration 的实用技巧和窍门?别担心,该视频已在线提供

    此外,请务必查看第 2 部分,本周三 5 月 3 日,欧洲和北美都有!

    	</LI>
    	<LI> <a href = "http://blog.springsource.org/author/rclarkson/">Roy Clarkson</A> has announced the <a href = "http://www.springsource.org/spring-mobile/news/1.0.0.rc2-released">latest release of Spring Mobile</A>.  
    		 The release has several enhancements including more refined resolution, and improved site switching behavior. 
    		
    		</LI> 
    		<LI>  <a href = "http://blog.springsource.org/author/jbrisbin/">Jonathan Brisbin</A> just announced <a href="http://blog.springsource.org/author…

本周 Spring - 2012 年 4 月 24 日

工程 | Josh Long | 2012 年 4 月 24 日 | ...

欢迎回到本周 Spring的另一期!当我编写这篇博文时,我正热切地等待着 Costin Leau 在阳光明媚美丽的乌克兰基辅开始他关于 NOSQL 与 Spring 的演讲,这是Cloud Foundry Open Tour欧洲站的第一站。此次活动的参与人数惊人!如果您正在阅读本文,那么您已经错过了参加基辅活动的机会,但请务必注册即将举行的莫斯科伦敦活动。

  1. 在此 SpringOne 2GX 2011 会议中,Mark Fisher 和 Thomas Risberg转换了一个单体企业应用程序,方法是使用 NoSQL 数据库替换其关系型数据库,引入模块化,添加多语言支持,并结合使用常见企业集成模式的消息队列和事件驱动的请求处理。
  2. 你们是否注意到优秀Spring Roo in Action的最终版本刚刚出版了吗?
        This book is, as Ben Alex (Spring Roo project founder) put it, "an insightful and comprehensive treatment." I (personally) can't recommend it enough. Ken Rimple and Srini Penchikala, as long time readers of this roundup will know, are frequent Spring community bloggers and 
    

    定期提供关于 Spring 的所有内容的精彩内容。

  3. 			 <LI>  
    		Blogger Billy Sj&ouml;berg on DZone has a great post on how <a href = "http://www.dzone.com/links/r/bridging_between_jms_and_rabbitmq_amqp_using_spri.html">to bridge JMS and RabbitMQ</A>. 
    		 This example uses <a href = "http://www.springsource…

本周 Spring:2012 年 4 月 17 日

工程 | Adam Fitzgerald | 2012 年 4 月 17 日 | ...

欢迎回到本周 Spring的另一期。本周是最后一次报名参加SpringOne on the Road活动的机会,活动地点在伦敦基辅莫斯科,因此请务必注册。让我们深入了解一下!

  1. Chris Richardson 关于Java 开发人员的 NoSQL 选项的网络研讨会录制视频已在 SpringSourceDev YouTube 频道上线。
  2. Shekhar Gulati 对 Spring Roo 的精彩介绍在 IBM 的 developerWorks 门户网站上继续进行。最新一期介绍了编写高级(和包装器)Spring Roo 插件
  3. <LI>  This article, which introduces how to use <a href = "http://java.dzone.com/articles/use-javafx2-spring">Spring to assemble  JavaFX 2 components</a> is short and to the point.  I'd probably use Spring's Java configuration option to fully exploit all the custom components, however. The nice thing about the approach outlined (over using FXML, directly, is that beans configured this way benefit from all the services that Spring provides, including dependency injection and AOP). Nice post, Andy!  </LI>
    
    <LI>Blogger <EM>Rob Gordon</EM> has a nice post introducing <a href ="http://rgordon.co…

本周 Spring,2012 年 4 月 10 日

工程 | Josh Long | 2012 年 4 月 11 日 | ...

多么棒的一周!Cloud Foundry Open Tour正在顺利进行,刚刚结束了亚洲和美国的巡回演出。现在,继续前往欧洲!(如果您在欧洲,现在是预留位置的时候了!)

在我们继续了解最新最棒的内容之前,我想提醒大家关注 Spring Integration 大神 Oleg Zhurakousky 即将举办的网络研讨会,Spring Integration 实用技巧。和往常一样,这次活动将分别在北美欧洲举行。

  1. Gunnar Hillert 发布了一篇博文,介绍了 SpringSource Tool Suite 中备受关注的一项功能:用于创建 Spring Integration 项目的易用模板。Gunnar 干得漂亮!此外,请观看 Gunnar 伴随的视频使用 STS 创建 Spring Integration 项目,该视频发布在SpringSource YouTube 频道上。
  2. Michael Isvy 发布了一篇很棒的博文,解释了在升级到 Spring 3.1时需要注意的一些事项。非常实用!
  3.  <LI> Spring Integration 2.1.1 has been released! This is the first maintenance release of 2.1.x branch and contains the usual things like bug fixes and improvements related to AMQP, Gemfire, Mongo and Redis modules which were first introduced in Spring Integration 2.1.0. All together 56 issues were resolved with this release. 
    	 For more, consult <a href = "http://www.springsource.org/node/3520">the release announcement</A>.</LI>
    		
    <LI>  Gabriel Axel talks about the <a href = "http://www.gabiaxel.com/2012/04/spring-social-google-first-milestone-is.html">first milestone of Spring Social…

使用 STS 创建 Spring Integration 项目

工程 | Gunnar Hillert | 2012年4月9日 | ...

就在几天前,SpringSource Tool Suite™ (STS) 2.9.1 发布了。除了许多新功能外,它还提供了一些对Spring Integration用户特别有吸引力的功能。首先,最新的 STS 版本增加了对 Spring Integration 2.1 的支持,并改进了 Spring Integration 流程的可视化功能。STS 现在支持所有最近添加的 Spring Integration 适配器,例如

此外,所有现有的 Spring Integration 适配器都已更新以支持新的可视化元素。Spring Integration 用户的另一个很棒的补充是 SpringSource Tool Suite 2.9.x 现在附带了 Spring Integration 的模板支持。因此,当使用Spring 模板项目向导创建新项目时,您现在可以在以下 3 个新的 Spring Integration 目标模板之间进行选择
  • Spring Integration 项目(独立) - 简单
  • Spring Integration 项目(独立) - 文件
  • Spring Integration 项目(War
简单模板创建一个基本的 Spring Integration 项目,该项目作为独立的 Java 应用程序运行,仅使用核心 Spring Integration 组件。为了说明文件轮询功能,文件模板使用其他组件来轮询文件目录以及路由这些文件。最后,War模板允许用户轻松创建旨在在 servlet 容器(例如 Tomcat)中作为 WAR 部署的一部分运行的基本 Spring Integration 项目。出于说明目的,War模板使用 Spring Integration 的Twitter 适配器

创建新的 Spring Integration 项目

要使用 STS Spring 模板启动新项目,请在主菜单中转到文件,然后选择新建,再选择Spring 模板项目。接下来将显示模板选择屏幕

 

[caption id="attachment_10681" align="aligncenter" width="342" caption="模板选择屏幕"][/caption]

此屏幕提供所有可用 Spring 模板的列表,包括前面提到的 3 个新的 Spring Integration 模板。如果您看到模板名称前面的那个小箭头,这意味着实际的模板尚未下载。下载完成后,模板将缓存在您的计算机上,您无需再次下载模板文件,除非您按下刷新

本周 Spring - 2012年4月3日

工程 | Josh Long | 2012年4月4日 | ...

欢迎来到本周 Spring的另一期。 Cloud Foundry 开放巡回赛正在进行中,到目前为止,这些活动非常成功,吸引了许多社区成员。

There are still some (well, there were yesterday!) early bird spots in the upcoming shows in <a href = "http://opentour.cloudfoundry.com/2012/austin">Austin</A>, <a href = "http://opentour.cloudfoundry.com/2012/washington">Washington D.C.</a>, <a href = "http://opentour.cloudfoundry.com/2012/kiev">Kiev</A>, <a href = "http://opentour.cloudfoundry.com/2012/moscow">Moscow</A>, and <a href  = "http://opentour.cloudfoundry.com/2012/london">London</A>, so book now. 

  1. 一些来自Spring I/O 大会的精彩内容现已上线!这场于今年 2 月在西班牙举行的大会,使用西班牙语和英语进行,因此无论您说哪种语言,都有很多值得一看的内容。Adrian Colyer 的主题演讲非常棒,开头几分钟的音频问题除外。我找不到 SpringIO 特定的标签,但您可以通过向下滚动轻松地从其他视频中挑选出来。敬请期待,很快就会发布更多内容。
  2.  <LI> Tobias Fiohre (who  seemingly lives  <EM>only</Em> to please us, the lucky developers in the  Spring community!)  has put up…

本周 Spring - 2012年3月27日

工程 | Josh Long | 2012年3月28日 | ...

欢迎来到本周 Spring的另一期。和往常一样,我们有很多内容要介绍。在发布这篇文章时,Cloud Foundry 开放巡回赛正在北京举行,并很快将来到您附近的城市。这个节目是一个非常独特的机会,可以从专家那里了解有关 Cloud Foundry 和 Spring 的更多信息 - 不要错过,立即注册。

  1. Spring Web 大神Rossen Stoyanchev宣布Spring Web Flow 2.3.1 已发布。这是一个维护版本,其中包含升级到 Spring 3.1.1 和 JavaServer Faces 2.1.7 以及许多错误修复。
  2. SpringSource Tool Suite 负责人Martin Lippert宣布发布Eclipse 的 Cloud Foundry 集成 1.0。此版本为所有 Eclipse 发行版(包括SpringSource Tool Suite)带来了完整、连贯的Cloud Foundry集成。
  3. Martin宣布发布SpringSource Tool Suite 2.9.1 版本,其中包含新功能和错误修复。
  4. <LI>    <a href = "http://www.springone2gx.com/conference/speaker/mark_fisher">Mark Fisher</A> and <a href = "http://www.springone2gx.com/conference/speaker/thomas_risberg">Thomas Risberg</A>'s epic talk from <a href = "http://www.springone2gx.com">SpringOne 2GX 2011</A>  - <EM><A href = "http://www.infoq.com/presentations/Architecture-Choices-for-Scalable-Cloud-Apps">Architecture Choices for Scalable Cloud Apps</A></EM> -  that introduces how to build scalable architectures in the cloud using technologies like Spring Integration and Cloud Foundry is now up on InfoQ. 
    	  </LI>
    	
    
  5. Maciej Walkowiak 发布了一篇博文,介绍了如何在Spring 3.1 配置文件结合一些自定义 Tomcat 配置来激活 Spring 配置文件,而无需更改已部署的二进制文件。
  6. Michal Jastak 发布了一篇精彩的文章,介绍了如何使用Spring MVC 3.1 对闪存属性的支持
  7. Tobias Flohre 再次发力,这次发布了两篇关于Spring Batch的文章。第一篇文章介绍了Spring Batch 中事务的基础知识,第二篇文章介绍了一些重新启动基于游标的读取器和写入器的细节
     </LI> 
    
  8. Artur Mkrtchyan 发布了一篇很棒的文章,介绍了如何安装Redis(一个快速、高度优化的数据结构服务器)以及如何使用Spring Data Redis(Spring Data 伞形项目的一部分,该项目简化了对各种所谓的 NoSQL 和大数据存储的访问)构建与 Redis 通信的 Spring 应用程序

使用 Grails 保护数据绑定

工程 | Jeff Scott Brown | 2012年3月28日 | ...

介绍

Grails 框架为 Web 应用程序开发人员提供了许多工具和技术,以简化解决常见应用程序开发挑战。

其中包括一些简化与数据绑定相关的复杂且繁琐问题的内容。通常,Grails 使数据绑定变得非常简单,因为它提供了多种将数据映射绑定到对象图的技术。

应用程序开发人员必须了解每种技术的含义,以便确定哪种技术最适合任何给定的用例,并最安全。

Web 应用程序数据绑定概述

许多 Web 应用程序的一项非常常见的任务是让应用程序接受一组 http 请求参数并将这些参数绑定到对象。然后,该对象可能存储在数据库中,用于执行某种计算或用于执行某种应用程序逻辑。在 Grails 应用程序中,其中一些操作通常在控制器操作中执行,并且数据通常绑定到域对象。

考虑一个如下所示的域类

代码清单 1

class Employee {
    String firstName
    String lastName
    BigDecimal salary
}

可能会有…

获取 Spring 时事通讯

通过 Spring 时事通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部