SpringMoblie是SpringMvc的一个扩展项目,它旨在简化移动web应用程序的开发。 开源地址为 https://github.com/spring-projects/spring-mobile
它可以检测到访问当前服务器程序的请求是通过什么设备发起的(PC, 平板, 移动手机),并根据访问设备的不同,跳转到与设备相应的view.
Maven地址:
<org.springframework.mobile-version>1.1.3.RELEASE</org.springframework.mobile-version>
<!-- spring mobile -->
<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-device</artifactId>
<version>${org.springframework.mobile-version}</version>
</dependency>
先来看看它最常用的一个接口:
package org.springframework.mobile.device;
/**
这个接口用于检测当前请求的设备类型
*/
public interface Device {
/**
该方法用于确定当前客户端请求是否是PC端
*/
boolean isNormal();
/**
该方法用于确定当前客户端请求是否是移动设备 如苹果 安卓
*/
boolean isMobile();
/**
该方法用于确定当前客户端请求是否是平板设备 如 iPad
*/
boolean isTablet();
}
接着在Springmvc.xml 配置文件中添加 DeviceResolverHandlerInterceptor 拦截器:
<mvc:interceptors>
<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
</mvc:interceptors>
又或者你可以在web.xml中配置Filter:
<filter>
<filter-name>deviceResolverRequestFilter</filter-name>
<filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
</filter>
以上二种配置任选一种,他们起到的作用是一样的,笔者测试的是第一种,通过mvc 配置拦截器.
配置以上拦截器后你可以这样获取当前请求的设备类型:
Device currentDevice = DeviceUtils.getCurrentDevice(servletRequest)
当然我相信各位更希望它在@Controller(@RestController)的@RequestMapping("/") 中做为一个参数自动传递, 如下面这样:
@RequestMapping(value = "signin", method = RequestMethod.GET)
@ResponseBody
public String signin(Device device){
if(device.isNormal()){
return "访问设备类型为PC";
}
if(device.isMobile()){
return "访问设备类型为移动设备";
}
if (device.isTablet()){
return "访问设备类型为平板";
}
return null;
}
那么你需要配置DeviceWebArgumentResolver像下面这样:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
2. 用户偏好设置和站点管理.
Spring Moblie允许一个用户在应用程序的多个站点进行视图切换,考虑到一种原因,当前用户使用移动UI进行访问,然而他想要访问的内容移动UI并没有提供视图(或功能) 这时就需要进行视图切换.
2.1 通过用户点击来确定用户偏向于访问正常站点还是移动站点:
<a href="${currentUrl}?site_preference=normal">正常站点</a> | <a href="${currentUrl}?site_preference=mobile">移动站点</a>
2.2点击之后,Spring Moblie会把用户偏好选项存到Cookie里面,通过CookieSitePreferenceRepository类,当然你也可以自己存到Cookie里面或另行处理
2.3 配置拦截器SitePreferenceHandlerInterceptor:
<mvc:interceptors>
<beans:bean class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor" />
</mvc:interceptors>
默认情况下SitePreferenceHandlerInterceptor会默认通过CookieSitePreferenceRepository将用户选项存入Cookie
以下是SitePreferenceHandlerInterceptor代码,其中默认的构造函数会创建一个CookieSitePreferenceRepository,而CookieSitePreferenceRepository中的构造函数
会setCookieName将用户选项存入Cookie, 当然你可以插入另外一个Site偏好处理程序.
2.4 通过以上配置,可以通过以下代码或者用户首选项:
SitePreference sitePreference = SitePreferenceUtils.getCurrentSitePreference(servletRequest);
2.5 如果你想通过@Controller(@RestController)的@RequestMapping("/") 中做为一个参数自动传递,那么你需要和上面一样配置:
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
接着使用如下代码:
@RequestMapping(value = "signin", method = RequestMethod.GET)
public String signin(SitePreference site){
if(site==SitePreference.MOBILE){
return "为用户准备移动视图进行渲染";
}
if(site==SitePreference.NORMAL){
return "为用户准备PC视图进行渲染";
}
if(site==SitePreference.TABLET){
return"为用户准备平板视图进行渲染";
}
return null;
}
2.6 站点切换
如果你想将移动用户和PC用户放在二个不同的站点进行如PC用户访问 example.com 移动用户访问example.app.com 那么可以进行如下配置进行站点切换:
<mvc:interceptors>
<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
<beans:bean class="org.springframework.mobile.device.switcher.SiteSwitcherHandlerInterceptor" factory-method="mDot">
<beans:constructor-arg value="example.app.com" />
</beans:bean>
</mvc:interceptors>
Spring Mobile会自动帮你进行站点切换,当然你也可以将 factory-method 设置为 " urlPath",那么他将会把移动用户重定向到url地址,像下面这样:
<mvc:interceptors>
<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
<beans:bean class="org.springframework.mobile.device.switcher.SiteSwitcherHandlerInterceptor" factory-method="urlPath">
<beans:constructor-arg value="/m" />
</beans:bean>
</mvc:interceptors>
Spring Mobile会帮你重定向到
example.app.com/m
你也可以指定根目录在urlPath下面在加一个构造函数即可。 需要注意的是他们都会将设置的值默认注入到Cookie首选项中,并且他们在移动站点和正常站点是共享的。