SpringMVC是如何实现作用域传值和页面跳转的?

SpringMVC是如何实现作用域传值和页面跳转的?

8acc6ba101c1aa4f3705193ca1a3093b.png


作用域传值的4种方式

  • 通过 原生 HttpServletRequest 传值

  • 通过 ModelAndView 传值

  • 通过 Map 传值

  • 通过 Model 传值

注意:Map 和 Model 最终都会转换为 ModelAndView对象

通过 原生 HttpServletRequest 传值

718a1492e156658bf2b0f776e6836b55.png

通过 ModelAndView 传值

1f069331f6cf7a79391c9aa5720c7df9.png

通过 Map 传值

84e8570057eba5db957ca7926480926b.png

通过 Model 传值

9299217d28e4ebf3bb2accaba44acdce.png


页面跳转的两种方式

2b5f5a9ee903d0565a9a45ba4d4f56aa.png

forward请求转发2种方式(带参数)

Spring MVC中forward请求转发只需要请求一次服务器,可以提高访问速度,同时参数传递可以借助HttpServletRequest来处理,由于是处理同一个请求,所以request对象还是同一个,中文也不会出现乱码现象。使用forward后转到发某个请求而不是某个页面。

forward请求转发流程

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来。整个过程是一个请求,一个响应。

ViewResolver 请求转发

8ea2068784329309cea942ab6d8be93b.png
8f20a4ca109e03581320ef547ece389f.png

ModelAndView 请求转发

26afef699583f57da12e3105c04fa90b.png
8f20a4ca109e03581320ef547ece389f.png

redirect重定向3种方式(带参数)

Spring MVC中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,其中redirect是直接跳转到其他页面,有以下3种方法进行重定向。

redirect重定向流程

客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

response.sendRedirect重定向跳转

b79acf70957763637527f11ce9bc2b8c.png

ViewResolver直接跳转

79b54d9bc7cf815b25e5cc915e92825e.png

携带参数的情况,参数将会拼接在URL的后面

b98cf37a4c44d8e65644c2aa3a72255f.png
c785ddd43404900cfd7820d30f7f3d31.png

ModelAndView 重定向

5f7a0e5f699d5709626fde9f689ca0a3.png
dad8b179c13ca30e1dc05256280f58f7.png
  1. redirect重定向可以跳转到任意服务器,可以用在系统间的跳转。

  2. Spring MVC中redirect重定向,参数传递可以直接拼接url也可以使用RedirectAttributes来处理,由于是不同的请求,重定向传递的参数会在地址栏显示,所以传递时要对中文编码进行处理。


ModelAndView 源码调试

ModelAndView类

ModelAndView中包含了一个model属性和一个view属性,model其实是一个ModelMap类型,它是一个LinkedHashMap的子类,view包含了一些视图信息。

ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用(数据在一次请求转发中有效),用来在一个请求过程中传递处理的数据。

440d1653b695c82f7eb325bd4db77f24.png

getModelInternal( )getModelMap( )getModel( )三个方法都是用来获得模型数据的。


ModelAndView处理模型数据

1、编写测试方法,return语句打断点,开始DeBug模式

67fee1b65eaa74150725e48837cce849.png

2、进入到 DispatcherServlet 中的 doDispatch方法

调用请求处理器中的请求处理方法,方法执行后返回ModelAndView对象,被mv接收

9260463d759ff2410666698f14d15e21.png

3、回到Controller中请求的方法,执行return 语句,返回ModelAndView对象

79ce7b5cb469d099127ec62d0b16259f.png

4、再次进入到 DispatcherServlet 中的 doDispatch方法,准备处理ModelAndView

d9a000a93440653e37f711d1b16c4d78.png

5、进入到 DispatcherServlet 中的ProcessDispatchResult方法

准备处理ModelAndView中的视图信息和模型数据

027d8382a7b424c79cae659b64820cc7.png

6、进入到 DispatcherServlet 中的render方法

首先根据ModelAndView中的视图信息,通过视图解析器,解析得到一个View视图对象

7bafe190b9a81c8b412ef78cf9902c52.png

之后视图对象开始处理模型数据

0fb50397a4776c5cfcaeac98f59c027b.png

7、进入到AbstractView中的render方法,准备整合输出的模型数据

789c4c814ff0e13ca3e7817cc12ea230.png

render方法是View接口中定义的,在AbstractView中实现,所有具体的视图类都使用AbstractView中实现的render方法。

8、进入到InternalResourceView中的renderMergedOutputModel方法,准备将模型数据设置到request作用域中

2d5e4e467db5e6cf154ddcb419671186.png

9、进入到AbstractView中的exposeModelAsRequestAttributes方法,将模型数据添加到request作用域中

5ad6f8912fbaaa8292b19a33544c2a8b.png

10、进入到InternalResourceView中的renderMergedOutputModel方法,获取转发器并实现转发

678504707aa51707085318ca57246d86.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值