作用域传值的4种方式
通过 原生 HttpServletRequest 传值
通过 ModelAndView 传值
通过 Map 传值
通过 Model 传值
注意:Map 和 Model 最终都会转换为 ModelAndView对象
通过 原生 HttpServletRequest 传值
通过 ModelAndView 传值
通过 Map 传值
通过 Model 传值
页面跳转的两种方式
forward请求转发2种方式(带参数)
Spring MVC中forward请求转发只需要请求一次服务器,可以提高访问速度,同时参数传递可以借助HttpServletRequest来处理,由于是处理同一个请求,所以request对象还是同一个,中文也不会出现乱码现象。使用forward后转到发某个请求而不是某个页面。
forward请求转发流程
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来。整个过程是一个请求,一个响应。
ViewResolver 请求转发
ModelAndView 请求转发
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重定向跳转
ViewResolver直接跳转
携带参数的情况,参数将会拼接在URL的后面
ModelAndView 重定向
redirect重定向可以跳转到任意服务器,可以用在系统间的跳转。
Spring MVC中redirect重定向,参数传递可以直接拼接url也可以使用RedirectAttributes来处理,由于是不同的请求,重定向传递的参数会在地址栏显示,所以传递时要对中文编码进行处理。
ModelAndView 源码调试
ModelAndView类
ModelAndView中包含了一个model属性和一个view属性,model其实是一个ModelMap类型,它是一个LinkedHashMap的子类,view包含了一些视图信息。
ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用(数据在一次请求转发中有效),用来在一个请求过程中传递处理的数据。
getModelInternal( )
、getModelMap( )
、getModel( )
三个方法都是用来获得模型数据的。
ModelAndView处理模型数据
1、编写测试方法,return语句打断点,开始DeBug模式
2、进入到 DispatcherServlet 中的 doDispatch方法
调用请求处理器中的请求处理方法,方法执行后返回ModelAndView对象,被mv接收
3、回到Controller中请求的方法,执行return 语句,返回ModelAndView对象
4、再次进入到 DispatcherServlet 中的 doDispatch方法,准备处理ModelAndView
5、进入到 DispatcherServlet 中的ProcessDispatchResult方法
准备处理ModelAndView中的视图信息和模型数据
6、进入到 DispatcherServlet 中的render方法
首先根据ModelAndView中的视图信息,通过视图解析器,解析得到一个View视图对象
之后视图对象开始处理模型数据
7、进入到AbstractView中的render方法,准备整合输出的模型数据
render方法是View接口中定义的,在AbstractView中实现,所有具体的视图类都使用AbstractView中实现的render方法。