请求转发和重定向的深入

为啥要写这篇博客呢?原因是因为这几天做项目遇到了一个很基础的问题大概关于是request请求转发和重定向的问题。下面我就将我具体遇到的问题表述一下:

在一个传统的servlet+jdbc+jsp项目中,一个请求经过服务器映射到了一个对象(A)中,这个对象里有一段业务逻辑的处理要调有个类似于接口的对象(B)。而到到B对象的方法呢就是用重定向或者是请求转发。由于B对象处理完后我希望给我A对象返回一个结果,而代码的证明也确实返回了。但是我需要将A对象中处理完的所有逻辑结果返回到前端,所以在A对象中用response.getWriter()方法获取到了一个PrintWriter对象的实例,可是问题马上就来了。我将A对象处理的结果用pw回写到前端,可是前端愣是没取到。这就很郁闷了。用请求转发和重定向都不可以。我在B对象中同样用pw回写给前端数据竟然可以。都是走了pw的write()方法为什么一个可以取到一个取不到呢。开始重新拾忆吧,研究请求转发和冲定向的问题。我就以两幅图直接说明好了:


从图中可以说明请求转发是在服务器的内部完成的,浏览器中的url地址栏中的地址是不会变的。那么在5中B处理完结果后,直接会把处理的结果反馈到前端。而如果在A对象中在请求转发的下面还有代码是会继续执行的。但是A如果在此次的请求中想反馈数据到前端,是不可能的。因为请求转发在服务器内部进行的,视为一次请求,在请求转发的时候request和response的地址值的一致的。所以从请求的角度上看是一次请求,不管A转发到B,还是B转发到C。都视为一次请求。最后的结果肯定是从最后一个转发的对象中反馈值。那有人会问了,为啥在B处理完结果后A里还有剩余的代码要处理,而A调了同样的回写方法却写不到了呢?servlet是一个单例的对象。而调用回写方法后相当于已经向前端返显了数据。本次请求已经结束。所以执行A再想返显数据是徒劳的。

重定向和请求转发基本一致,不一样的是重定向是客户端相当于请求两次服务器,浏览器的url地址栏会变化。前一次请求的地址值和后一次请求的地址值是不一样的。其他的就一样了。

猜你喜欢

转载自blog.csdn.net/CDW2328/article/details/80556668