Spring助力移动应用开发

工程 | Keith Donald | 2010年11月20日 | ...

SpringOne2gx大会上,我们宣布了在社交媒体和移动应用开发领域令人兴奋的新计划。几周前,Craig Walls 发布了Spring Social。今天,Roy Clarkson 发布了Spring MobileSpring Android。在这篇文章中,我想重点介绍这些项目,并分享Spring如何简化移动应用开发。

移动应用开发的选择

如果您今年参加了SpringOne2gx,您已经看到了Greenhouse,这是我们为社区构建的一个应用程序,它也作为Spring技术的参考和驱动程序。Craig 向您展示了Greenhouse的一些社交元素,例如将您的帐户连接到Twitter和Facebook的功能。还有一些移动元素。具体来说,Greenhouse同时作为一个移动Web应用程序,并拥有原生的Greenhouse for iPhone和Android客户端。

与当今许多组织一样,我们必须回答“要针对哪些移动平台?”这个基本问题。最终,我们选择为iPhone和Android用户投资原生体验,同时还开发了一个跨平台的移动Web应用程序。我们选择原生开发的动力在于该应用程序面向消费者,并且大量潜在消费者(应用程序开发人员)拥有iPhone和Android设备。同时,移动Web应用程序旨在提供可在跨平台上运行的良好基本体验,这在当今WebKit和HTML 5的兴起下是可能的。

从我们的开发工作中,产生了Spring Framework的贡献:首先,一个**Spring Mobile**项目,它为开发移动Web应用程序提供Spring MVC的扩展;其次,一个**Spring Android**项目,它支持开发与基于Spring的后端通信的原生Android客户端。我将依次向您介绍这些项目。

Spring Mobile

我们首先解决的问题是设计一个移动访客使用起来舒适的Web应用程序。虽然智能手机可能拥有功能强大的Web浏览器,但它仍然屏幕较小,这需要考虑在内。处理这个问题主要有两种方法:
  1. 检测发出Web请求的设备,并向移动设备提供单独的站点。
  2. 提供单个站点,但通过使用CSS 3媒体查询和JavaScript逐步增强桌面用户的体验。
您今天可以在网上找到这两种技术的示例;例如,会议网站Lanyrd通过客户端检测进行增强,而SpeakerRate使用服务器端检测将移动访客重定向到单独的站点(通过安装Firefox用户代理切换器并将您的用户代理设置为iPhone自行查看)。

在Greenhouse中,我们从服务器端检测开始。具体来说,我们的目标是如果设备是移动设备,则应用不同的页面布局。由此产生了一个通用的“设备解析器抽象”,这是Spring Mobile 1.0.0.M1的定义特性。此功能的一些亮点包括:

  1. 一个HandlerInterceptor,它使用DeviceResolver检测发出当前HttpServletRequest的设备。
  2. 能够将检测到的设备注入@Controller方法和视图模板中,从而根据设备类型改变逻辑。
以下是Greenhouse代码库中的一些使用示例。首先,查看来自/WEB-INF/spring/appServlet/servlet-context.xml的拦截器定义。

<interceptors>
    <!-- On pre-handle, detect the device that originated the web request -->
    <beans:bean class="org.springframework.mobile.device.mvc.DeviceResolvingHandlerInterceptor" />
</interceptors>

现在,一个JSP模板,如果设备不是移动设备,则有条件地呈现某些内容。


Please try again<c:if test="${!currentDevice.mobile}"> or <a href="<c:url value="/signup" />">sign up</a></c:if>.

最后,一个基于Tiles的页面布局,如果设备是移动设备,则会发生变化。


    <definition name="page" templateExpression="/WEB-INF/layouts/${currentDevice.mobile ? 'mobile/' : 'standard/'}page.jsp" />

除了这些功能外,Spring Mobile 1.0.0.M1还附带:

  1. 一个HandlerInterceptor,它将移动访客重定向到另一个URL。如果您移动站点确实是一个单独的应用程序,这将非常有用。例如,考虑一下Flickr,如果您从手机访问www.flickr.com,它会将您重定向到m.flickr.com
  2. 一个DeviceResolver实现,它委托给WURFL进行设备检测。WURFL提供了一个大型的设备及其功能数据库。当您需要了解发出请求的设备的更多信息时,例如其特定的屏幕尺寸、制造商、型号、首选标记或其他功能,这将非常有用。

最近,我们还开始探索使用CSS 3媒体查询JavaScript执行客户端检测。这种方法的优点是不需要特殊的服务器端处理,除非您打算改变发送到设备的语义内容,而不仅仅是优化样式。并非所有浏览器都支持媒体查询,因此它们可能不是您的选择,但如果您以基于WebKit的浏览器为目标的智能手机,那么您应该没问题。总的来说,首先为移动设备设计应用程序,然后逐步增强桌面设备的体验的方法对我来说感觉非常优雅。

Spring Android

对于Android客户端,出现了一系列不同的挑战。我们需要通过REST通过HTTPS与服务器交换数据,并且由于这些数据是特定于用户的,因此我们需要用户登录。我们选择使用OAuth,而不是使用基本身份验证(我们需要在设备本身上存储用户名和密码凭据)。

OAuth是一个新兴的标准,它提供了一种基于令牌的授权方案。本质上,用户名和密码将被交换为访问令牌,并且访问令牌用于请求受保护的资源。这意味着您只需要将访问令牌与设备一起存储以实现“记住我”功能。此外,我们选择实现登录过程,客户端将引导您访问服务器的网站以进行连接授权。这样,客户端就永远不会看到您的用户名和密码,如果您允许针对您的API开发第三方客户端(我们也希望鼓励这样做),这一点非常重要。最后,如果用户的手机被盗或以其他方式遭到破坏,则可以使访问令牌失效,而无需冒用户名和密码泄露的风险。

从这项工作中,产生了希望在Android环境中使用Spring Framework特定模块的愿望。具体来说,我们的目标是使用RestTemplate进行REST API调用,并使用Spring Security进行OAuth客户端。

我很高兴地宣布,Spring Android 的第一个里程碑版本发布了一个“Android就绪”的RestTemplate。我们在Greenhouse中使用它,我们鼓励您在您自己的Android应用程序中将其用作REST客户端。请查看下面的使用示例。


RestTemplate restTemplate = new RestTemplate(new CommonsClientHttpRequestFactory());
Event event = restTemplate.getForObject("https://myapp.com/event/{name}", Event.class, "springone2gx");

在未来的里程碑版本中,您可以期待在Android环境中支持更多Spring Framework,例如Spring Security OAuth客户端。

入门

最好的入门方法是亲身体验,在您自己的本地开发环境中浏览Greenhouse应用程序。作为参考,Greenhouse使用Spring Mobile和Spring Android项目,以及Spring MVC、Security、Social和Integration。该项目页面提供了一个指南,向您展示如何在几分钟内在本地环境中运行Web应用程序、iPhone客户端和Android客户端。

如果您对功能、路线图有任何疑问,或者只想与开发团队进行讨论,请访问我们的社区论坛。我们重视您的反馈。

总结

我对我们正在进行的所有新计划都感到非常兴奋,特别是我们在社交和移动领域所做的工作。这些项目的第一个里程碑仅仅是一个开始。我鼓励您参与对您有用的项目,并帮助我们使它们尽善尽美。

获取Spring简报

通过Spring简报保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部