Spring视图解析(ViewResolver)

embedded/2024/11/21 20:31:58/

在 Spring MVC 框架中,视图解析(ViewResolver)是一个重要的组件,负责将逻辑视图名称解析为具体的视图技术(如 JSP、Thymeleaf、Freemarker 等)。视图解析器使得控制器可以返回一个逻辑视图名称,而不是具体的视图资源路径,从而提高了代码的灵活性和可维护性。

1. 视图解析器的基本概念

1.1 逻辑视图名称(Logical View Name)
  • 定义:控制器方法返回的字符串,表示一个逻辑视图名称。这个名称不是具体的视图资源路径,而是由视图解析器解析为具体的视图。
  • 示例:控制器方法返回 "home",表示逻辑视图名称为 home
1.2 视图解析器(ViewResolver)
  • 定义:视图解析器是一个接口,负责将逻辑视图名称解析为具体的视图对象。Spring 提供了多种视图解析器实现,每种实现支持不同的视图技术。
  • 接口org.springframework.web.servlet.ViewResolver

2. 常见的视图解析器实现

2.1 InternalResourceViewResolver
  • 用途:用于解析 JSP 视图。
  • 配置
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver internalResourceViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
    }
  • 示例
    • 控制器方法返回 "home",解析为 /WEB-INF/views/home.jsp
2.2 ThymeleafViewResolver
  • 用途:用于解析 Thymeleaf 视图。
  • 配置
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());return templateEngine;}@Beanpublic TemplateResolver templateResolver() {TemplateResolver resolver = new ServletContextTemplateResolver();resolver.setPrefix("/WEB-INF/templates/");resolver.setSuffix(".html");resolver.setTemplateMode("HTML5");return resolver;}@Beanpublic ViewResolver thymeleafViewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());return resolver;}
    }
  • 示例
    • 控制器方法返回 "home",解析为 /WEB-INF/templates/home.html
2.3 FreeMarkerViewResolver
  • 用途:用于解析 FreeMarker 视图。
  • 配置
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic FreeMarkerConfigurer freeMarkerConfigurer() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("/WEB-INF/freemarker/");return configurer;}@Beanpublic ViewResolver freemarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();resolver.setPrefix("");resolver.setSuffix(".ftl");return resolver;}
    }
  • 示例
    • 控制器方法返回 "home",解析为 /WEB-INF/freemarker/home.ftl
2.4 TilesViewResolver
  • 用途:用于解析 Apache Tiles 视图。
  • 配置
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic UrlBasedViewResolver tilesViewResolver() {UrlBasedViewResolver resolver = new UrlBasedViewResolver();resolver.setViewClass(TilesView.class);return resolver;}@Beanpublic TilesConfigurer tilesConfigurer() {TilesConfigurer configurer = new TilesConfigurer();configurer.setDefinitions(new String[] {"/WEB-INF/tiles.xml"});return configurer;}
    }
  • 示例
    • 控制器方法返回 "home",解析为 Tiles 定义中的 home 视图。

3. 视图解析器的配置

3.1 XML 配置
  • 示例
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"/><property name="suffix" value=".jsp"/>
    </bean>
3.2 Java 配置
  • 示例
    @Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver internalResourceViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
    }

4. 多视图解析器

在某些情况下,可能需要使用多个视图解析器。Spring 允许配置多个视图解析器,并按顺序进行解析。

示例

@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver thymeleafViewResolver() {ThymeleafViewResolver resolver = new ThymeleafViewResolver();resolver.setTemplateEngine(templateEngine());resolver.setOrder(1); // 设置优先级return resolver;}@Beanpublic ViewResolver internalResourceViewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setOrder(2); // 设置优先级return resolver;}@Beanpublic SpringTemplateEngine templateEngine() {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver());return templateEngine;}@Beanpublic TemplateResolver templateResolver() {TemplateResolver resolver = new ServletContextTemplateResolver();resolver.setPrefix("/WEB-INF/templates/");resolver.setSuffix(".html");resolver.setTemplateMode("HTML5");return resolver;}
}

