能够检测多种设备类型的Spring Mobile

来源:互联网 发布:c语言翻译软件 编辑:程序博客网 时间:2024/06/05 09:50


Spring 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首选项中,并且他们在移动站点和正常站点是共享的。



    







 

    



原创粉丝点击