我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在 Spring MVC 中,视图名称(View Name)视图解析器(ViewResolver) 主要用于 将控制器返回的逻辑视图名映射到具体的视图文件(如 JSPThymeleafFreemarker 等)。

 


 

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

posted on 2025-04-05 00:21  我就是奇迹  阅读(78)  评论(0)    收藏  举报