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

news/2024/9/24 16:26:54/

最近在开发项目中遇到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/news/1442808.html

相关文章

node 项目启动报 ERROR Failed to compile with 1 errors 错误

问题 node项目通过npm run dev启动时出现ERROR Failed to compile with 1 errors 错误&#xff0c;具体信息如下&#xff1a; ✖ WebpackCompiled with some errors in 366.81msERROR Failed to compile with 1 errors …

基于单片机的多功能电子万年历系统

摘要:该题目要求学生综合运用单片机原理、低频电子线路、数字电路与逻辑设计等相关知识,设计完成多功能电子万年历系统。通过完成设计任务,使学生掌握单片机设计开发的基本流程,增强学生动手实践能力,培养学生分析和解决实际问题的能力,为后续课程的学习和工作打下良好基础。 关…

iOS 获取到scrollView停止拖动时候的速度

在 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { self.velocity velocity.y; } 方法中得到手势离开的时候的速度 - (void)scrollViewWillEndDragging:(UIScro…

盲人出行挑战与曙光:“盲人视觉辅助技术研发”助力无障碍生活

作为一名资深记者&#xff0c;我深感盲人朋友们在日常出行中面临的种种困难。然而&#xff0c;在科技日新月异的今天&#xff0c;一项名为蝙蝠避障的专为盲人视觉辅助技术研发的领域正在以前沿科技成果&#xff0c;为改善盲人出行困境带来希望之光。本文将深入探讨这一技术如何…

第八周学习笔记DAY.5-实用类介绍

String类 String类位于java.lang包中&#xff0c;具有丰富的方法&#xff1a;计算字符串的长度、比较字符串、连接字符串、提取字符串 length()方法 String类提供了length()方法&#xff0c;确定字符串的长度 equals()方法 String类提供了equals( )方法&#xff0c;比较存…

Windows下Git的使用

目录 一、克隆远程仓库到本地二、git的三板斧2.1 add-将代码添加到本地仓库2.2 commit-提交代码到本地仓库2.3 push-推送本次添加操作到远程仓库2.4 gitee只有三板斧吗&#xff1f; 三、推送后没有出现绿点四、push到远程时报错五、git图形化界面下载链接 一、克隆远程仓库到本…

数据结构-简单队列

1.简介 队列为一个有序列表&#xff0c;可以用数组或链表来实现。 先进先出原则。先存入队列的数据先取出&#xff0c;后存进队列的数据后取出。 这里对比一下&#xff0c;栈是后来者居上 下面使用数组来模拟队列&#xff0c;用数组的结构来存储队列的数据&#xff1a; Que…

网页使用之如何返回json/xml

后端返回json数据给前端进行渲染的方式比较熟悉&#xff0c;至于返回html页面&#xff0c;返回xml的方式接触逐渐减少&#xff0c;来在项目中熟悉这一点。 返回文本数据 json姿势的返回实属最简单的方式&#xff0c;在SpringBoot应用中&#xff0c;有两种简单的方式 1.直接在…