多个Servlet来处理同一次请求方案
一、【前提】:
1)一个Servlet只负责实现一个功能
2)浏览器在一次请求时,只能请求一个资源文件
3)如果浏览器的请求需要由多个Servlet来协同完成,需要用户多次通过【手动提交】来完成任务,这样降低服务质量
二、【方案分类】:
只需要用户手动通过浏览器发送一次请求,就可以将本次请求相关的Servlet来依次调用
- 重定向方案
- 请求转发方案
三、【重定向方案原理】:
在第一个Servlet工作完毕后,将【第二个Servlet地址】推送给用户浏览器,由用户浏览器根据这个地址来【自动的】向第二个Servlet发送请求
四、【重定向方案涉及命令】:
response.sendRedirect(第二个Servlet地址);将一个地址写入到【响应头】中location
浏览器接收到响应包之后,自动根据location地址发送第二次请求,这样好处是避免用户手动发送请求
五、【重定向方案特征】:
- 【发生位置】:在客户端的浏览器上
- 【浏览器发送的请求次数】:多次
- 【地址栏内容是否会发生变化】:会发生变化,内容是浏览器第二次要访问的资源地址
- 【重定向时,浏览器采用的请求方式】:由于此时通过地址栏命令浏览器发送请求,所以浏览器采用请求方式一定是GET方式
- 【重定向时,访问的资源文件范围】:可以访问的资源文件可以是同一网站资源,也可以是其他网站资源
六、【重定向方案适用场景】:
- 添加功能Servlet 调用 查询功能Servlet
- 删除功能Servlet 调用 查询功能Servlet
- 更新功能Servlet 调用 查询功能Servlet
七、【请求转发原理】:
在第一个Servlet工作完毕后,代替当前浏览器向Tomcat申请调用第二个Servlet
Tomcat在接受到申请之后,调用第二个Servlet来完成本次请求中剩余任务
八、【请求转发涉及命令】:
OneServlet
//1. 创建一个资源申请报告对象
RequestDispatcher report = request.getRequestDispatcher(“第二个Servlet地址”);
//2. 将申请报告推送给Tomcat,同时将oneServlet拥有的【request和response】一并交给Tomcat
report.forward(request,response)
//3. Tomcat在接收到报告后,就会调用第二个Servlet完成剩余任务
九、【请求转发时为什么将第一个Servlet中request和response交给Tomcat】:
- Tomcat在接受到请求后,需要调用第二个Servlet。
- Tomcat此时需要为第二个Servlet提供运行时需要【request】和【response】
- 但是,本次请求是由第一个Servlet来发送的,没有对应的【请求协议包】因此导致Tomcat在接收到请求后,不会创建【request】和【response】
- 为了解决这个问题,需要将第一个Servlet使用【request】和【response】通过Tomcat交给第二个Servlet来使用。
十、【请求转发特征】:
- 【发生位置】:发生在服务端
- 【浏览器发送请求次数】:浏览器只向服务端发送了一次请求
- 【地址栏内容是否会发送变化】:由于请求转发发生在服务端,因此浏览器地址内容保持在一次请求内容
- 【调用资源文件范围】:只能访问同一个访问内部的资源文件
- 【通过请求转发调用的Servlet接收的请求方式】:与浏览器第一次发送请求时,使用的请求方式保持一致;参与同一次请求转发的所有Servlet接收的请求方式是一样的
- 【参与同一次请求转发的所有Servlet之间如何进行数据共享】
1)可以使用全局作用域对象,提供共享数据
2)可以使用会话作用域对象,提供共享数据
3)可以使用请求作用域对象,提供共享数据
十一、【请求转发不适合场景】:
查询Servlet调用JSP时