界面自适应java_Spring Boot 使用 AOP 实现页面自适应

本文介绍了如何在 Spring Boot 应用中利用 AOP 技术实现实现页面自适应。通过拦截请求,根据 User-Agent 判断设备类型,并修改 Controller 返回的页面路径,以适应不同设备的页面需求。详细步骤包括添加 AOP 依赖,定义枚举类型,编写 User-Agent 工具类,创建切面处理逻辑,并给出示例代码。
摘要由CSDN通过智能技术生成

鉴于复杂页面自适应的难度,一般会做几套模板分别适应手机、平板、电脑等设备。使用 Spring Boot 开发单体应用时,一般会使用 Thymeleaf 模板,那么可以使用 AOP 技术来实现页面自适应。

a8e4fd48f2766e47e35ba7de79cc2008.png

如图所示,与普通项目相比而言,我们需要拦截用户的请求,获取 Request 中的 Header 的 User-Agent 属性,来判断用户的设备信息,然后修改 Controller 返回的页面路径,来适应设备的页面路径,从而达到页面自适应的效果。

代码实现

假设我们的静态资源目录如下

resources/

|-- mobile/

|-- index.html #手机版首页

|-- index.html #电脑版首页

1、添加 aop 的相关依赖

org.springframework.boot

spring-boot-starter-aop

2、定义设备的枚举类型 UserAgentTypeEnum.java

/**

* UserAgentType 枚举

*/

public enum UserAgentTypeEnum {

// 电脑

PC(0),

// 平板电脑

TABLET(1),

// 手机

PHONE(2);

private int code;

UserAgentTypeEnum(int code){

this.code = code;

}

public int getCode() {

return code;

}

}

3、添加 UserAgent 识别工具类

/**

* User-Agent 工具

*/

public class UserAgentTools {

/**

* 识别设备类型

* @param userAgent 设备标识

* @return 设备类型

*/

public static Integer recognize(String userAgent){

if(Pattern.compile("(Windows Phone|Android|iPhone|iPod)").matcher(userAgent).find()){

return UserAgentTypeEnum.PHONE.getCode();

}

if(Pattern.compile("(iPad)").matcher(userAgent).find()){

return UserAgentTypeEnum.TABLET.getCode();

}

return UserAgentTypeEnum.PC.getCode();

}

}

4、添加切面处理逻辑,实现设备识别和页面路径修改,假设 Controller 类包 cn.ictgu.controller 下

/**

* AOP 实现页面自适应

*/

@Aspect

@Component

@Log4j2

public class DeviceAdapter {

private static final String MOBILE_PREFIX = "mobile/";

/**

* 切入点:cn.ictgu.controller 下所有 @GetMapping 方法

*/

@Pointcut("execution(* cn.ictgu.controller..*(..)) && @annotation(org.springframework.web.bind.annotation.GetMapping)")

public void controllerMethodPointcut() {

}

/**

* 识别用户请求的设备并返回对应的页面

*/

@Around("controllerMethodPointcut()")

public String around(ProceedingJoinPoint joinPoint) {

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

if (attributes != null) {

try {

HttpServletRequest request = attributes.getRequest();

String userAgent = request.getHeader("User-Agent");

log.info(userAgent);

Integer deviceType = UserAgentTools.recognize(userAgent);

String path = (String) joinPoint.proceed();

return deviceType == UserAgentTypeEnum.PHONE.getCode() ? MOBILE_PREFIX + path : path;

} catch (Throwable e) {

e.printStackTrace();

}

}

throw new RuntimeException("DeviceAdapter,ServletRequestAttributes is null!");

}

}

5、至此,基于 AOP 的页面自适应就完成了。示例:

@GetMapping(value = "/index")

public String index() {

return "index";

}

手机访问就会得到 mobile/index.html 的页面,其他设备就会得到 index.html 的页面。

转载请注明出处,谢谢!

有兴趣一起写代码的,可以 加入我们,基于 Spring Boot 2.x 版本的最佳实践。项目及演示地址 http://im.ictgu.cn/

开源, 等你!

http://www.spring4all.com/article/169

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值