深入理解Spring MVC开发-视图和视图解析器

前言

视图是渲染数据模型展示给用户的组件码,在Spring MVC中又分为逻辑视图和非逻辑视图。逻辑视图是需要视图解析器的(ViewResolver)进一步定位的。例如,之前的例子中所返回的字符串之所以能够找到对应的HTML,就是因为使用了逻辑视图,经由视图解析器定位之后,才能找到视图将数据模型渲染展示给用户看。对于非逻辑视图,则并不需要进一步的定位视图位置,他指需要直接将视图模型渲染出来就可以。例如MappingJackson2JsonView视图就是这样的情况。在实际工作中视图解析器InternalResourceViewResolver是比较常用的,前面的章节也一直在使用他,相信读者已经对其比较熟悉了。

其他的视图解析器已经使用的差不多了,基于实用的原则,这里就不再介绍其他视图解析器的用法,本节主要任务是讨论Spring MVC中视图的使用,在使用视图之前,需要了解在Spring MVC中视图是怎么设计的。

1. 视图设计

对于视图,除了JSON和JSP视图之外,还有其他类型的视图,例如,Excel,PDF等等。虽然视图具有多样性,但是他们都会实现Spring MVC定义的视图接口View,其源代码清单如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.web.servlet;


public interface View {
//响应状态属性
    String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
//路径变量
    String PATH_VARIABLES = View.class.getName() + ".pathVariables";
    //选择内容类型
    String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";
//响应类型
    @Nullable
    default String getContentType() {
        return null;
    }
//渲染方法
    void render(@Nullable Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}

在这个代码中,有两个方法,其中getContentType方法是获取http响应类型的,它可以返回的类型是文本,JSON数据集或者文件等等,而render方法则是将数据模型渲染到视图的,这是视图的核心方法,所以有必要进一步讨论他。在她的参数中,var1是model模型,实际就是从控制器(或者由处理器自动绑定)返回的数据模型,这样render方法就可以把它渲染出来。渲染那视图是比较复杂的过程,为了简化视图渲染的开发,在Spring MVC中已经给开发者提供了许多开发好的视图类,所以在大部分情况下并不需要自己开发自己的视图。Spring MVC所提供的视图接口和类如图所示
在这里插入图片描述
注意,图中只是画出了常用的视图类,从途中可以看出,Spring MVC已经开发好了绝大部分的视图,所以大部分情况下,只需要定义如何将数据模型渲染到视图中展示给用户即可。例如,之前看到的MappingJackson2JsonView视图,因为他不是逻辑视图,所以并不需要使用视图解析器(ViewResolver)去定位视图,他会将数据模型直接渲染为JSON数据集展示给用户查看。而常用的视图JstlView,则是一个逻辑视图,于是可以在控制器返回一个字符串,使用视图解析器去定位对应的HTML文件,就能够找到对应的html文件,将数据模型传递进入,JstlView就会将数据模型渲染,展示数据给用户。对于PDF和EXCEL等类型的视图,衙门只需要接收数据模型,然后通过自定义的渲染即可。
文章中还有一个PDF视图的实例,我没需要,不写了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值