躍入移動應用開發

工程 | 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 應用,並擁有原生的 iPhone 版 Greenhouse 和 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 Media Queries 和 JavaScript 逐步增強它以適應桌面使用者。
您今天可以在野外找到這兩種技術的例子;例如,會議網站 Lanyrd 透過客戶端檢測進行增強,而 SpeakerRate 則使用伺服器端檢測,將移動訪客重定向到另一個網站(安裝 Firefox User Agent Switcher 並將使用者代理設定為 iPhone,您就可以親自看看)。

在 Greenhouse 中,我們從伺服器端檢測開始。具體來說,我們的目標是在裝置是移動裝置時應用不同的頁面佈局。由此誕生了通用的“裝置解析器抽象”,這是 Spring Mobile 1.0.0.M1 的核心特性。該特性的一些亮點包括:

  1. 一個使用 DeviceResolver 檢測當前 HttpServletRequest 發起裝置的 HandlerInterceptor。
  2. 能夠將檢測到的 Device 注入到 @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. 一個將移動訪客重定向到另一個 URL 的 HandlerInterceptor。如果您的移動網站確實是一個獨立的應用程式,這會很有用。例如,Flickr,如果您透過手機訪問 www.flickr.com,它會將您重定向到 m.flickr.com
  2. 一個委託給 WURFL 進行裝置檢測的 DeviceResolver 實現。WURFL 提供了一個龐大的裝置及其功能資料庫。當您需要了解發起請求的裝置的更多資訊時(例如其具體的螢幕尺寸、製造商、型號、首選標記或其他功能),它會很有用。

最近,我們也開始探索結合 CSS 3 Media QueriesJavaScript 進行客戶端檢測。這種方法的優點是不需要特殊的伺服器端處理,除非您打算改變傳送給裝置的語義內容,而不僅僅是最佳化樣式。並非所有瀏覽器都支援 Media Queries,所以這可能不是您的選擇,但如果您目標使用者是使用基於 WebKit 的瀏覽器的智慧手機,您應該沒問題。總的來說,先為移動端設計應用,然後逐步增強以適應桌面端的方法對我來說感覺相當優雅。

Spring Android

對於 Android 客戶端,出現了一系列不同的挑戰。我們需要透過 HTTPS 經由 REST 與伺服器交換資料,並且由於這些資料是使用者特定的,我們需要使用者登入。我們沒有使用 Basic Auth(這將需要我們將使用者名稱和密碼憑證儲存在裝置本身),而是選擇了 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");

在未來的里程碑版本中,您可以期待 Spring Framework 的更多功能在 Android 環境中得到支援,例如 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 社群的所有近期活動。

檢視全部