SpringMVC中的请求转发和重定向区别以及举例说明

目录

一、forward、redirect关键字:

二、请求转发的工作逻辑:

三、重定向的工作逻辑:

四、请求转发和重定向的区别:

五、forward举例说明:

六、redirect重定向时如何共享数据(举例)

七、参考资料:


一、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课程;

2、http://t.csdn.cn/HEuVm 

3、http://t.csdn.cn/TU6v4

4、http://t.csdn.cn/airBL

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值