Servlet之重定向、请求转发

多个Servlet之间调用规则

1、前提条件:某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,用户需要手动通过浏览器发起多次请求才能得到服务。这样增加用户获得服务难度,导致用户体验变差。
2、提高用户使用感受规则,无论本次请求涉及到多少个Servlet,用户只需要手动通知浏览器发起一次请求即可。
3、多个Servlet之间调用规则:
a、重定向解决方案
b、请求转发解决方案

重定向

概述

1、用户手动通知浏览器访问OneServlet,OneServlet工作完毕后。
2、将TwoServlet地址写入到响应头Location属性中,导致Tomcat将302状态码写入到状态行,交给浏览器(Location:TwoServlet)。
3、浏览器收到响应包,读取到了302状态码,立刻自动根据响应头中Location中的地址发起第二次请求,访问TwoServlet。
(TwoServlet二次请求是浏览器自动发送的。)
在这里插入图片描述

实现命令:

response.sendRedirect("请求地址");
将地址写入到响应包中响应头的location属性中。
对于response.sendRedirect("String location")中的location,如果不以“/”开头,表示相对于当前源组件的路径;如果以“/”开头,表示相对于当前服务器根路径的URL;如果以“http://”开头,表示一个完整的Internet上的路径。

代码示例

在这里插入图片描述
在这里插入图片描述
启动服务器,在地址栏输入Http://localhost:8080/myWeb/one
在这里插入图片描述
地址栏发生变化,one变为two。
在这里插入图片描述
控制台输出:
在这里插入图片描述

特征

1、请求地址:既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名);也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)。
2、请求次数浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。后续请求都是浏览器自动发送的。
3、请求方式:重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是GET方式。

缺点及其它特性

1、重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间
在这里插入图片描述
2、地址栏改变跳转导致客户端跳转。
3、不能保留request属性(两次请求,地址改变了,客户端跳转,不同的request)。
4、所有代码执行完之后再跳转,跳转语句后的代码还是会执行,除非在后面加上return。
5、通过对URL地址的重写传递参数。(如:response.sendRedirect("hh.jsp? id=aaa")

请求转发

概述

1、用户第一次通过手动方式要求浏览器访问OneServlet。
2、OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet(OneServlet调用forward()方法,在服务端将请求转发给TwoServlet)。
3、Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务(由TwoServlet做出响应)。
在这里插入图片描述
4、请求方式:在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致。

实现命令

请求对象代替浏览器向Tomcat发送请求
1、通过当前请求对象生成资源文件申请报告对象(获取请求转发器对象)。
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");
(一定要以"/"开头)
2、将报告对象转发给Tomcat(转发请求)。
report.forward(当前请求对象, 当前响应对象)

大概代码

OneServlet(xml:/one):

doGet{
	System.out.println("这是OneServlet。");
	RequestDispatcher report = request.getRequestDispatcher("/two");
	report.forward(request, response);
}

TwoServlet(xml:/two):

doGet{
	System.out.println("这是TwoServlet。");
}

在地址栏输入:..../one,回车后,地址栏没有发生变化。
Server的Output显示:
这是OneServlet。
这是TwoServlet。

优点

1、无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求。
2、servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数,增加处理服务速度。
3、地址栏不改变跳转,服务端跳转,服务器之间内部跳转,相同的request,可传参。
4、执行到跳转语句后无条件立刻跳转,之后的代码不再被执行。
注意:使用forward跳转的话,一定要在跳转之前释放掉全部的资源。
5、使用forward时,request设置的属性依然能保留在下一个页面。

间接请求转发

1、间接转发方式,有时也叫重定向,一般用于避免用户非正常访问。
2、例如:
用户在没有登录的情况下访问后台资源,servlet可以将该HTTP请求重定向到登录界面,让用户登录后再访问。
3、代码示例

doGet{
	response.sendRedirect("资源的URl");
}

多个Servlet之间数据共享实现方案

数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用。

Servlet规范中提供四种数据共享方案

1、ServletContext接口
2、Cookie类
3、HttpSession接口
4、HttpServletRequest接口

原文地址:https://www.cnblogs.com/yu011/p/13788589.html