ModelAndView(有地址跳转的情况)不是特别准确的,具体更新了springmvc源码那篇博文,特别是关于View和ModelAndView中的view不是一个概念的,modelAndView只是保存了viewName
1.处理 请求转发(默认)和重定向 的,有资源的跳转的情况
2.就和 原生的 请求转发 和 请求 重定向 相同
3.ModelAndView中包含了一个model属性和一个view属性,model其实是一个
ModelMap类型,它是一个LinkedHashMap的子类,view包含了一些视图信息。
4.返回后,ModelAndView会给 中央处理器
1.若 view中的 视图信息 有 forward和redirect关键字,那么不用视图解析器
2.若没有,默认请求转发,会用视图解析器,解析逻辑地址成物理地址
5.中央处理器,会渲染 View,Model中的域数据是 渲染 view时使用。借助于Map对象能够存储模型。
request手动添加的域数据也会 添加到 model中
6.最后剩下来 的就是 View(带着 域数据)
7.如果 是请求转发,那么不会响应浏览器(返回 response给 http响应协议)
这时候,只会将view中的 信息(转发地址+域数据)给 request,去 进行 请求转发
8.如果是 请求重定向,那么中央处理器 会响应 浏览器(将response给浏览器,填充 http响应协议内容)
这时候,会将view的信息(重定向地址+ 可能有或没有域对象)给response
响应浏览器,浏览器在进行下一步请求
String(有地址跳转的情况)
1.和 modelAndView,一样,只是没有Model,再进行渲染 View的时候,没有Model
2.有 关键字,就不用视图解析器
3.controller还是 会将String 去 封装 ModelAndView
4.中央处理器 还是会对 ModelAndView进行处理
1.看用不用视图解析器,解决View的问题
2.将Model的域数据,渲染View(这步没有),除非用request手动添加了域数据
3.请求转发:直接request.getRequestDispatcher("xx.jsp").forward(),
4.重定向:response.sendRedirect("xxx.jsp"),将view的信息填充response,域对象可能有,响应浏览器,浏览器再进行下一步请求
ModelAndView
1.底层调用的 请求转发 或者 请求重定向,这一步 return后,
不会马上 请求转发或者,请求重定向的,而是一定要把 modelAndView
向上 return 给 处理器适配器,然后给 disServlet,最后disServlet的 最开始的
那个方法,然后disServlet的最开始的 方法在开始 解析这个 modelAndView,
进而最后才执行这个 请求转发或 请求重定向
2.所以,在return ModelAndView之后,就可以再执行拦截器的后置方法,去
修改modelAndView了,直至将ModelAndView交给 中央处理器去解析后执行
请求转发和 请求重定向
(无地址跳转)直接响应浏览器请求体,这里不涉及Model,And View,没有跳转地址,也没有域数据,做的直接在处理controller的时候直接返回response了
1.void
1.就跟原生response一样
2.自己去print 数据 进入 响应体
3.注意:自己填充的 数据,必须先 转换成字符串
4.浏览器会 根据 你字符串的 形式,自己set Content-type
5.如果直接 print对象的话,那会调用对象的 toString方法,可能不是json形式的字符串
6.这种情况,理论可以返回任何类型的 在 响应体中,只要保证 字符串形式 和 content-type相同即可
7.到前端后,用dataTpye,去解析 字符串形式的数据,为前端可以识别的数据即可,
这步是,浏览器自己帮你做的
2.返回 json格式数据,例如对象,数组,list,String,map(key必须得是string类型的)等
用responseBody,转换器,将他们转换成 json格式的 字符串,填充到 响应体中去即可