在实现网城项目中,主讲老师把访问首页的index.action在地址栏里改成了index.jsp,然后他用到了一个forward方法。
它是在index.jsp中这么实现的,就加了一个<jsp:forward page="index.action"/>,并且把一些其他的无关元素都删了。当时对这个做法感到很新奇,于是就查了查,总结了一下,给大家分享。
他们有以下几点区别:
1、实现机制
Forward是直接转发方式,也就是比较普通的请求转发。它是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。它实现的是RequestDispatcher类的forward()方法。
Redirect是间接转发方式,也叫重定向,它一般用于避免用户的非正常访问。它是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL。它实现的是HttpServletRequest类的SendRedirect()方法。
例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用Response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL。在项目的“提交订单”模块用有用到,如果提交时未登录,会转到登录页面。
2、数据共享
forward:转发页面和转发到的页面可以共享request里面的数据,而redirect方式实现的则不能共享数据。
3、运用场景
forward:一般用于用户登陆的时候,根据角色转发到相应的模块。redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等。
4、执行效率
Forward执行效率比较高,它只执行了一次HTTP请求。而Redirect执行效率低,因为它实际上执行了两次HTTP请求,对应了两个request对象。
小结:其实从本质上来讲,他们最大的不同还是实现机制和目的上的区别,这两个页面跳转形式其实还是很好理解和区分的。