springmvc处理响应数据的解析

 更新时间:2019年01月11日 11:34:58   作者:qq_43193797  
今天小编就为大家分享一篇关于springmvc处理响应数据的解析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

1. ModelAndView 相关的成员变量和方法

  • private Object view; 描述视图信息
  • private ModelMap model 描述模型数据(响应数据)
  • public void setViewName(String viewName) 设置视图信息
  • public ModelAndView addObject(String attributeName, Object attributeValue) 设置模型数据
  • protected Map<String, Object> getModelInternal() 获取模型数据
  • public ModelMap getModelMap() 获取模型数据
  • public Map<String, Object> getModel() 获取模型数据
  • public String getViewName() 获取视图名字

2. ModelAndView 源码调试流程

[1]. 在DispatcherServlet的 945 行, 准备执行请求处理方法

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

[2]. 执行请求处理方法, 请求处理方法返回一个ModelAndView对象, 最终返回到DispatcherServlet的945行。

[3]. 在DispatcherServlet 959行, 开始处理结果:解析视图名字得到视图对象==>视图对象处理模型数据==>视图对象完成转发/重定向工作.

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

[4]. 在DispatcherServlet的1012行

render(mv, request, response);

[5]. 在DispatcherServlet的1204行,解析视图名字得到视图对象.当前的视图对象为: InternalResourceView

view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);

[6].在DispatcherServlet1225行, 视图对象开始处理模型数据

view.render(mv.getModelInternal(), request, response);

说明: 视图对象的render()方法是在View接口中定义的。 该方法在View接口下面的一个抽象类 AbstractView中进行了具体的实现.

[7].在AbstractView中的266行, 开始整合输出模型数据

renderMergedOutputModel(mergedModel, request, response);

说明: renderMergetOutputModel方法是AbstractView中的抽象方法, 该方法在不同的视图类中进行了不同的实现.

当前的视图对象时InternalResourceView, 接下来调用到InternalResouceView中的renderMergetOutputModel方法。

[8]. 在InternalResourceView中的180行,将模型数据设置到Request域对象中.

exposeModelAsRequestAttributes(model, requestToExpose); 

[9]. 在InternalResourceView中的189行,获取转发器

RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);

[10].在InternalResourceView中的209行,开始转发.

rd.forward(requestToExpose, response);

3、视图解析

3.1. Springmvc如何解析视图?

首先,不论请求处理方法的返回值是String、ModelAndView等, Springmvc在调用完请求处理方法后,都会重新封装成一个ModelAndView对象.

接下来, 视图解析器对象 会解析ModelAndView中的view信息,得到具体的视图对象.

在然后, 视图对象会去处理模型数据, 并完成最终的转发以及重定向的工作。

3.2. 视图

3.2.1 视图接口 View

String getContentType(); 主要用于设置响应头信息 response.setContentType(“text/html;charset=utf-8”);
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
视图对象处理模型数据.

3.2.2 一个抽象类 AbstractView

View接口中的render()方法是在AbstractView中进行了统一的实现.

protected abstract void renderMergedOutputModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception; 在不同的视图实现类中做了具体的实现,主要就是完成转发和重定向工作.

3.2.3 视图的作用

视图主要就是处理模型数据, 并完成最终的转发和重定向工作.

3.2.4 常用的视图类

  • InternalResourceView 转发视图
  • JstlView 转发视图,是InternalResourceView的子类.
  • RedirectView 重定向视图

3. 视图解析器

3.3 视图解析器 ViewResolver

View resolveViewName(String viewName, Locale locale) throws Exception; 解析视图名字得到视图对象

3.1 视图解析器的作用

视图解析器专门就是用于解析得到视图对象的.

3.2 常用的视图解析器类

InternalResourceViewResolver

3.3 视图解析器的优先级

默认值是int的最大值, 值越小优先级越高.

3.4. 重定向

在请求处理方法的返回值前面添加 redirect: 前缀即可.

重定向的工作是由 RedirectView 来完成的.

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Java判断本机IP地址类型的方法

    Java判断本机IP地址类型的方法

    Java判断本机IP地址类型的方法,需要的朋友可以参考一下
    2013-03-03
  • springboot集成mybatis官方生成器

    springboot集成mybatis官方生成器

    本文主要介绍了springboot集成mybatis官方生成器,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • eclipse 安装lombok插件

    eclipse 安装lombok插件

    这篇文章主要介绍了eclipse 安装lombok插件的详细步骤,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Maven基础之如何修改本地仓库的默认路径

    Maven基础之如何修改本地仓库的默认路径

    这篇文章主要介绍了Maven基础之如何修改本地仓库的默认路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • idea 如何查找类中的某个方法

    idea 如何查找类中的某个方法

    这篇文章主要介绍了idea 如何查找类中的某个方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Swift洗牌动画效果的实现方法

    Swift洗牌动画效果的实现方法

    这篇文章主要介绍了Swift洗牌动画效果的实现方法,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2016-12-12
  • Java内存溢出场景及解决方案

    Java内存溢出场景及解决方案

    内存溢出是Java应用开发中常见的问题,但通过合理的代码优化、内存管理以及JVM参数调整,我们可以有效地避免和解决这类问题,这篇文章主要介绍了Java内存溢出场景及解决办法,需要的朋友可以参考下
    2024-04-04
  • 源码分析ConcurrentHashMap如何保证线程安全

    源码分析ConcurrentHashMap如何保证线程安全

    这篇文章将结合底层源码为大家详细介绍一下ConcurrentHashMap是如何保证线程安全的,文中是示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • SpringBoot项目嵌入RocketMQ的实现示例

    SpringBoot项目嵌入RocketMQ的实现示例

    本文主要介绍了SpringBoot项目嵌入RocketMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Java方法的参数传递机制实例详解

    Java方法的参数传递机制实例详解

    这篇文章主要介绍了Java方法的参数传递机制,结合实例形式详细分析了java方法参数传递机制原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-09-09

最新评论