spring mvc视图解析器核心是将逻辑视图名(如"user/list")按prefix/suffix拼接为真实路径(如/web-inf/views/user/list.jsp),支持internalresourceviewresolver(jsp/html)、thymeleafviewresolver等共存,通过order控制优先级,并可按目录隔离或扩展名路由;返回json则由@responsebody跳过视图解析。

Spring MVC 中配置视图解析器,核心是让控制器方法返回逻辑视图名(如 "user/list")时,框架能自动拼接前缀、后缀,定位到真实页面(如 /WEB-INF/views/user/list.jsp)。不同页面类型(JSP、Thymeleaf、FreeMarker)需配对应解析器,且可共存,按顺序匹配。
配置 InternalResourceViewResolver(适配 JSP/HTML)
这是最常用的视图解析器,专用于转发到 WEB-INF 下的 JSP 或静态 HTML 页面,防止用户直接访问受保护视图。
- 在 Spring 配置文件(
spring-mvc.xml)中声明:
-
prefix:统一加在逻辑视图名前,如"user/detail"→/WEB-INF/views/user/detail -
suffix:统一加在逻辑视图名后,最终路径为/WEB-INF/views/user/detail.jsp -
order:多个解析器存在时控制优先级,值越小越先尝试
配置 ThymeleafViewResolver(适配 Thymeleaf 模板)
若项目用 Thymeleaf 替代 JSP,需搭配 TemplateResolver 和 SpringTemplateEngine,再配置其专属解析器。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Maven 引入依赖:
- Java 配置类示例(Spring Boot 推荐):
public ThymeleafViewResolver thymeleafViewResolver(TemplateEngine templateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(0); // 优先于 JSP 解析器
return resolver;
}
此时返回 "admin/dashboard" 会查找 classpath:/templates/admin/dashboard.html(默认路径)。
多解析器共存与冲突处理
一个项目可同时支持 JSP 和 Thymeleaf(例如旧模块用 JSP,新模块用 Thymeleaf),关键靠 order 和视图名约定区分。
- 设 ThymeleafViewResolver 的
order = 0,InternalResourceViewResolver 的order = 1 - 控制器中可显式指定后缀来引导解析方向:
return "user/list :: thymeleaf";(不推荐)或更稳妥地——按目录隔离:return "thymeleaf/home"→ Thymeleaf 查找templates/thymeleaf/home.htmlreturn "jsp/login"→ JSP 查找/WEB-INF/views/jsp/login.jsp - 也可通过自定义
ViewResolver实现基于扩展名的路由,如返回"page.html"走 Thymeleaf,"page.jsp"走 InternalResource
返回 JSON 或其他非页面响应
如果控制器方法要返回 JSON 数据(如 REST API),不走视图解析流程,而是由 @ResponseBody 或 @RestController 触发消息转换器(HttpMessageConverter)。
- 确保配置了
<annotation-driven></annotation-driven>(XML)或启用 WebMvcConfiguration(Java)以激活 Jackson 支持 - 方法上加
@ResponseBody,或整个类用@RestController - 返回对象自动序列化为 JSON,不经过任何 ViewResolver
例如:
@GetMapping("/api/user")
@ResponseBody
public User getUser() {
return new User("zhangsan", 25);
}
返回的是 JSON 字符串,不是页面路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










