Spring Mobile检测多种设备类型

spring mobile框架是一个很小的,用于获取设备信息,然后跳转到不同视图的框架。

集成方式

一、pring Moblie是什么?

      SpringMoblie是SpringMvc的一个扩展项目,它旨在简化移动web应用程序的开发。 开源地址为 https://github.com/spring-projects/spring-mobile

二、Spring Moblie可以做什么?

         它可以检测到访问当前服务器程序的请求是通过什么设备发起的(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首选项中,并且他们在移动站点和正常站点是共享的。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值