多个Servlet之间的调用规则

  • Post author:
  • Post category:其他


前提条件

某些来自于浏览器发送请求,往往需要服务端中多个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......");
    }
}



版权声明:本文为qq_45796208原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。