基于Spring提供支持不同设备的页面
基于Spring来检测访问Web页面的设备是很简单的,在这个经验中我们讲到过。通常不同的设备访问我们是通过响应式设计来统一处理各种设备的尺寸的。但是如果希望针对不同的设备,显示不同的内容呢?
Spring对于这一点同样提供了很好的支持,来看看如何实现。
准备工作
我们通过一个简单的例子来演示,基于Spring MVC来实现一个简单的HTTP GET请求,访问的地址是:
http://localhost:8080/greeting
- 如果从桌面浏览器访问这个地址,则返回的页面中显示:
Say hello from desktop
- 如果从手机浏览器访问这个地址:则返回的页面中显示
Say hello from mobile
- 如果从平板电脑访问这个地址:则返回的页面中显示
Say hello from tablets
先该准备好开发环境:
- IDE+Java环境(JDK 1.7或以上版本)
- Maven 3.0+(Eclipse和Idea IntelliJ内置,如果使用IDE并且不使用命令行工具可以不安装)
Maven POM文件的设置
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tianmaying.mobilecontent</groupId>
<artifactId>content-for-multiple-device</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>content-for-multiple-device</name>
<description>Demo of serving different content for desktop, mobile and tablet device</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mobile</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建Properties文件
Spring Boot能够针对不同设备渲染不同的视图(View),只需要在应用的Properties文件中中稍加配置即可。在src/main/resources/application.properties文件(没有这个文件,则自己创建这个文件)中增加一行:
spring.mobile.devicedelegatingviewresolver.enabled: true
针对一个请求,LiteDeviceDelegatingViewResolver
通过DeviceResolverHandlerInterceptor
识别出的Device
类型来判断返回哪种视图进行响应(桌面、手机还是平板),这一部分大家参考Spring如何识别设备的经验。
在这个例子中, LiteDeviceDelegatingViewResolver
会将请求代理给ThymeleafViewResolver
,作为Spring自身提供的正牌ViewResolver
,相比传统的视图技术如JSP,Velocity等,有不少过人之处,大家可以回顾一下Thymeleaf的介绍以及如何在Spring
MVC中使用Thymeleaf。默认情况下,Spring Boot去到**mobile/和tablet/**文件下去寻找移动端和平板端对应的视图进行渲染。当然你也可以在属性文件中进行设置,约定大于配置,没有特别需求用约定就好了。
创建Controller
Spring Boot的请求都是通过Controller的处理的。Controller的实现非常简单:
- 通过
@Controller
标注一个普通的类 - 通过
@RequestMapping
标注一个方法,设置该方法响应的URL地址和方法( 如@RequestMapping(method=GET
) - 在方法中填入Model,返回视图的名称
SayHelloController
package com.tianmaying.mobilecontent;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class SayHelloController {
@RequestMapping("/sayHello")
public String greeting() {
return "sayHello";
}
}
创建视图
最后让我们来创建Thymeleaf的视图模板,这里没什么模型的数据需要填充,只需要显示一句话即可:
sayHello.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'Say hello from desktop'" />
</body>
</html>
接下来我们创建存放移动端模板和平板端模板的目录:
└── src
└── main
└── resources
└── templates
└── greeting.html
└── mobile
└── greeting.html
└── tablet
└── greeting.html
在mobile和tablet目录下的HTML文件,内容大多是一样的,唯一不同的就是<p>
标签,分别为:
<p th:text="'Say hello from mobile'" />
<p th:text="'Say hello from tablet'" />
测试
最后我们通过main()
函数将这个SpringBootApplication
Run起来:
App.java
package com.tianmaying.mobilecontent;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
大家从不同的设备上访问http://localhost:8080/sayHello就能看到效果了。
基于Spring提供支持不同设备的页面的更多相关文章
- Spring Boot 使用 AOP 实现页面自适应
鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机.平板.电脑等设备.使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应 ...
- 实战基于Spring Boot 2的WebFlux和mLab搭建反应式Web
Spring Framework 5带来了新的Reactive Stack非阻塞式Web框架:Spring WebFlux.作为与Spring MVC并行使用的Web框架,Spring WebFlux ...
- 快速搭建基于Spring Boot + Spring Security 环境
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.Spring Security 权限管理框架介绍 简介: Spring Security 提供了基于 ...
- step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework
文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...
- 基于Spring MVC的Web应用开发(三) - Resources
基于Spring MVC的Web应用开发(3) - Resources 上一篇介绍了在基于Spring MVC的Web项目中加入日志,本文介绍Spring MVC如何处理资源文件. 注意到本项目的we ...
- Spring实战5:基于Spring构建Web应用
主要内容 将web请求映射到Spring控制器 绑定form参数 验证表单提交的参数 对于很多Java程序员来说,他们的主要工作就是开发Web应用,如果你也在做这样的工作,那么你一定会了解到构建这类系 ...
- 基于Spring的Web缓存
缓存的基本思想其实是以空间换时间.我们知道,IO的读写速度相对内存来说是非常比较慢的,通常一个web应用的瓶颈就出现在磁盘IO的读写上.那么,如果我们在内存中建立一个存储区,将数据缓存起来,当浏览器端 ...
- 基于Spring + Spring MVC + Mybatis 高性能web构建
基于Spring + Spring MVC + Mybatis 高性能web构建 一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJs,做了大量的研究,对前后端交互 ...
- 基于Spring Security 的JSaaS应用的权限管理
1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...
随机推荐
- 独立搭建zookeeper
1.如果你装了带有zookeeper的Hbase版本,先把hbase-env.sh export HBASE_MANAGES_ZK=false 设置为false 见下图 2.下载安装zookeep ...
- adxl345的STM32驱动程序和硬件设计
一.硬件电路接口图片 1.ADXL345硬件接口图片使用的是SPI端口进行通信,这样读取数据比较快且后续也可以转化为IIC通信接口. 在网上找一些发现IIC接口的比较多,所以本人就DIY做SPI的通信 ...
- Computer Transformation(规律,大数打表)
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- 达内TTS6.0课件basic_day04
- 删除: warning C4996: 'sprintf': This function or variable may be unsafe. Consider 方法
可以使用的最简单的方法: 选项Project | Configuration Properties | C/C++ | Preprocessor | Preproc ...
- 演练2-1:创建MVC默认项目
在VS2012中点击“文件 | 新项目”,在弹出对话框中选择“Visual C# | Web | ASP.NET MVC 4 Web应用程序”. 在弹出的模板对话框中选择“Internet应用程序”和 ...
- python 求值表达式解析
采用中缀转后缀的算法. 注意我输入的格式. #注意格式 def suffix(st): listopt=[" "] listnum=[" "] for i in ...
- poj 1182食物链(并查集)
算法思路:把那些确定了相对关系的节点放在同一棵树里(可以同时存在多棵树,单独每棵树中节点的相对关系确定),每个节点对应的 v[] 值记录他与根节点的关系( 0:同类: 1:根吃他: 2:他吃根 ).当 ...
- android圆形进度条ProgressBar颜色设置
花样android Progressbar http://www.eoeandroid.com/thread-1081-1-1.html http://www.cnblogs.com/xirihanl ...
- encode_utf8 把字符编码成字节 微信例子
##µ¼Èë encode_json decode_json use JSON qw/encode_json decode_json/; print "1111111111111111-\$ ...