目录
一、forward、redirect关键字:
SpringMVC框架把原来Servlet中的请求转发和重定向操作进行了封装。现在可以使用简
单的方式实现请求转发和重定向:
forward:表示转发,实现request.getRequestDispatcher("x.jsp").forward()
redirect:表示重定向,实现response.sendRedirect("xx.jsp")注意: forward和redirect都是关键字,有一个共同的特点不和视图解析器一同工作,这样可以在配置了视图解析器时指定不同位置的视图。
当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重
定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。
二、请求转发的工作逻辑:
请求转发(forward)是服务器请求资源,服务器直接访问目标地址的url,把响应的内容读取过来,再发送给浏览器,这个跳转时由服务器实现的,而不是在客户端实现的,所以客户端实际上并不知道这个跳转,地址栏显示的还是之前的URL,请求转发是服务器行为。
三、重定向的工作逻辑:
1.客户端发送http请求,服务器接收并做出业务逻辑处理
2.服务器调用response.sendReadirect()方法,发送302状态码响应及新的网址信息返回给浏览器
3.客户浏览器发现是302响应,则自动再发送一个新的http请求,重新访问服务器对应的资源
重定向是客户端的行为
四、请求转发和重定向的区别:
1、因为请求转发是在服务器端内部来实现的,所以能够访问WEB-INF目录;而重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF 中资源的。
2、资源使用范围不一样,请求转发是同一服务器中的资源,而重定向是任意服务器资源,所以请求转发也就更加的效率,但是仅能在服务器内访问,而重定向由于仅返回一个地址,所以可以跨域访问。3、请求响应的次数不一样,请求转发只需要一次请求,重定向需要两次请求.
4、请求转发由于是服务器内部跳转,仅返回结果,所以url地址栏不会发生改变,重定向是服务端返回地址,客户端再重新访问,所以url地址栏是会改变的。
5、请求转发的两个Servlet实例共用同一个请求对象和响应对象,所以整个请求转发过程中,请求和返回的数据是共享的,数据都会存放到Request域中;重定向需要创建两个请求对象和两个响应对象,因为是两个不同的请求对象,所以重定向是不共享Request域的,但是Model或者ModelAndView可以自动将简单类型的数据,转为string使用,以参数的方式拼接到第二次请求路径中,作为第二次请求的get请求参数使用。目的是在两次请求之间传递数据;
Model : model对象是SpringMVC内置对象,当前对象可以直接使用 ,当我们向model中存放数据后,最终model中的数据会转存到Request域中;
请求转发: 数据都会存放到Request域中,重定向: request域下的数据不能共享,但是使用Model或者ModelAndView可以自动将数据以参数的方式拼接到请求路径中;
五、forward举例说明:
不和视图解析器一同工作,这样可以在配置了视图解析器时指定不同位置的视图。
六、redirect重定向时如何共享数据(举例)
重定向如何共享数据原理:
1、数据存放到session域下,会占用服务器内存空间;【不可取】
2、重定向时,request域下的数据不能共享,但是Model或者ModelAndView可以自动将简单类型的数据,转为string使用,以参数的方式拼接到第二次请求路径中,作为第二次请求的get请求参数使用。目的是在两次请求之间传递数据;
2.1 在目标hello. jsp页面可以使用参数集合对象${param}获取请求参数值
${param . key}例如:${param . myname}
mv . addobject( myname" , name);
mv . addobject(”myage”,age) ;
这个数据是放在request作用域但是我们现在能不能取到数据呢:
首先地址栏的地址发生变化了,其次,这个myname和myage不是我们的:
那这个数据哪里来的呢?相对于是由浏览器发起了第二次请求,这个参数来自这里,这是框架所提供的额外的功能:
这个数据是放到了request1作用域中,当执行重定向,它会发起第二个请求,hello.jsp
就是和request2相关了 (要了解作用域的生命周期)
我们在访问 hello.jsp时,尾部有请求参数,这个请求参数是有数据的,如何取出来呢:
重定向如何共享数据总结:
1、重定向时,request域下的数据不能共享,但是Model或者ModelAndView可以自动将简单类型的数据,转为string使用,以参数的方式拼接到第二次请求路径中,作为第二次请求的get请求参数使用。目的是在两次请求之间传递数据;
2、在目标hello. jsp页面可以使用参数集合对象${param}获取请求参数值
${param . key}例如:${param . myname}
七、参考资料:
1、动力节点王鹤老师的SpringMVCK课程;