手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/00:00
登录|注册

11|ModelAndView :如何将处理结果返回给前端?

你好,我是郭屹。今天我们继续手写 MiniSpring。这也是 MVC 内容的最后一节。
上节课,我们对 HTTP 请求传入的参数进行了自动绑定,并调用了目标方法。我们再看一下整个 MVC 的流程,现在就到最后一步了,也就是把返回数据回传给前端进行渲染。
调用目标方法得到返回值之后,我们有两条路可以返回给前端。第一,返回的是简单的纯数据,第二,返回的是一个页面。
最近几年,第一种情况渐渐成为主流,也就是我们常说的“前后端分离”,后端处理完成后,只是把数据返回给前端,由前端自行渲染界面效果。比如前端用 React 或者 Vue.js 自行组织界面表达,这些前端脚本只需要从后端 service 拿到返回的数据就可以了。
第二种情况,由后端 controller 根据某种规则拿到一个页面,把数据整合进去,然后整个回传给前端浏览器,典型的技术就是 JSP。这条路前些年是主流,最近几年渐渐不流行了。
我们手写 MiniSpring 的目的是深入理解 Spring 框架,剖析它的程序结构,所以作为学习的对象,这两种情况我们都会分析到。

处理返回数据

和绑定传入的参数相对,处理返回数据是反向的,也就是说,要从后端把方法得到的返回值(一个 Java 对象)按照某种字符串格式回传给前端。我们以这个 @ResponseBody 注解为例,来分析一下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了MVC框架中处理返回结果的流程和技术细节。首先介绍了处理返回数据的方式,包括返回纯数据和返回页面两种情况。其次,详细分析了如何使用@ResponseBody注解和HttpMessageConverter接口将Java对象转换成字符串格式返回给前端。文章还介绍了如何定义和实现HttpMessageConverter和ObjectMapper接口,以及在RequestMappingHandlerAdapter类中使用messageConverter属性进行数据转换。另外,文章还介绍了ModelAndView结构的定义和使用,以及在调用目标方法后返回值的处理过程。通过对invokeHandlerMethod()方法的分析,总结了处理三种情况的方式:返回纯数据、返回ModelAndView对象和返回字符串。文章还讨论了ViewResolver的作用,以及如何扩展到多种前端渲染方式。整体来说,本文对Spring框架的解耦思想进行了深入探讨,为想深入理解Spring框架的读者提供了有价值的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • Geek3485
    老师的minitomcat源码在哪可以看到

    编辑回复: 老师正在准备tomcat的相关课程,后续课程上线就可以看到啦~

    2023-08-04归属地:上海
  • 马儿
    1.目前如果加了ResponseBody注解返回String的话返回的是String在内存中的信息,而需要的字符串值字段在这个json中也是内存中的地址值,这将导致结果不符合预期,这里应该还需要对writeValuesAsString这个函数优化一下,或者是拓展一些其他的实现。 2. 目前在InternalResourceViewResolver中写死了处理Jsp的View,可以在加一个有参构造函数,传入参数为资源类型,InternalResourceViewResolver内部维护一个资源类型和View的Map 希望老师可以抽时间加一些答疑课,对之前一些同学问到的问题在课上统一解答一下。或者是将一些mini-spring中的一些拓展点提供一个思路,比如上节课遇到的传参数不支持基本类型和自定义类型中WebDataBinder不可用的问题。谢谢老师。

    作者回复: 1 你说的是,线下课确实是作为扩展练习的。 2 你可以这么考虑,对别的view,要用不同的view resolver,即写一个与InternalResourceViewResolver对等的实现来支持别的view。

    2023-04-08归属地:四川
  • peter
    请教老师几个问题: Q1:本文所讲的内容,就是模仿SpringMVC,对吗? Q2:很多信息都存在request中,那这个request对象会占用很大内存吗?对于一个用户,一般地讲,会占用多大内存?比如10M? Q3:View这个类,是生成一个页面文件吗?还是把数据填充到已经存在的页面上?

    作者回复: Peter你好。MiniSpring是模仿Spring框架的一个简化版本,目的是作为一个简要地图便于大家理解Spring的结构和源代码,MiniSpring的包结构类名和主要流程方法都是跟Sping框架本身一样的,所以学习了MiniSpring,会比较容易继续深入了解Spring的源代码。 request是对http request的包装,大小主要依赖于客户端传上来的数据包大小,不考虑附件,一般不会太大,应该在200K以内。你要再学一下我的MiniTomcat后就会更加清楚。 View这个类的定位是前端展示,如果是JSP,就是吧数据填充到JSP中,然后展示出来。最近这些年都是前后端分离了,这一部分简单了解一下就可以。

    2023-04-06归属地:北京
  • 梦某人
    打卡成功,从理解上这节课并不难,虽然很多代码(主要是User类和一些辅助)需要参考GitHub不然无法进行。但是调整环境浪费了接近2个小时,因为访问jsp一直报404的错误,后来意识到是没在idea的Project Structe 中的 Module设置资源文件夹。。。。另外目前的返回来讲,string包装成了 ModelAndView,但是这样做在reander的时候无法辨别,导致最基础的 /test反而无法访问。思考题来说,View的两个类,一个负责分析内容,一个负责渲染内容,将 ViewResolver 进行扩展就可以解决相关问题了。
    2023-04-18归属地:河北
    1
  • Geek_b3425a
    最新版初始化的handleAdapter的时候并没有给webBindingInitialize赋值,只给了一个set方法但是没有找到调用的地方,这样有请求进来的时候不会就空指针了吗?是我漏看东西了吗
    2023-09-14归属地:上海
  • Geek_b3425a
     有点不懂,老师仓库代码,handleMaping和handleAdapter都实现了applicationContextAware接口,类中applicationContext属性是abstractApplicationContext在getBean的时候给set进去的,不懂得是在容器启动的时候并没有这个bean相应的实体对象,并不会调用这个方法,我本地handleMapping中容器属性也是空,并没有掉set方法给他赋值
    2023-09-14归属地:上海
  • C.
    结束结束!
    2023-04-06归属地:江苏
    1
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部