资讯专栏INFORMATION COLUMN

SpringMVC之源码分析--View(一)

jerryloveemily / 2655人阅读

摘要:概述通过上几章的介绍知道了的作用,即就是把返回的逻辑视图名称解析为视图对象。进而通过对象的视图渲染把最终的结果展现给用户。运用模板技术把数据和视图分开,同时提供支持很多的模板技术,比如等等。

概述

通过上几章的介绍知道了ViewResolver的作用,即ViewResolver就是把handler返回的逻辑视图名称解析为视图View对象。进而通过View对象的视图渲染把最终的结果展现给用户。

View视图渲染的原理,简单说就是把模型数据填充到视图模板,最终交由Servlet的response进行渲染展示。

Spring MVC运用模板技术把数据和视图分开,同时提供支持很多的模板技术,比如:InternalResourceView(JstlView)、FreeMarkerView、Thymeleaf等等。

本系列文章是基于Spring5.0.5RELEASE。

源码分析

以InternalResourceView为例进行分析,该类解析jsp视图模板,主要涉及类和接口如下:

View

View接口是Spring MVC提供的视图渲染接口,定义了render方法对给定的模型数据进行视图渲染,源码如下:

public interface View {
    ... ...
    /** 把模型数据进行渲染 */
    void render(@Nullable Map model, HttpServletRequest request, HttpServletResponse response)
        throws Exception;
    ... ...
}

AbstractView

AbstractView是实现View接口的抽象类,实现了render方法,源码如下:

public abstract class AbstractView extends WebApplicationObjectSupport implements View, BeanNameAware {
    ... ...
    @Override
    public void render(@Nullable Map model, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        if (logger.isTraceEnabled()) {
            logger.trace("Rendering view with name "" + this.beanName + "" with model " + model +
                " and static attributes " + this.staticAttributes);
        }
        
        // 创建整合后需要返回给浏览器的Model
        Map mergedModel = createMergedOutputModel(model, request, response);
        // 设置response 报文头
        prepareResponse(request, response);
        // 渲染数据,通过模板方法由子类实现,如InternalResourceView
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
    }
    ... ...
}

InternalResourceView

该类继承自AbstractView,并实现renderMergedOutputModel方法,源码如下:

@Override
protected void renderMergedOutputModel(
        Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {

    // 将model中的数据设置到request
    exposeModelAsRequestAttributes(model, request);

    // 本类中的此函数是空函数,留给子类比如JstlView去实现自定义逻辑
    exposeHelpers(request);

    // 跳转目的页面路径
    String dispatcherPath = prepareForRendering(request, response);

    // 获取跳转控制器RequestDispatcher  
    RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);
    if (rd == null) {
        throw new ServletException("Could not get RequestDispatcher for [" + getUrl() +
                "]: Check that the corresponding file exists within your web application archive!");
    }

    // 直接返回用户资源 
    if (useInclude(request, response)) {
        response.setContentType(getContentType());
        if (logger.isDebugEnabled()) {
            logger.debug("Including resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """);
        }
        rd.include(request, response);
    }
    // 携带request和response跳转到另一个控制器方法
    else {
        // Note: The forwarded resource is supposed to determine the content type itself.
        if (logger.isDebugEnabled()) {
            logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView "" + getBeanName() + """);
        }
        rd.forward(request, response);
    }
}

至此,View渲染视图的大致流程结束,也就是Spring MVC基本完成了整个流程,剩下的渲染工作交由Servlet去处理。

总结

本章就View视图渲染进行了简单的分析,Spring 提供了众多的View实现,有兴趣的童鞋可以继续了解。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69732.html

相关文章

  • SpringMVC源码分析--ViewResolver(三)

    摘要:概述本节学习下的功能,简单来说,该类的作用就是把多个视图解析器进行组装,内部使用存储配置使用的视图解析器。总结本章介绍了类,根据测试,了解到属性不影响中配置使用的视图解析器顺序。 概述 本节学习下ViewResolverComposite的功能,简单来说,该类的作用就是把多个ViewResolver视图解析器进行组装,内部使用list存储配置使用的视图解析器。 本系列文章是基于Spri...

    fox_soyoung 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(二)

    摘要:概述上篇学习了视图解析器作用及处理流程,为我们提供了丰富的视图解析器见下图本系列文章是基于。该视图解析器是根据处理器返回的逻辑视图名称,在应用上下文中查找该名称的视图对象视图对象就是的对象。 概述 上篇学习了Spring MVC ViewResolver视图解析器作用及处理流程,Spring为我们提供了丰富的视图解析器(见下图):showImg(https://segmentfault...

    jas0n 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(

    摘要:概述本章开始进入另一重要的组件,即视图组件,处理视图组件使用两个主要的接口是和。接口的作用是用于处理视图进行渲染。延用之前的介绍流程,本章分两部分进行阐述启动初始化和请求处理。 概述 本章开始进入另一重要的组件,即视图组件,Spring MVC处理视图组件使用两个主要的接口是ViewResolver和View。根据名称可知,ViewResolver即视图解析器,其作用是把逻辑视图名称解...

    pf_miles 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(五)

    摘要:此解析器与差不多,更改下配置文件中的类全路径即可。总结本章介绍了以及三个视图解析器。这部分内容有点儿多,我会尽快结束。 概述 通过上几篇的学习,我们分析了并试验了ViewResolverComposite、BeanNameViewResolver和ContentNegotiatingViewResolver,这三个类都直接实现ViewResolver接口。Spring MVC提供了很多...

    klinson 评论0 收藏0
  • SpringMVC源码分析--ViewResolver(四)

    摘要:概述本章继续学习另一个实现类解析器,该类的主要作用是根据同一请求的某些策略,选择对应的进行渲染。可以把理解为适配器,对不同类型进行适配。值得注意的是处理的为同一个。本系列文章是基于。实战需求目标实现后缀名或参数控制,显示不同的视图。 概述 本章继续学习ViewResolver另一个实现类ContentNegotiatingViewResolver解析器,该类的主要作用是根据同一请求的某...

    jcc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<