Jsp中的forward 和 redirect

一、绝对路径和相对路径

绝对路径与相对路径
如果使用的URL网址是以“/”开头的,那么这个网址就叫做绝对路径。
如果使用的URL网址不是“/”开头的,那么这个网址就叫做相对路径。

看看lingo-sample/03-03/这个例子,如果我们去请求relative/forward.jsp或redirect.jsp,然后从这里再跳转向它下面的result/result.jsp会怎样呢?

相对路径

在相对路径上,两者的表现是相同的。
forward的例子:

<%request.getRequestDispatcher("result/result.jsp").forward(request, response);%>      

这里的相对路径就是result/result.jsp。 因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行forward的时候会寻找当前路径下的result/result.jsp,找到之后便转发请求。

redirect的例子:

<%response.sendRedirect("result/result.jsp");%>     

这里的相对路径也是result/result.jsp。 因为刚刚请求的test.jsp是在/03-03/relative/下,所以我们的当前路径就是/03-03/relative/,执行redirect的时候会把当前路径加上result/result.jsp,把结果作为重定向的地址发送给浏览器,浏览器再去请求/03-03/relative/result/result.jsp,从而得到响应。

绝对路径

forward的例子:

<%request.getRequestDispatcher("/relative/result/result.jsp").forward(request, response);%>

这里的绝对路径就是/relative/result/result.jsp。在本地测试时,forward把http://localhost:8080/03-03/当作根路径,在它的基础上计算绝对路径。 这是由jsp的部署方式决定的,webapp里可以放好多项目,为了让这些项目可以互不影响、独立运行,不能让请求从一个项目直接在服务器内部转移到另一个项目。为了防止出现这种情况,在执行forward的时候干脆把项目的路径当作根目录,开发者看不到其他项目,也就不会出现问题了。

redirect的例子:

<%response.sendRedirect("/03-03/absolute/result/result.jsp");%>                        这里的绝对路径却是/03-03/absolute/result/result.jsp 

在本地测试时,redirect把http://localhost:8080/当作根路径,在它的基础上计算绝对路径。 因为redirect会让浏览器重新发起一个新请求,所以不会搅乱服务器里多个项目之间的关系,也就不需要对它做限制,如果需要在多个项目之间进行跳转,就只能使用redirect。不过因为重新发起了新的请求,上次请求的那些数据都会丢失,如果有什么重要的数据,记得要重新设置。

二、实现机制

Forward:转发----服务器行为

    Forward是直接转发方式,也就是比较普通的请求转发。它是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。

  1. 调用内部的一个方法在容器内部完成请求处理和转发动作。在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。(一次请求)
  2. 可以共享request里面的数据
  3. 它实现的是RequestDispatcher类的forward()方法。

Redirect:重定向----客户端行为

Redirect是间接转发方式,也叫重定向,它一般用于避免用户的非正常访问。它是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL。

  1. 客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。(两次请求)
  2. redirect方式实现的则不能共享数据
  3. 它实现的是HttpServletRequest类的SendRedirect()方法。

三、运用场景

forward

一般用于用户登陆的时候,根据角色转发到相应的模块。

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<html>
<body>
<jsp:forward page="/login.jsp"></jsp:forward>
<a href="${pageContext.request.contextPath}/user/findAll.do">查询全部</a>
</body>
</html>

redirect

一般用于用户注销登陆时返回主页面和跳转到其它的网站等。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。在Servlet中,通过调用Response对象的SendRedirect()方法,告诉浏览器重定向访问指定的URL。在项目的“提交订单”模块用有用到,如果提交时未登录,会转到登录页面。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值