forward与redirect的区别
来源:互联网 发布:淘宝推广有效方法 编辑:程序博客网 时间:2024/06/05 01:48
forward与redirect的区别
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。
1、forward与include共亨Request范围内的对象,而redirect则不行,即:如果一个javabean被声明为request范围的话,则被forward到的资源也可以访问这个javabean,而redriect则不行。2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect
从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
从效率来说
forward:高.
redirect:低.
redirect:以前的request中存放的变量全部失效,并进入一个新的request作用域。 forward:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
他们的调用分别如下:
在jsp页面中你也会看到通过下面的方式实现转发: 提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一 个请求的作用域到底有多大呢?例如:
在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句: request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功显示了name变量的值。
现在在b.jsp中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>,当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:
requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23</a> </body> </html>
c.jsp
那么转发又是怎么回事呢?
现在增加一个页面叫做d.jsp,并且在c.jsp中</body>前面增加一句
运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址, web应用程序会要求客户端浏览器重新发出请求地址,客户端会重新连接至所指定的地址,因此浏览器的地址会出现重新导向的信息,重新导向后的请求由浏览器发出。 forward与include共享Request范围内的对象,而redirect则不行,
forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源。
(重定向:服务器通知浏览器向一个新的地址发送请求。一般服务器可以发送一个302状态码和一个Location消息头(值是一个地址,一般称之为重定向地址),浏览器收到之后,会立即向重定向地址发请求。response.sendRedirect(String url);
- forward与redirect的区别
- forward与redirect的区别!
- forward与redirect的区别
- forward与redirect的区别
- forward 与redirect的区别
- forward() 与redirect()的区别
- redirect与forward的区别:
- Forward与Redirect的区别
- forward与redirect的区别
- forward 与redirect 的区别
- forward与redirect的区别
- forward与redirect的区别
- forward与redirect的区别
- forward与redirect的区别
- forward与redirect的区别
- redirect 与 forward 的区别
- Forward与Redirect的区别
- forward与redirect的区别
- 软件测试常见知识
- 《机器学习》实施kNN分类算法
- Mixed Content混合内容错误 Iframe Http页面无法访问
- 九个问题从入门到熟悉HTTPS
- 一位资深程序员大牛给予Java初学者的学习路线建议
- forward与redirect的区别
- 2017-12-14 Python默认字典
- 利用JS生成二维码
- 121. Best Time to Buy and Sell Stock
- bootstrap弹出登录框【带合法性检查】
- Kotlin自定义View之TabItem控制Fragments
- Python IDLE快捷键
- C语言解决现实生活的问题1——判断比赛名次
- cc攻击ddos攻击怎么办?比较有效的解决方案分享给大家