Spring MVC ViewResolver视图解析器
ViewResolver 将控制器返回的逻辑视图名解析为具体的 View 对象,完成最终的页面渲染。
接口定义
Java
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
内置视图解析器
| 解析器 | 功能 |
|---|---|
| InternalResourceViewResolver | JSP 视图解析 |
| FreeMarkerViewResolver | FreeMarker 模板 |
| ThymeleafViewResolver | Thymeleaf 模板 |
| ContentNegotiatingViewResolver | 根据内容类型选择 |
| BeanNameViewResolver | 根据 Bean 名称解析 |
配置 JSP 视图解析器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setViewClass(InternalResourceView.class);
return resolver;
}
}
控制器使用
Java
@Controller
public class UserController {
@GetMapping("/users")
public String list(Model model) {
model.addAttribute("users", userService.findAll());
return "user/list"; // 解析为 /WEB-INF/views/user/list.jsp
}
}
多视图解析器配置
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver contentNegotiatingViewResolver() {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setViewResolvers(Arrays.asList(
jsonViewResolver(),
jspViewResolver()
));
return resolver;
}
@Bean
public ViewResolver jspViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setOrder(2);
return resolver;
}
}
自定义视图解析器
Java
public class PdfViewResolver implements ViewResolver {
@Override
public View resolveViewName(String viewName, Locale locale) {
if (viewName.startsWith("pdf:")) {
return new PdfView(viewName.substring(4));
}
return null;
}
}
视图解析器可通过 Order 接口设置优先级,数值越小优先级越高。
要点总结
- ViewResolver 解析逻辑视图名为 View 对象
- prefix 和 suffix 自动拼接完整路径
- 支持配置多个解析器按优先级顺序解析
- ContentNegotiatingViewResolver 支持响应多种内容格式
📝 发现内容有误?点击此处直接编辑