在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>
若控制器返回的逻辑视图名称是home
,FreeMarkerViewResolver
会去查找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;
}
假设控制器返回的逻辑视图名称是home
,ThymeleafViewResolver
会查找对应的Thymeleaf模板文件进行渲染。
4. RedirectViewResolver
此视图解析器用于处理重定向视图。
工作原理:
- 当控制器返回以
redirect:
开头的逻辑视图名称时,RedirectViewResolver
会把请求重定向到指定的URL。
示例代码:
@RequestMapping("/redirect")
public String redirect() {
return "redirect:/newPage";
}
这里,控制器返回redirect:/newPage
,RedirectViewResolver
会将请求重定向到/newPage
。
工作流程总结
- 控制器处理请求后返回逻辑视图名称。
- Spring MVC框架获取所有配置好的视图解析器。
- 按照视图解析器的顺序,依次调用
resolveViewName
方法,尝试把逻辑视图名称解析为实际视图对象。 - 若某个视图解析器能成功解析,则使用该视图对象进行渲染;若都无法解析,则抛出异常。