首页/ 学科题库/ SpringMVC/ Spring MVC ViewResolver视图解析器
SpringMVC 实战教程

Spring MVC ViewResolver视图解析器

2026-05-18 约 8 分钟 juanwangdev

Spring MVC ViewResolver视图解析器

ViewResolver 将控制器返回的逻辑视图名解析为具体的 View 对象,完成最终的页面渲染。

接口定义

Java
public interface ViewResolver {
    View resolveViewName(String viewName, Locale locale) throws Exception;
}

内置视图解析器

解析器功能
InternalResourceViewResolverJSP 视图解析
FreeMarkerViewResolverFreeMarker 模板
ThymeleafViewResolverThymeleaf 模板
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 支持响应多种内容格式
想在手机上练这篇的配套题目?
使用微信 卷王开发者小程序/App,首页顶部扫一扫识别下方二维码,即可解锁本讲对应真题与错题本。
了解产品 App
← 上一篇 Spring MVC Controller控制器 下一篇 → 请求映射注解