Spring MVC 视图解析器(JSP、Thymeleaf、Freemarker、 JSON/HTML、Bean)详解

Spring MVC 视图解析器详解


1. 视图解析器概述

视图解析器(ViewResolver)是 Spring MVC 的核心组件,负责将控制器返回的视图名称 (如 success)转换为具体的 View 对象(如 Thymeleaf 模板或 JSP 文件)。Spring 提供了多种视图解析器,支持不同的模板引擎和渲染方式。


2. 常用视图解析器详解

1. InternalResourceViewResolver

作用 :解析 JSP 或其他服务器端包含(JSP/Servlet)的视图,默认用于传统 JSP 开发

配置方式

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/"); // 视图文件路径前缀
        resolver.setSuffix(".jsp");            // 视图文件后缀
        resolver.setOrder(1);                  // 设置优先级(数值越小优先级越高)
        return resolver;
    }
}

使用示例

java 复制代码
@Controller
public class MyController {
    @GetMapping("/jsp")
    public String jspView() {
        return "hello"; // 实际路径:/WEB-INF/views/hello.jsp
    }
}

2. ThymeleafViewResolver

作用:解析 Thymeleaf 模板文件,需配合 Thymeleaf 依赖。

依赖:需添加 Thymeleaf 依赖:

xml 复制代码
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.12.RELEASE</version>
</dependency>

配置方式

java 复制代码
@Configuration
public class ThymeleafConfig {
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("classpath:/templates/"); // 模板文件路径
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        return resolver;
    }

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        resolver.setOrder(0); // 设置优先级
        return resolver;
    }
}

使用示例

java 复制代码
@Controller
public class MyController {
    @GetMapping("/thymeleaf")
    public String thymeleafView() {
        return "hello"; // 实际路径:src/main/resources/templates/hello.html
    }
}

3. FreeMarkerViewResolver

作用:解析 FreeMarker 模板文件。

依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

配置方式(Spring Boot 自动配置):

properties 复制代码
# application.properties
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftl

使用示例

java 复制代码
@Controller
public class MyController {
    @GetMapping("/freemarker")
    public String freemarkerView() {
        return "hello"; // 实际路径:src/main/resources/templates/hello.ftl
    }
}

4. ContentNegotiatingViewResolver

作用 :根据请求的 Accept 头或扩展名动态选择视图解析器,常用于 RESTful API 多媒体格式支持

配置方式

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
        ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
        List<ViewResolver> resolvers = new ArrayList<>();
        resolvers.add(new InternalResourceViewResolver()); // JSP
        resolvers.add(new ThymeleafViewResolver());        // Thymeleaf
        resolver.setViewResolvers(resolvers);
        return resolver;
    }
}

使用场景

  • 请求 /api/data.json → 返回 JSON 格式。
  • 请求 /api/data.html → 返回 HTML 模板。

5. BeanNameViewResolver

作用 :根据视图名称直接查找 BeanFactory 中的 View Bean,无需配置前缀/后缀

配置示例

java 复制代码
@Bean
public View myView() {
    InternalResourceView view = new InternalResourceView();
    view.setUrl("/WEB-INF/views/custom.jsp");
    return view;
}

@Bean
public BeanNameViewResolver beanNameViewResolver() {
    BeanNameViewResolver resolver = new BeanNameViewResolver();
    resolver.setOrder(2); // 优先级最低
    return resolver;
}

使用示例

java 复制代码
@Controller
public class MyController {
    @GetMapping("/bean")
    public String beanView() {
        return "myView"; // 直接匹配 Bean 名称
    }
}

3. 核心属性说明

视图解析器的通用属性:

属性 说明 示例
prefix 视图文件的路径前缀(如 /WEB-INF/views/)。 resolver.setPrefix("/templates/")
suffix 视图文件的后缀(如 .jsp, .html)。 resolver.setSuffix(".ftl")
order 优先级(数值越小优先级越高)。 resolver.setOrder(0)
viewClass 指定视图实现类(如 InternalResourceView)。 resolver.setViewClass(ThymeleafView.class)

4. 视图解析流程
  1. 请求处理 :控制器方法返回视图名称(如 success)。
  2. 解析匹配 :Spring 按 order 从小到大顺序调用视图解析器。
  3. 生成 View :第一个匹配的解析器将名称转换为具体 View 对象(如 Thymeleaf 模板)。
  4. 渲染响应View 对象填充数据并生成最终 HTML。

5. 总结表格
视图解析器 适用场景 核心配置属性
InternalResourceViewResolver JSP 或传统 Servlet 开发 prefix, suffix, viewClass = InternalResourceView
ThymeleafViewResolver Thymeleaf 模板开发 templateResolver, templateEngine
FreeMarkerViewResolver FreeMarker 模板开发 prefix, suffix
ContentNegotiatingViewResolver 动态选择视图格式(如 JSON/HTML) viewResolvers(集合其他解析器)
BeanNameViewResolver 直接绑定 Bean 名称到 View order(通常最低优先级)

6. 常见问题与解决方案
  • 视图文件找不到
    • 检查 prefix/suffix 配置是否正确。
    • 确认视图文件路径(如 src/main/resources/templates)。
  • 多个解析器冲突
    • 通过 order 属性调整优先级。
    • 确保不同解析器的 prefix 不重叠。
  • Thymeleaf/Freemarker 配置失败
    • 添加对应依赖并检查模板引擎配置(如 templateResolver)。

关键总结

  1. 选择解析器:根据项目使用的模板引擎(如 Thymeleaf、FreeMarker)选择对应解析器。
  2. 配置优先级 :通过 order 确定解析器处理顺序,避免冲突。
  3. 路径规范 :确保 prefix/suffix 正确指向视图文件位置。
  4. 混合使用 :通过 ContentNegotiatingViewResolver 支持多格式响应(如 RESTful API)。
相关推荐
风象南5 分钟前
SpringBoot中3种应用事件处理机制
java·spring boot·后端
我有医保我先冲6 分钟前
C++笔记
java·c++·笔记
helloworld工程师1 小时前
Spring AI应用:利用DeepSeek+嵌入模型+Milvus向量数据库实现检索增强生成--RAG应用(超详细)
人工智能·spring·milvus
我命由我123452 小时前
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
java·服务器·开发语言·jvm·后端·架构·java-ee
CopyLower3 小时前
分布式ID生成方案的深度解析与Java实现
java·开发语言·分布式
_zsw5 小时前
Spring三级缓存学习
学习·spring·缓存
m0_684598536 小时前
如何开发英语在线训练小程序:从0到1的详细步骤
java·微信小程序·小程序·小程序开发
ml130185288746 小时前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
Charlie__ZS6 小时前
SpringCloud - 分布式事务
分布式·spring·spring cloud
zybishe7 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计