在 Spring MVC 中,视图名称(View Name) 和 视图解析器(ViewResolver) 主要用于 将控制器返回的逻辑视图名映射到具体的视图文件(如 JSP、Thymeleaf、Freemarker 等)。
1. 什么是视图名称(View Name)?
当 Controller 方法返回一个 字符串(逻辑视图名),Spring MVC 需要 将该逻辑视图名解析为具体的页面文件,这就是 视图解析器(ViewResolver) 的作用。
示例:返回视图名称
@Controller
public class HomeController {
@GetMapping("/home")
public String homePage() {
return "index"; // 逻辑视图名,不包含文件后缀
}
}
🔹 在上面的代码中,返回的是 "index",这 不是具体的文件路径,而是一个 逻辑视图名,需要视图解析器来解析它。
2. 什么是视图解析器(ViewResolver)?
Spring MVC 通过 视图解析器 来解析 Controller 返回的 视图名称,并映射到实际的前端页面,如:
• index.jsp
• index.html(Thymeleaf)
• index.ftl(Freemarker)
常见的视图解析器
|
视图解析器 |
适用于 |
说明 |
|---|---|---|
|
InternalResourceViewResolver |
JSP |
最常用的解析器,将逻辑视图名解析为 /WEB-INF/views/*.jsp |
|
ThymeleafViewResolver |
Thymeleaf |
解析 .html 页面 |
|
FreeMarkerViewResolver |
FreeMarker |
解析 .ftl 模板文件 |
3. 配置不同的视图解析器
(1)JSP 视图解析器
适用于 JSP 视图(默认存放在 WEB-INF/views 目录下)
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 视图文件存放路径
resolver.setSuffix(".jsp"); // 视图文件后缀
return resolver;
}
📌 解析过程
• return "index"; → /WEB-INF/views/index.jsp
(2)Thymeleaf 视图解析器
适用于 Thymeleaf 模板(默认存放在 resources/templates/ 目录下)
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
📌 解析过程
• return "index"; → classpath:/templates/index.html
(3)Freemarker 视图解析器
适用于 Freemarker 模板(默认存放在 resources/templates/ 目录下)
@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setPrefix("");
resolver.setSuffix(".ftl"); // Freemarker 文件后缀
return resolver;
}
📌 解析过程
• return "index"; → classpath:/templates/index.ftl
4. Spring Boot 自动配置视图解析
如果你使用 Spring Boot,无需手动配置视图解析器,Spring Boot 会自动帮你配置:
|
视图类型 |
默认目录 |
解析规则 |
|---|---|---|
|
JSP |
/src/main/webapp/WEB-INF/views/ |
return "index"; → /WEB-INF/views/index.jsp |
|
Thymeleaf |
/src/main/resources/templates/ |
return "index"; → /templates/index.html |
|
Freemarker |
/src/main/resources/templates/ |
return "index"; → /templates/index.ftl |
5. 什么时候用 @ResponseBody?
如果 Controller 直接返回 JSON 或字符串,而 不想使用视图解析器,可以使用 @ResponseBody 或 @RestController:
@RestController
public class ApiController {
@GetMapping("/api/data")
public String getData() {
return "Hello, JSON"; // 直接返回字符串,而不是视图名称
}
}
🔹 区别
• return "index"; → 视图解析器解析成页面(如 index.jsp)
• @ResponseBody return "Hello"; → 直接返回字符串,前端直接收到 "Hello"
总结
1. 视图名称:Controller 方法返回的 逻辑视图名,如 "index",不是具体文件路径。
2. 视图解析器(ViewResolver):
• 解析视图名称,映射到具体的 JSP、Thymeleaf、Freemarker 文件。
• 例如,return "index"; 在不同视图解析器下:
• JSP → /WEB-INF/views/index.jsp
• Thymeleaf → /templates/index.html
• Freemarker → /templates/index.ftl
3. Spring Boot 默认视图解析器:
• JSP:/WEB-INF/views/
• Thymeleaf:/templates/
• Freemarker:/templates/
4. 返回 JSON 数据 时,使用 @RestController 或 @ResponseBody。
浙公网安备 33010602011771号