前提条件
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。
但是我们的浏览器一次只能访问一个Servlet,导致我们的用户需要手动的
通过浏览器发起多次请求才能得到服务。
提高用户使用感受的规则
无论本次请求涉及到多少个Servlet,用户只需要【手动】的通知浏览器发起一次请求即可
多个servlet之间相互调用的规则
1)
重定向解决方案
2)
请求转发解决方案
重定向解决方案
1、工作原理:
用户第一通过【手动】的方式通知浏览器访问OneServlet。
OneServlet工作完毕之后,将TwoServlet地址写入到响应头
location
属性中,导致Tomcat
将302状态码
写入到状态行中。
浏览器接收到响应包之后,会读取到302的状态码,此时浏览器
会自动的根据响应头中的location属性地址,发起第二次请求,
访问TwoServlet去完成请求中剩余的任务。
2、实现命令:
response.sentRedirect(“请求地址”);
将地址写入到响应包中响应头中的location属性。
3、特征:
1)关于请求地址:
即可以把当前
网站内部的资源文件地址
发送给浏览器(
/网站名/资源文件名
)
也可以把
其他网站的资源文件
发送给浏览器
(http://ip地址:端口号/网站名/资源文件名
)
2)请求的次数:
浏览器至少要发送
两次
请求,但是只有第一次请求是用户手动发送的,
后续请求都是由浏览器自动发送的。
3)请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件所接收的
请求方式一定是【GET】
4)缺点:
重定向解决方案,需要在浏览器于服务器之间进行多次的往返,大量的时间
消耗在往返次数上,增加用户的等待时间
代码展示
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("OneServlet is running....");
//重定向将解决方案
//response.sendRedirect("/myWeb/two");
response.sendRedirect("http://www.baidu.com");
}
}
public class TwoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TwoServlet is running.....");
}
}
请求转发解决方案
1、工作原理:
用户第一次通过【手动】方式要求浏览器访问OneServlet。
OneServlet在工作完毕之后,通过
当前的请求对象代替浏览器
向Tomcat发送请求,申请调用TwoServlet。
Tomcat在接收到这个请求之后,自动调用TwoServlet来完成
剩余的任务。
2、实现命令:让请求对象代替浏览器向Tomcat服务器发送请求
//通过当前请求对象生成资源文件申请报告
RequestDispatcher report=request.getRequestDispatcher(“/资源文件的名称”);一定要以斜线”/”为开头
//将这个报告对象发送给Tomcat
report.forward(当前的请求对象,当前的响应对象);
3、优点:
1)无论本次请求涉及到了多少个Servlet,
用户只需要手动通过浏览器发送一次请求
2)Servlet之间调用发生在服务端计算机上,
节省了服务端与浏览器之间的往返次数
增加了处理服务的速度
。
4、特征:
1)请求的次数:
在请求转发过程中,浏览器只发送了
一次
请求
2)请求地址:
只能向Tomcat服务器申请调用
当前网站下的资源文件
request.getRequestDispatcher(“/资源文件名”);
******
不要写网站名
*******
3)请求方式:
在请求转发过程中,浏览器只发送了一个Http请求协议包。
参与本次请求的所有Servlet共享同一个请求协议。
这些Servlet接收的请求方式与浏览器发送的请求方式保持一致。
代码展示
public class OneServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("OneServlet is doing.......");
//通过请求对象生成资源文件申请报告
RequestDispatcher report=null;
report= request.getRequestDispatcher("/two");
report.forward(request,response);
}
}
public class TwoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TwoServlet is running......");
}
}