前提条件
在浏览器发送请求时,往往需要多个Servlet协同处理,但是浏览器在发送请求时:一次请求只能调用一个Servlet,用户处理一次服务需要手动发起多个请求,这对用户来说时非常痛苦的。为了减轻用户获得服务的困难,应该保证无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可。
实现用户直发起一次请求的方法只有两种:
1.重定向解决方案
2.请求转发解决方案
重定向解决方案
- 重定向工作原理:
用户第一次通过【手动】方式通知浏览器访问服务器中的OneServlet动态资源文件。
-OneServlet工作完毕后,将TwoServlet的地址写入到响应头的location属性中,同时把302的状态码写入到响应包的状态行中并发送回浏览器。
-浏览器接受到响应包之后,读取状态行的302状态码,那么此时浏览器就知道服务器返回的不是一个资源文件,而是TwoServlet资源文件的地址,浏览器根据这个资源文件的地址,【自动】向服务器发送第二次请求,访问TwoServlet去完成请求中剩余的任务。 - 实现命令:
//将地址写入到响应包响应头的location属性中。
response.sendRedirect("请求地址");
- 特征:
请求地址
在请求地址中可以填写当前网站内部的资源文件地址;
也可以填写其他网站资源文件的地址。
请求次数
用户【手动】发送了一次请求,浏览器至少发送两次请求。只有第一次请求为用户自己手动发送,后续的请求都是浏览器自己发送。
请求方式
重定向请求解决方案中,是通过地址栏通知浏览器发送发送下一次请求,因此,重定向调用资源文件都是通过【GET】的方式发送请求。 - 缺点:重定向解决方案要在浏览器与服务器之间进行对此往返,大量时间都消耗在往返次数上,增加了用户等待服务的时间。
请求转发
- 请求转发解决方案原理:
-用户第一次通过手动方式要求浏览器发送请求访问OneServlet。
-OneServlet执行完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,会自动调用TwoServlet执行剩余的任务。 - 实现命令:
//请求对象代替浏览器发送请求
//通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名")
//将报告对象发送给Tomcat
report.forward(request,reponse);
- 优点:
1)无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求。
2) Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数。增加处理服务速度。 - 请求次数
在请求转发过程中,浏览器只发送了一次请求。
只能向Tomcat服务器申请调用当前网站下的资源文件。 - 请求方式:在请求转发过程中浏览器只发送了一个Http请求协议包。参与本次请求的所有Servlet共享一个请求协议包,因此这些Servlet接收到的请求方式与浏览器发送的请求方式保持一致。