客户端重定向(Redirect)
服务器重定向(Dispatch)-- 转发
客户端重定向
标准意义的重定向是指HTTP重定向,是HTTP协议的一种机制。并没有涉及request,只有response。
当client向server发送一个请求获取资源
server接收到这个请求,发现请求的资源实际存放在另一个位置
server在返回的response中写入那个请求的资源的正确位置,并设置response的状态码为301(表明这是一个要求浏览器重定向的response)
当client接收到这个response后就会根据新的URL重新发起请求
在Servlet里,实现客户端重定向的方法是response.sendRedirect()
服务器重定向(forward)
是指服务器在处理request的过程中将request先后委托多个Servlet或JSP接替进行处理的过程。
例如:先由一个Servlet处理(比如实现业务逻辑计算),然后forward给一个JSP进行视图的渲染。
在Servlet中,实现dispatch是通过RequestDispatchers来实现的。
例如:request.getRequestDispatcher().forward()
一个是forward,另一个是include,相应的在JSP里实现dispatch的标签也有两个:<jsp:forward/>和<jsp:include/>。
不管是forward还是include,我们可以清楚的看到,从一个Servlet或JSP向别一个Servlet或JSP跳转,Request和Reponse始终在多个Servlet或JSP传递,这是服务器端能实现dispatch模式的关键。换句话说,我们可以把Request和Reponse看作是一种资源,一系列的Servlet和JSP都是在基于同一份资源(同一组Request和Response对象)完成它们职责范围之内的计算。
对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。
无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。
网友评论