JavaWeb-03-Servlet-09-多个Servlet之间的调用
JavaWeb-03-Servlet-09-多个Servlet之间的调用
1.问题
某些来自于浏览器中的请求,往往需要服务端中多个Servlet接口实现类协同处理。
但是浏览器一次只能访问一个Servlet,这就导致用户需要手动通过浏览器发起多次请求才能获得服务。
这样会增加用户获得服务的难度。
2.如何解决
提高用户体验。
无论本次请求涉及到多少个Servlet,让用户只需要【手动】通知浏览器发起一次请求即可,
剩下的调用交给后台处理。
3.解决方案
解决多个Servlet之间的调用。
- 重定向解决方案
- 请求转发解决方案
4.重定向解决方案
4.1工作原理
用户第一次通过【手动方式】通知浏览器访问OneServlet。
OneServlet处理请求完毕后,将TwoServlet的地址写入响应头的【location】属性中,导致Tomcat将302状态码写入到状态行。
在浏览器接收到响应包后,读取到302状态码。此时浏览器会自动根据响应头中的【location】属性里的地址发起第二次请求,访问TwoServlet去完成请求中的剩余任务。
TwoServlet处理请求完毕后,将ThreeServlet的地址写入响应头的【location】属性中,导致Tomcat将302状态码写入到状态行。
在浏览器接收到响应包后,读取到302状态码。此时浏览器会自动根据响应头中的【location】属性里的地址发起第三次请求,访问ThreeServlet去完成请求中的剩余任务。
ThreeServlet处理完请求后,将处理结果写入响应体中,发送给浏览器。导致Tomcat将200状态码写入到状态行。
4.2实现命令
response.sendRedirect("请求地址");
将地址写入响应头中的【location】属性。
4.3演示
新建一个网站MyWeb,创建三个Servlet接口实现类。【OneServlet】、【TwoServlet】、【ThreeServlet】。
在/web目录下新建一个html页面,创建一个表单,指向OneServlet。
4.3.1第一个:OneServlet
重写doGet方法,将TwoServlet的地址写入响应头的location属性。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/16 22:03
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("OneServlet负责---->去叙利亚");
//重定向解决方案
response.sendRedirect("/MyWeb/two");//地址格式:[/网站名/资源文件名]
}
}
4.3.2第二个:TwoServlet
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/16 22:06
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TwoServlet负责---->买AK");
//重定向解决方案
response.sendRedirect("/MyWeb/three");//地址格式:[/网站名/资源文件名]
}
}
4.3.3第三个:ThreeServlet
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @Author: TSCCG
* @Date: 2021/08/16 22:08
*/
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ThreeServlet负责---->在叙利亚进行真人CS---->返回结果");
response.sendRedirect("/MyWeb/body.jpg");
}
}
4.3.4html页面
在/web目录下,新建一个index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>叙网</title>
<style type="text/css">
* {
font-size: 25px;
}
.title {
color: red;
font-size: 30px;
}
</style>
</head>
<body>
<center>
<div class="title">叙利亚欢迎您!</div>
<span><img src="https://pic.imgdb.cn/item/611b45544907e2d39c203de3.jpg"/></span>
<form action="/MyWeb/one" method="get">
姓名:<input type="text" name="userName">
<br>
密码:<input type="password" name="passWord">
<br>
<input type="submit" value="点击报名">
<input type="reset" value="重置">
</form>
</center>
</body>
</html>
4.3.5开始演示
4.4特征
1.请求地址
既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名),
也可以把其他网站的资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件地址)
2.请求次数
浏览器至少发送两次请求,但只有第一次请求是用户手动发送的,后续请求都由浏览器自动发送。
3.请求方式
重定向解决方案中,浏览器发现状态码为302后,会从响应头的location属性中读取服务端传过来的地址,写入地址栏中再次发送请求。而从浏览器地址栏发送的请求都是get方式。
4.5缺点
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间都消耗在往返次数上,这样会增加用户等待服务的时间。
5.请求转发解决方案
5.1工作原理
- 用户第一次通过手动方式要求浏览器访问OneServlet。
- OneServlet工作完毕后,通过当前的请求对象代替浏览器向服务器发送请求,申请调用TwoServlet。服务器在接收到请求后,自动调用TwoServlet来完成接下来的工作。
- TwoServlet工作完毕后,通过当前的请求对象代替浏览器向服务器发送请求,申请调用ThreeServlet。服务器在接收到请求后,自动调用ThreeServlet来完成接下来的工作。
- ThreeServlet工作完毕后,将处理结果返回给浏览器。
5.2实现命令
实现请求对象代替浏览器向服务器发送请求。
1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");
2.将报告对象发送给服务器
report.forword(当前请求对象,当前响应对象);
5.3演示
新建一个网站:MyWeb,创建三个Servlet接口实现类:OneServlet、TwoServlet、ThreeServlet。
在web目录下创建index.html。
5.3.1第一个OneServlet
package com.tsccg.controller;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/17 14:02
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理请求
System.out.println("OneServlet---->去叙利亚");
//1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/two");
//2.将报告对象发送给服务器
report.forward(request,response);
}
}
5.3.2第二个TwoServlet
package com.tsccg.controller;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/17 14:04
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理请求
System.out.println("TwoServlet---->买AK");
RequestDispatcher report = request.getRequestDispatcher("/three");
report.forward(request,response);
}
}
5.3.3第三个ThreeServlet
package com.tsccg.controller;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Author: TSCCG
* @Date: 2021/08/17 14:04
*/
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理请求
System.out.println("ThreeServlet---->在叙利亚进行真人CS");
//返回结果给浏览器
response.sendRedirect("/body.jpg");
}
}
5.3.4html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>叙网</title>
<style type="text/css">
* {
font-size: 25px;
}
.title {
color: red;
font-size: 30px;
}
</style>
</head>
<body>
<center>
<div class="title">叙利亚欢迎您!</div>
<span><img src="/MyWeb/body1.jpg"/></span>
<form action="/MyWeb/one" method="get">
姓名:<input type="text" name="userName">
<br>
密码:<input type="password" name="passWord">
<br>
<input type="submit" value="点击报名">
<input type="reset" value="重置">
</form>
</center>
</body>
</html>
5.3.5开始演示
5.4特征
1.请求次数
在请求转发过程中,浏览器只发送一次请求。
2.请求地址
只能向Tomcat服务器申请调用当前网站下资源文件地址,
3.请求方式
在请求转发过程中,浏览器只发送了一个Http请求协议包。
参与本次请求的所有Servlet共享同一个请求协议包,所以这些Servlet接口实现类接收的请求方式和浏览器发送的请求方式一致。
5.5优点
1.无论本次请求涉及多少个Servlet,用户只需要手动通过浏览器发送一次请求
2.Servlet之间调用发生在服务端计算机上,节省服务端和浏览器之间的往返次数,增加处理服务的速度。