SpringMVC之ViewResolver(三)

前言:在MVC架构中大家都知道Model、View 和 Controller,然而在我以前的理解中视图层就是展示数据给用户,给用户提供数据输入的终端,然而View做的事远不止这么多, 以springMVC为例, View还做了视图解析的事情, 将视图模板解析为相应的视图, 还要对视图进行渲染,虽然说出来只有一句话,可是后面做的事情可不止一点半点。其实这归结为View应该做的事情也不难理解,因为Controller在完成了视图名的定位之后控制层的工作已经完成了,而模型层并不参与业务流程的处理, 那么剩下的工作自然都属于视图层了。

配置jsp视图解析器

InternalResourceViewResolver所采取的方式会在视图名上加上前缀和后缀,进而确定一个web应用中得视图资源和物理路径。
因为WEB-INF路径下的资源在客户端是不能访问的,所以通常的实践是将jsp文件放到/WEB-INF/views/目录下, 避免客户端对其直接访问, 这样就只需要配置前缀和后缀名,就可以找到相应的视图了, 例如以下代码:

 @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("WEB-INF/views/");
        resolver.setPrefix(".jsp");
        return resolver;
    }

当控制器中返回的是 index 的时候, 这时它就会将视图名解析为jsp文件,它会去/WEB-INF/views/index.jsp, 控制器中返回的是books/detail 的时候将会被解析为/WEB-INF/views/books/detail.jsp,这时我们就可以很方便的组织目录结构了。

配置特殊的视图解析器

当控制器将模型数据打包之后,它接下来将数据模型返回给视图输出, 并跳转页面,但是在这里为了将控制器与视图解耦,所以Controller甚至不知道数据返回的视图不是jsp或者是其他别的格式,只返回一个视图名,那么后续的工作就应该由视图解析器来做了。例如:

public class ExcelView extends AbstractXlsxView {

    @Override
    protected void buildExcelDocument(
            Map<String, Object> map, Workbook workbook,
            HttpServletRequest httpServletRequest,
            HttpServletResponse httpServletResponse) throws Exception {
        workbook.write(httpServletResponse.getOutputStream());
    }
}

Andy
54 声望11 粉丝

Remember,Hope is a good thing,maybe the best of things and no good thing ever dies!