【spring mvc】配置请求到视图名称转换器

ops/2024/10/21 3:35:55/

最近在开发项目中遇到springmvc在进行视图渲染时,pc端和移动端不是同一个页面的情况,需要将不同的设备类型解析到不同的视图进行渲染。

一、配置方式

这里我写了一个RequestToViewNameTranslatorImpl类实现了RequestToViewNameTranslator接口,并重写了获取视图名称的方法。

@Component(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME)
public class RequestToViewNameTranslatorImpl implements RequestToViewNameTranslator {private DefaultRequestToViewNameTranslator defaultRequestToViewNameTranslator = new DefaultRequestToViewNameTranslator();private DefaultRequestToViewNameTranslator mobileRequestToViewNameTranslator = new DefaultRequestToViewNameTranslator();public AuthserverRequestToViewNameTranslator() {mobileRequestToViewNameTranslator.setSuffix("_mobile");}@Overridepublic String getViewName(HttpServletRequest request) throws Exception {if(getDeviceType(request) == DeviceType.MOBILE) {return mobileRequestToViewNameTranslator.getViewName(request);}return defaultRequestToViewNameTranslator.getViewName(request);}private DeviceType getDeviceType(HttpServletRequest request) {return UserAgent.parseUserAgentString(request.getHeader("User-Agent")).getOperatingSystem().getDeviceType();}
}

需要注意的是:

1、Bean的名称必须是viewNameTranslator

(DispatcherServlet.REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME

2、类中我使用了UserAgent获取了设备类型,需要引入jar包:

<dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifactId><version>1.21</version>
</dependency>

二、原理

要了解此配置的实现机制需要看DispatcherServlet中的定义:

public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = "viewNameTranslator";private void initRequestToViewNameTranslator(ApplicationContext context) {try {this.viewNameTranslator =context.getBean(REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME, RequestToViewNameTranslator.class);if (logger.isDebugEnabled()) {logger.debug("Using RequestToViewNameTranslator [" + this.viewNameTranslator + "]");}}catch (NoSuchBeanDefinitionException ex) {// We need to use the default.this.viewNameTranslator = getDefaultStrategy(context, RequestToViewNameTranslator.class);if (logger.isDebugEnabled()) {logger.debug("Unable to locate RequestToViewNameTranslator with name '" +REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME + "': using default [" + this.viewNameTranslator +"]");}}
}

当DispatcherServlet初始化时会调用initRequestToViewNameTranslator方法,此方法会从ApplicationContext中去查找名称为viewNameTranslator的Bean对象,做为请求转换成视图名称的对象。

private void applyDefaultViewName(HttpServletRequest request, ModelAndView mv) throws Exception {if (mv != null && !mv.hasView()) {mv.setViewName(getDefaultViewName(request));}
}
protected String getDefaultViewName(HttpServletRequest request) throws Exception {return this.viewNameTranslator.getViewName(request);
}

applyDefaultViewName方法用于将请求转换成视图名称,需要注意的是,如果Controller中返回的有视图名称则不再使用请求获取视图名称。


http://www.ppmy.cn/ops/28746.html

相关文章

“Postman 中文版使用教程:如何切换到中文界面?”

Postman 的很好用的接口测试软件。但是&#xff0c;Postman 默认是英文版的&#xff0c;也不支持在软件内切换为中文版。很多同学的英语并不是很好&#xff0c;看到一堆的英文很是头痛。 今天我们来介绍下&#xff1a;切换到 Postman 中文版的方法。想要学习更多的关于 Postma…

超市购物|基于SprinBoot+vue的超市购物系统(源码+数据库+文档)

目录 基于SprinBootvue的企业人事管理系统 一、前言 二、系统设计 三、系统功能设计 1商品管理 2公告管理 3公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

Java虚拟机(jvm)常见问题总结

1.电脑怎样认识我们编写的Java代码 首先先了解电脑是二进制的系统&#xff0c;他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的&#xff0c;我们人可以认识&#xff0c;但是电脑不认识 Java文件编译的过程 1. 程…

妙手解迭:React Store数据迭代难题

在 React 中&#xff0c;当 store 中的数据无法迭代时,可以尝试以下几种方案: 检查数据结构 首先,请检查 store 中的数据结构是否符合预期。如果数据结构是一个普通对象而不是数组或者其他可迭代对象,那么无法直接使用 for...of 或 for...in 等方式进行迭代。 使用 Object.k…

WPF鼠标拖拽的最佳实现

WPF鼠标拖拽的最佳实现 在很多项目中都会遇到鼠标拖拽控件移动的需求&#xff0c;常见的有从在列表中拖拽列表项移动&#xff0c;拖拽控件移动等。 本文将介绍2种拖拽的简单的实现 列表项的拖拽 本文将使用 gong-wpf-dragdrop 这个github上的库来实现列表的拖拽的效果&…

【并行计算】【《并行程序设计导论》笔记】第三章:用MPI进行分布式内存编程

文章目录 3.1|预备知识编译与执行打印来自进程问候语句的MPI程序编译执行 通信子SPMD程序MPI_Send()方法status_p参数MPI_Send()和MPI_Recv()的语义潜在的陷阱 个人主页&#xff1a;丷从心 系列专栏&#xff1a;并行计算 3.1|预备知识 编译与执行 打印来自进程问候语句的MPI…

【Mac】Mac安装软件常见问题解决办法

前言 刚开始用Mac系统的小伙伴或者在更新系统版本后运行App的朋友会经常碰到弹窗提示「xxx已损坏&#xff0c;无法打开&#xff0c;您应该将它移到废纸篓」、「打不开xxx&#xff0c;因为Apple无法检查其是否包含恶意软件」、「打不开xxx&#xff0c;因为它来自身份不明的开发…

Elasticsearch 索引 blocks:深入探讨数据保护

Elasticsearch 作为搜索和分析数据的首选分布式引擎在技术领域脱颖而出&#xff0c;尤其是在处理日志、事件和综合文本搜索时。 它的与众不同之处在于它如何让你使用各种块选项调整对其索引的访问。 这对于那些负责技术项目的人&#xff08;比如管理员和编码员&#xff09;来说…