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

打印 上一主题 下一主题

主题 1535|帖子 1535|积分 4605

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Spring MVC 视图解析器详解


1. 视图解析器概述

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

2. 常用视图解析器详解


1. InternalResourceViewResolver

作用:解析 JSP 或其他服务器端包罗(JSP/Servlet)的视图,默认用于传统 JSP 开发
设置方式
  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3.     @Bean
  4.     public InternalResourceViewResolver internalResourceViewResolver() {
  5.         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  6.         resolver.setPrefix("/WEB-INF/views/"); // 视图文件路径前缀
  7.         resolver.setSuffix(".jsp");            // 视图文件后缀
  8.         resolver.setOrder(1);                  // 设置优先级(数值越小优先级越高)
  9.         return resolver;
  10.     }
  11. }
复制代码
利用示例
  1. @Controller
  2. public class MyController {
  3.     @GetMapping("/jsp")
  4.     public String jspView() {
  5.         return "hello"; // 实际路径:/WEB-INF/views/hello.jsp
  6.     }
  7. }
复制代码

2. ThymeleafViewResolver

作用:解析 Thymeleaf 模板文件,需配合 Thymeleaf 依赖。
依赖:需添加 Thymeleaf 依赖:
  1. <dependency>
  2.     <groupId>org.thymeleaf</groupId>
  3.     <artifactId>thymeleaf-spring5</artifactId>
  4.     <version>3.0.12.RELEASE</version>
  5. </dependency>
复制代码
设置方式
  1. @Configuration
  2. public class ThymeleafConfig {
  3.     @Bean
  4.     public SpringTemplateEngine templateEngine() {
  5.         SpringTemplateEngine engine = new SpringTemplateEngine();
  6.         engine.setTemplateResolver(templateResolver());
  7.         return engine;
  8.     }
  9.     @Bean
  10.     public SpringResourceTemplateResolver templateResolver() {
  11.         SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
  12.         resolver.setPrefix("classpath:/templates/"); // 模板文件路径
  13.         resolver.setSuffix(".html");
  14.         resolver.setTemplateMode("HTML5");
  15.         return resolver;
  16.     }
  17.     @Bean
  18.     public ThymeleafViewResolver thymeleafViewResolver() {
  19.         ThymeleafViewResolver resolver = new ThymeleafViewResolver();
  20.         resolver.setTemplateEngine(templateEngine());
  21.         resolver.setCharacterEncoding("UTF-8");
  22.         resolver.setOrder(0); // 设置优先级
  23.         return resolver;
  24.     }
  25. }
复制代码
利用示例
  1. @Controller
  2. public class MyController {
  3.     @GetMapping("/thymeleaf")
  4.     public String thymeleafView() {
  5.         return "hello"; // 实际路径:src/main/resources/templates/hello.html
  6.     }
  7. }
复制代码

3. FreeMarkerViewResolver

作用:解析 FreeMarker 模板文件。
依赖
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-freemarker</artifactId>
  4. </dependency>
复制代码
设置方式(Spring Boot 自动设置):
  1. # application.properties
  2. spring.freemarker.template-loader-path=classpath:/templates/
  3. spring.freemarker.suffix=.ftl
复制代码
利用示例
  1. @Controller
  2. public class MyController {
  3.     @GetMapping("/freemarker")
  4.     public String freemarkerView() {
  5.         return "hello"; // 实际路径:src/main/resources/templates/hello.ftl
  6.     }
  7. }
复制代码

4. ContentNegotiatingViewResolver

作用:根据哀求的 Accept 头或扩展名动态选择视图解析器,常用于 RESTful API 多媒体格式支持
设置方式
  1. @Configuration
  2. public class WebConfig implements WebMvcConfigurer {
  3.     @Bean
  4.     public ContentNegotiatingViewResolver contentNegotiatingViewResolver() {
  5.         ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
  6.         List<ViewResolver> resolvers = new ArrayList<>();
  7.         resolvers.add(new InternalResourceViewResolver()); // JSP
  8.         resolvers.add(new ThymeleafViewResolver());        // Thymeleaf
  9.         resolver.setViewResolvers(resolvers);
  10.         return resolver;
  11.     }
  12. }
复制代码
利用场景


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

5. BeanNameViewResolver

作用:根据视图名称直接查找 BeanFactory 中的 View Bean,无需设置前缀/后缀
设置示例
  1. @Bean
  2. public View myView() {
  3.     InternalResourceView view = new InternalResourceView();
  4.     view.setUrl("/WEB-INF/views/custom.jsp");
  5.     return view;
  6. }
  7. @Bean
  8. public BeanNameViewResolver beanNameViewResolver() {
  9.     BeanNameViewResolver resolver = new BeanNameViewResolver();
  10.     resolver.setOrder(2); // 优先级最低
  11.     return resolver;
  12. }
复制代码
利用示例
  1. @Controller
  2. public class MyController {
  3.     @GetMapping("/bean")
  4.     public String beanView() {
  5.         return "myView"; // 直接匹配 Bean 名称
  6.     }
  7. }
复制代码

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. 视图解析流程


  • 哀求处理:控制器方法返回视图名称(如 success)。
  • 解析匹配:Spring 按 order 从小到大顺序调用视图解析器。
  • 生成 View:第一个匹配的解析器将名称转换为具体 View 对象(如 Thymeleaf 模板)。
  • 渲染相应:View 对象添补数据并生成终极 HTML。

5. 总结表格

视图解析器适用场景焦点设置属性InternalResourceViewResolverJSP 或传统 Servlet 开发prefix, suffix, viewClass = InternalResourceViewThymeleafViewResolverThymeleaf 模板开发templateResolver, templateEngineFreeMarkerViewResolverFreeMarker 模板开发prefix, suffixContentNegotiatingViewResolver动态选择视图格式(如 JSON/HTML)viewResolvers(集合其他解析器)BeanNameViewResolver直接绑定 Bean 名称到 Vieworder(通常最低优先级)
6. 常见标题与解决方案



  • 视图文件找不到

    • 检查 prefix/suffix 设置是否正确。
    • 确认视图文件路径(如 src/main/resources/templates)。

  • 多个解析器冲突

    • 通过 order 属性调整优先级。
    • 确保不同解析器的 prefix 不重叠。

  • Thymeleaf/Freemarker 设置失败

    • 添加对应依赖并检查模板引擎设置(如 templateResolver)。


关键总结


  • 选择解析器:根据项目利用的模板引擎(如 Thymeleaf、FreeMarker)选择对应解析器。
  • 设置优先级:通过 order 确定解析器处理顺序,避免冲突。
  • 路径规范:确保 prefix/suffix 正确指向视图文件位置。
  • 混淆利用:通过 ContentNegotiatingViewResolver 支持多格式相应(如 RESTful API)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表