JavaWeb-03-Servlet-09-多个Servlet之间的调用

JavaWeb-03-Servlet-09-多个Servlet之间的调用

1.问题

某些来自于浏览器中的请求,往往需要服务端中多个Servlet接口实现类协同处理。

但是浏览器一次只能访问一个Servlet,这就导致用户需要手动通过浏览器发起多次请求才能获得服务。

这样会增加用户获得服务的难度。

2.如何解决

提高用户体验。

无论本次请求涉及到多少个Servlet,让用户只需要【手动】通知浏览器发起一次请求即可,

剩下的调用交给后台处理。

3.解决方案

解决多个Servlet之间的调用。

  1. 重定向解决方案
  2. 请求转发解决方案

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工作原理

  1. 用户第一次通过手动方式要求浏览器访问OneServlet。
  2. OneServlet工作完毕后,通过当前的请求对象代替浏览器向服务器发送请求,申请调用TwoServlet。服务器在接收到请求后,自动调用TwoServlet来完成接下来的工作。
  3. TwoServlet工作完毕后,通过当前的请求对象代替浏览器向服务器发送请求,申请调用ThreeServlet。服务器在接收到请求后,自动调用ThreeServlet来完成接下来的工作。
  4. 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之间调用发生在服务端计算机上,节省服务端和浏览器之间的往返次数,增加处理服务的速度。

posted @ 2021-08-16 23:10  TSCCG  阅读(144)  评论(0编辑  收藏  举报