在Spring MVC里,视图解析器承担着把控制器返回的逻辑视图名称转换为实际视图对象的任务。下面为你介绍几种常见的视图解析器及其工作原理:

1. InternalResourceViewResolver

这是最常用的视图解析器,主要用于解析JSP视图。它会在逻辑视图名称前加上前缀,后加上后缀,从而得到JSP文件的实际路径。

工作原理

  • 从控制器获取逻辑视图名称。
  • 给逻辑视图名称添加配置好的前缀和后缀,得到实际的JSP文件路径。
  • 利用RequestDispatcher将请求转发到该JSP文件。

示例配置

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

假设控制器返回的逻辑视图名称是home,那么InternalResourceViewResolver会将其解析为/WEB-INF/views/home.jsp

2. FreeMarkerViewResolver

该视图解析器用于解析FreeMarker模板视图。

工作原理

  • 从控制器获取逻辑视图名称。
  • 依据配置的模板路径和文件扩展名,找到对应的FreeMarker模板文件。
  • 把模型数据传递给FreeMarker模板引擎进行渲染。

示例配置

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="true"/>
    <property name="prefix" value=""/>
    <property name="suffix" value=".ftl"/>
</bean>

若控制器返回的逻辑视图名称是homeFreeMarkerViewResolver会去查找home.ftl模板文件。

3. ThymeleafViewResolver

它用于解析Thymeleaf模板视图。

工作原理

  • 从控制器获取逻辑视图名称。
  • 根据配置的模板前缀和后缀,找到对应的Thymeleaf模板文件。
  • 把模型数据传递给Thymeleaf模板引擎进行渲染。

示例配置

@Bean
public ThymeleafViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine);
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
}

假设控制器返回的逻辑视图名称是homeThymeleafViewResolver会查找对应的Thymeleaf模板文件进行渲染。

4. RedirectViewResolver

此视图解析器用于处理重定向视图。

工作原理

  • 当控制器返回以redirect:开头的逻辑视图名称时,RedirectViewResolver会把请求重定向到指定的URL。

示例代码

@RequestMapping("/redirect")
public String redirect() {
    return "redirect:/newPage";
}

这里,控制器返回redirect:/newPageRedirectViewResolver会将请求重定向到/newPage

工作流程总结

  1. 控制器处理请求后返回逻辑视图名称。
  2. Spring MVC框架获取所有配置好的视图解析器。
  3. 按照视图解析器的顺序,依次调用resolveViewName方法,尝试把逻辑视图名称解析为实际视图对象。
  4. 若某个视图解析器能成功解析,则使用该视图对象进行渲染;若都无法解析,则抛出异常。