5. 视图解析器的工作流程

  1. 控制器返回逻辑视图名称:控制器方法返回一个逻辑视图名称,例如 "home"
  2. 视图解析器链:Spring 容器按照配置的顺序遍历视图解析器链。
  3. 解析逻辑视图名称:每个视图解析器尝试将逻辑视图名称解析为具体的视图对象。
  4. 返回视图对象:第一个成功解析逻辑视图名称的视图解析器返回具体的视图对象。
  5. 渲染视图:Spring MVC 将模型数据传递给视图对象,并渲染视图。

总结

Spring MVC 中的视图解析器(ViewResolver)是一个重要的组件,负责将逻辑视图名称解析为具体的视图技术。Spring 提供了多种视图解析器实现,每种实现支持不同的视图技术,如 JSP、Thymeleaf、FreeMarker 和 Apache Tiles。通过合理配置视图解析器,可以提高代码的灵活性和可维护性,简化视图管理。多视图解析器的配置使得在一个项目中使用多种视图技术成为可能。


http://www.ppmy.cn/embedded/139423.html

相关文章

2024-11-16----Android 11(全志H713)-----拉高LED灯

需求 屏背光亮起来的时候&#xff0c;LED灯 黄灯灭 绿灯亮 找到屏操作背光的驱动文件&#xff1a; longan/brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/fastlogo/fastlogo.c写下操作LED灯的方法&#xff0c;在合适的地方调用 #define setbit(x,y) x|(1<<y) …

1+X应急响应(网络)威胁情报分析:

威胁情报分析&#xff1a; 背景-网络安全事件&#xff1a; 高级威胁一直持续&#xff1a; 现状与问题-面临的挑战&#xff1a; 威胁情报在安全建设中的定位&#xff1a; 引入威胁情报的必要性&#xff1a; 政策驱动-新等保已实施&#xff1a; 威胁情报的概念&#xff1a; 威胁…

datawhale11月组队学习 模型压缩技术2:PyTorch模型剪枝教程

文章目录 一、 prune模块简介1.1 常用方法1.2 剪枝效果1.3 二、三、四章剪枝测试总结 二、局部剪枝&#xff08;Local Pruning&#xff09;2.1 结构化剪枝2.1.1 对weight进行随机结构化剪枝&#xff08;random_structured&#xff09;2.1.2 对weight进行迭代剪枝&#xff08;范…

GetVolumeInformation函数使用记录

函数原型 BOOL GetVolumeInformationA( [in, optional] LPCSTR lpRootPathName, [out, optional] LPSTR lpVolumeNameBuffer, [in] DWORD nVolumeNameSize, [out, optional] LPDWORD lpVolumeSerialNumber, [out, optional] LPDWORD lpMaximumComp…

火山引擎数据飞轮探索零售企业大促新场景:下放营销活动权限

“营销节奏变得更快了。” 小陈任职于一家国内知名服装零售企业&#xff0c;这是她在营销策划岗位的第三年&#xff0c;对于刚刚过去的双11&#xff0c;“节奏快”是她的第一感受。 女王节、618、双11、双12、年货节&#xff0c;是零售行业面临的主要线上活动时间点&#xff0c…

RPC框架负载均衡

什么是负载均衡&#xff1f; 当一个服务节点无法支撑现有的访问量时&#xff0c;会部署多个节点&#xff0c;组成一个集群&#xff0c;然后通过负载均衡&#xff0c;将请求分发给这个集群下的每个服务节点&#xff0c;从而达到多个服务节点共同分担请求压力的目的。 负载均衡主…

ubuntu20.04默认的python3.8升级到python3.10

Python 3.8 于 2019 年 10 月发布&#xff0c;距今已有五年时间。2024 年 10 月是 Python 3.8 版本发布的最后一个月&#xff0c;从 2024 年 10 月开始&#xff0c;如果存在安全错误&#xff0c;Python 开发团队将不会修复该错误。有必要把python3.8升级python3.10。 新加apt源…

15分钟学 Go 第 54 天 :项目总结与经验分享

第54天&#xff1a;项目总结与经验分享 目标&#xff1a;整理项目经验 一、课程概述 在经过前53天的学习后&#xff0c;今天我们将系统性地总结项目开发经验&#xff0c;包括架构设计、代码规范、性能优化、测试策略等方面的最佳实践。 二、项目经验总结表 领域关键点最佳…