Spring MVC 中的视图解析


欢迎参阅本 Spring MVC 中利用 ViewResolver 接口的综合指南。作为 Spring MVC 框架的核心组件,ViewResolver 在把视图名称映射到实际视图方面起着至关重要的作用。无论你是 Spring MVC 初学者,还是想复习一下你的理解,本文都旨在提供全面详细的 ViewResolver

理解 Spring MVC 中的 ViewResolver

在 Spring MVC 中,ViewResolver 接口协助把控制器返回的逻辑视图名称映射到实际视图对象,例如 JSP 或 Thymeleaf 模板。它形成 MVC 架构的控制器和视图组件之间的桥梁,根据逻辑视图名称确定要显示哪个视图

Spring MVC 流程中 ViewResolver 的作用

Spring MVC 应用程序处理请求时,请求由 DispatcherServlet 接收,其随后将请求路由到合适的控制器。控制器执行所需的业务逻辑,并返回包含模型数据和视图逻辑名称的 ModelAndView 对象

这个逻辑视图名称传递到 ViewResolver,然后将其解析为特定的视图技术,例如 JSP、Thymeleaf 或 FreeMarker。DispatcherServlet 会把此视图和模型数据一起呈现在客户端。

实现 ViewResolver:分步骤指南

既然我们已经了解了 ViewResolver 的概念,现在让我们看看如何在 Spring MVC 应用程序中实现它。

步骤 1 − 设置项目

使用 Spring Boot Initializer 或 Spring STS 创建新的 Spring MVC 项目。包括 Spring Web MVC 和 Thymeleaf 等必要的依赖项

步骤 2 − 配置 ViewResolver

在典型的 Spring MVC 应用程序中,ViewResolver 是在应用程序的配置类中配置的,该类用 @Configuration 注释。以下是用 InternalResourceViewResolver 为 JSP 视图配置 ViewResolver 的示例

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.demo")
public class AppConfig implements WebMvcConfigurer {
   @Bean
   public ViewResolver viewResolver() {
      InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      resolver.setPrefix("/WEB-INF/views/");
      resolver.setSuffix(".jsp");
      resolver.setOrder(1);
      return resolver;
   }
}

在上面的代码中,我们设置了前缀和后缀以表示我们的视图是位于 /WEB-INF/views/ 目录中的 JSP 文件。setOrder(1) 方法设置此 ViewResolver 的优先级。

步骤 3 − 创建控制器

接下来,我们将创建一个返回 ModelAndView 对象的控制器。此处返回的逻辑视图名称将由我们的 ViewResolver 解析

@Controller
public class HomeController {
   @RequestMapping("/")
   public ModelAndView home() {
      ModelAndView modelAndView = new ModelAndView("home");
      modelAndView.addObject("message", "Welcome to Spring MVC!");
      return modelAndView;
   }
}

在上面的代码中,“home”是逻辑视图名称。我们的 ViewResolver 将此解析为 /WEB-INF/views/home.jsp。

步骤 4 − 创建视图

最后,在 /WEB-INF/views/ 目录中创建一个名为 home.jsp 的 JSP 文件。这是将呈现给用户的视图。

多个 ViewResolver

在更复杂的应用程序中,你可能希望使用多个 ViewResolver。例如,你可能希望对某些视图使用 Thymeleaf,对其他视图使用 JSP。在此方案中,你可以配置多个 ViewResolver 并使用 setOrder() 方法设置它们的优先级。顺序值最低的 ViewResolver 优先级最高。如果某个 ViewResolver 无法解析某个视图,将会尝试按顺序下一个 ViewResolver。

自定义 ViewResolver

虽然 Spring 为大多数流行的视图技术提供了开箱即用的 ViewResolver 实现,但你有时可能需要创建一个自定义 ViewResolver。如果你正在使用 Spring 开箱即不支持的视图技术,或者你需要更多控制如何解析视图的方式,则此方法会很有用。

要创建一个自定义 ViewResolver,你需要创建一个实现 ViewResolver 接口并重写 resolveViewName() 方法的类。以下是一个简单的示例 −

public class CustomViewResolver implements ViewResolver {
   @Override
   public View resolveViewName(String viewName, Locale locale) throws Exception {
      // Custom logic to resolve view
   }
}

在 resolveViewName() 方法中,你可以实现用于解析视图的自定义逻辑。完成后,你可以像其他任何 ViewResolver 一样将 CustomViewResolver 添加到应用程序的配置中

结论

Spring MVC 中的 ViewResolver 是一个至关重要的组件,它链接了 MVC 架构的控制器层和视图层。理解如何有效地配置和使用 ViewResolver 极大地提高了创建强大而灵活的 Spring MVC 应用程序的能力。

由于开箱即用支持广泛的视图技术,以及实现自定义视图解析策略的灵活性,ViewResolver 接口完美地诠释了 Spring 的“使常见情形容易,使复杂情形成为可能”的理念。

更新于: 19-Jul-2023

1K+ 查看

开启你的职业生涯

完成课程,获得认证

开始
广告
© . All rights reserved.