转发和重定向

对于转发和重定向
本质区别: 请求的转发只发出了一次请求, 而重定向则发出了两次请求. 
用生活例子说明一下:
小明向小王借钱,小王说他没有,但是小王让小明放心,他到别人那里借钱给小明,这就是转发。
小明向小王借钱,小王说没有,手头紧,让他到小丽那里借,然后小明又走到小丽那里借钱,这就是重定向。

下面用一个javaweb例子来说明一下。
对于转发:
首先写一个ForwardServlet:
public class ForwardServlet extends HttpServlet{
private static final long serialVersionUID = 1L;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
System.out.println("forwordServlet' doGet");

//请求的转发
//1、调用HttpServletRequest的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher()需要传入要转发的地址
String path="testServlet";
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/"+path);

//2.调用HttpServletRequest的forward(request,response)进行请求的转发

requestDispatcher.forward(request, response);
}
}
再给出TestServlet:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}


然后在hello.jsp写个超链接:
<a href="forwardServlet">ForwardServlet</a>


执行,控制台会输出:


地址栏显示:


对于重定向
首先写一个RedirectServlet:
public class RedirectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet'doGet");
//执行请求的重定向,直接调用response.sendRedirect(path)方法
//path为要重定向的地址
String path = "testServlet";
response.sendRedirect(path);


}


}


再给出TestServlet(和上面转的一样):
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet' doGet");
}
}


然后在hello.jsp写个超链接:
<a href="redirectServlet">RedirectServlet</a>


执行,控制台会输出:


地址栏显示:


很显然,两者控制台输出的结果是一毛一样的,但是差别出在哪里呢?地址栏的url。然后我们再看一下两者的请求,和的doGet()方法最里写两段代码测试一下,代码如下:
在ForwardServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("forwordServlet'name:"+request.getAttribute("name"));
在RedirectServlet的doGet()方法最里写两段代码
request.setAttribute("name", "ymfwj");
System.out.println("RedirectServlet'name:"+request.getAttribute("name"));
在TestServlet的doGet()方法最里写一段代码

System.out.println("testServlet'name:"+request.getAttribute("name"));

对于转发的结果:


对于重定向的结果:



最后结果很显然,我们会发现转发的request是同一个,而重定向的request就不是了,他是两个请求了。

总结:
①. 请求的转发: 地址栏是初次发出请求的地址.
   请求的重定向: 地址栏不再是初次发出的请求地址. 地址栏为最后响应的那个地址 
       
②. 请求转发: 在最终的 Servlet 中, request 对象和中转的那个 request 是同一个对象. 
   请求的重定向: 在最终的 Servlet 中, request 对象和中转的那个 request 不是同一个对象.       
   
③. 请求的转发: 只能转发给当前 WEB 应用的的资源
   请求的重定向: 可以重定向到任何资源. 
       
④. 请求的转发: / 代表的是当前 WEB 应用的根目录
   请求的重定向: / 代表的是当前 WEB 站点的根目录. 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值