Spring Mobile——探測客戶端設備和系統

今天閒來無事,瀏覽Spring的官方網站,發現了Spring Mobile項目,之前也看到過,還以為是針對手機端的項目,並沒有細看。今天仔細看了一下,原來是可以探測請求端的設備和系統。比如是手機、平板、還是正常的PC網站。它是Spring MVC的擴展,主要的目的是簡化手機web應用的開發。

它的主要特點是:

  • 在服務端探測發起請求的設備,手機或平板等。

  • 管理站點,統計每個用戶的偏好。

  • 根據請求設備的不同,返回適合該設備的視圖

  具體的在項目中使用也非常的簡單,例如我們使用Spring Boot搭建項目,然後引入Spring Mobile的starter,如下:

 org.springframework.boot spring-boot-starter-mobile

然後在application.properties文件中將sitepreference打開,如下:

spring.mobile.sitepreference.enabled=true

Spring Boot自動注入了3個類,DeviceResolverHandlerInterceptor,SitePreferenceHandlerInterceptor和SitePreferenceMethodArgumentResolver。DeviceResolverHandlerInterceptor是HandlerInterceptor的一個實現,從名字來看,它攔截到應用的請求,判斷髮送請求設備的類型。當設備解決以後,SitePreferenceMethodArgumentResolver允許SpringMVC在Controller中使用SitePreference實體。在內部,DeviceResolverHandlerInterceptor判斷請求頭中的User-Agent,基於請求頭中的值,判斷請求是否來自瀏覽器(桌面)、手機、還是Pad。

SitePreferenceHandlerInterceptor利用探測到的設備,判斷用戶的初始站點偏好。如果用戶喜歡另一個站點,則選擇該站點,並在隨後的請求中使用,以覆蓋已解析的設備值。站點偏好是通過請求中特殊的查詢字符串設置的。一旦接收到,偏好將被持久化到cookie中,以供將來參考。站點偏好功能在Spring Boot中默認是打開的,可以通過上面的設置關閉它。

這樣我們就可以使用Spring Mobile了,我們在Controller中加了如下代碼:

@RequestMapping("index")public String index(HttpSession session,Page page,SitePreference site,Device device){ System.out.println("site.isMobile:"+site.isMobile()); System.out.println("site.isTablet:"+site.isTablet()); System.out.println("site.isNormal:"+site.isNormal()); System.out.println("device.isMobile:"+device.isMobile()); System.out.println("device.isTablet:"+device.isTablet()); System.out.println("device.isNormal:"+device.isNormal()); System.out.println("device.Platform:"+device.getDevicePlatform()); System.out.println("site.name:"+site.name()); System.out.println(session.getId()); return null;}

運行後,後臺打印出的值如下:

site.isMobile:true

site.isTablet:false

site.isNormal:false

device.isMobile:true

device.isTablet:false

device.isNormal:false

device.Platform:ANDROID

site.name:MOBILE

測試時,我們可以通過瀏覽器的調試功能(F12),模擬不同的設備。這樣我們就可以捕獲到前端的設備類型了。

我們在開發時,可能針對不同的設備做不同的適配頁面。Spring Mobile也為我們提供了非常強大的視圖代理解析功能。我們只需要在applicaton.properties中配置即可。

spring.mobile.devicedelegatingviewresolver.enabled=truespring.mobile.devicedelegatingviewresolver.mobile-prefix=spring.mobile.devicedelegatingviewresolver.mobile-suffix=spring.mobile.devicedelegatingviewresolver.tablet-prefix=spring.mobile.devicedelegatingviewresolver.tablet-suffix=spring.mobile.devicedelegatingviewresolver.normal-prefix=spring.mobile.devicedelegatingviewresolver.normal-suffix=

我們將代理解析器打開,並配置3中設備類型的前綴和後綴。後6項也可以不配置,默認的3中類型的後綴都沒有,前綴手機類型的是/mobile,平板類型的是/tablet。瀏覽器是沒有前綴的,然後將3中視圖放在相應的目錄中,代碼如下:

@Controller

public class GreetingController {

@RequestMapping("/greeting")

public String greeting() {

return "greeting";

}

}

頁面如下:

Spring Mobile——探測客戶端設備和系統

這樣,3個不同的設備就會訪問不同的頁面,很方便吧。示例代碼在我的GitHub中,https://github.com/bigbugliu/spring-boot-demo。歡迎大家在評論區討論。

Spring Mobile——探測客戶端設備和系統


分享到:


相關文章: