SpringBoot整合Spring Mobile框架实现终端页面的分离

前言

做了一款基于WEB端的系统,又想着可以在手机上打开;即使做了页面样式和自动缩放的兼容,但是在手机巴掌大的地方,依旧拥挤不堪,页面上元素多一点,就惨不忍睹,无法入眼。无意中看到有Spring Mobile这么一个框架,这个框架到底是用来干什么的呢,忍不住了解了一下。

Spring Mobile 简介,来自官方的介绍
Spring Mobile是一个框架,它提供了检测向您的Spring web站点发出请求的设备类型的功能,并提供基于该设备的替代视图。与所有Spring项目一样,Spring Mobile的真正强大之处在于它可以很容易地进行扩展。

通过这个介绍,可以了解到Spring Mobile是检测终端设备类型的框架,根据终端类型匹配到具体的页面,和Spring其他框架一样,容易扩展,插拔式的,接下来就看看这款框架在SpringBoot中如何使用的,由于这款框架已停止更新,所以整合SpringBoot的demo在网上几乎找不到。

首先,在pom中引入SpringBoot整合Spring Mobile的架包;这个demo用到了web和thymeleaf框架,顺带一起引入。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- SpringBoot与Spring mobile框架的整合 -->
<dependency>
     <groupId>org.springframework.mobile</groupId>
    <artifactId>spring-mobile-starter</artifactId>
     <version>2.0.0.M3</version>
    <type>pom</type>
</dependency>   

只引入SpringBoot整合Spring Mobile的这一个架包还不够,还需要引入repository,不然会报错,这里使用的是SpringBoot2.1.5;

<repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

第二步,测试代码,通过不同终端的调用,判断终端的类型;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mobile.device.Device;
import org.springframework.mobile.device.site.SitePreference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 判断终端设备
 * @author 程就人生
 * @Date 2020年5月13日上午11:40:29
 */
@RestController
@RequestMapping("/index")
public class IndexController {

    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    /**
     * 使用device判断请求的终端类型
     * @param device
     */
    @RequestMapping
    public void index(Device device) {
        //手机
        if (device.isMobile()) {
            logger.info("Hello mobile user!");
        } else if (device.isTablet()) {
            //平板
            logger.info("Hello tablet user!");
        } else {
            //PC
            logger.info("Hello desktop user!");
        }
    }
    
    /**
     * 使用SitePreference判断请求的终端类型
     * @param sitePreference
     */
    @RequestMapping("/test")
    public void home(SitePreference sitePreference) {
        //手机
        if (sitePreference == SitePreference.MOBILE) {
            logger.info("Site preference is mobile");
        } else if (sitePreference == SitePreference.TABLET) {
            //平板
            logger.info("Site preference is tablet");
        } else {
            //其他
            logger.info("no site preference");
        }
    }

}

这里在Controller层,增加了Device接口或SitePreference枚举类来判断终端的类型;

第三步,测试,使用手机或浏览器输入url地址,查看日志打印的类型;
PC浏览器输入:http://localhost:8080/index
手机使用的是WiFi,使用微信或浏览器,输入:http://192.168.10.6:8080/index

测试结果图

第一个输出,是使用PC端浏览器输入的,第二个是在微信里打开的,第三个是用手机浏览器打开的。

如果每个页面对请求的终端都这样判断,在Controller层里需要修改的代码也是相当多的,有没有办法,统一设置,根据文件夹区分一下跳转的页面?答案是可以的,下面就来看看怎么做?

第四步,在配置文件里加入开启页面跳转的配置;

#根据终端类型,自动跳转到对应的文件夹,Controller层代码无需任何修改;
spring.mobile.devicedelegatingviewresolver.enabled=true
源文件配置文件夹

第五步,增加Controller层代码;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自动配置,根据终端类型跳往至对应的页面
 * @author 程就人生
 * @Date
 */
@RestController
public class IndexController2 {

    private static final Logger log = LoggerFactory.getLogger(IndexController2.class);

    /**
     * 使用device判断请求的终端类型
     * @param device
     * @return
     */
    @RequestMapping("/index2")
    public ModelAndView index() {
        ModelAndView modelAndView = new ModelAndView("index");  
        log.info("直接到位到指定的页面!");
        return modelAndView;
    }

}

第六步,增加页面代码;
正常情况下,页面代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>欢迎页面</title>
</head>
<body>
<h5 >电脑访问</h5>
</body>
</html>

手机页面代码如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>手机访问欢迎页面</title>
</head>
<body>
<h1>手机访问</h1>
</body>
</html>
页面文件结构如图所示

最后,测试;

电脑端的浏览器访问

微信访问

手机浏览器访问

总结
Spring Mobile在2018时就停止更新了,网上关于SpringBoot整合SpringMoblie的例子非常少,今天再回顾时,居然找不到spring-mobile-starter的出处了,又努力了一把,终于把它翻出来了。
spring-mobile-starter引用地址:
https://mvnrepository.com/artifact/org.springframework.mobile
待点开spring-mobile-starter的pom文件时,才发现,这里使用的是spring-mobile-autoconfigure框架,而不是spring-mobile-device的;按照时间来排序,spring-mobile-starter的版本才是最新更新的。

maven引入地址参考

参考资料:
https://spring.io/projects/spring-mobile#overview

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,412评论 6 532
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,514评论 3 416
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,373评论 0 374
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,975评论 1 312
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,743评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,199评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,262评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,414评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,951评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,780评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,983评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,527评论 5 359
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,218评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,649评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,889评论 1 286
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,673评论 3 391
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,967评论 2 374