多个servlet

    多个servlet之间调用规则

1,前提条件:

某些来自浏览器的请求,需要服务端中多个servlet协同处理,但是浏览器一次只能发送一个请求,导致需要手动通过浏览器多次发送请求之服务器获取服务。

2,调用规则:

无论涉及到多少个servlet,用户只需手动  通知浏览器发送一次请求即可。

3,多个servlet之间的调用规则:

  • 1)重定向解决方案

    工作原理:

                     用户第一次通过手动方式通知浏览器访问第一个Servlet,这个servlet工作完毕后,会将第二个servet的地址写入到第一个servlet的响应头中的location属性中,此时tomcat会将302状态码写入到状态行。在浏览器接收到响应包之后,会读取302状态,访问location属性值的地址,完成剩余 请求任务。

    代码实现:

                        response.sendRedirect("请求地址")

    特征:01:请求地址:可以是内部资源文件,也可以是其他网站资源文件地址(http://ip:端口号/网站名/资源文件名   eg:http://www.baidu.com)

               02:请求次数:浏览器至少发送两次请求,但是只有第一次是用户手动发送的,后续都是浏览器自动发送的。

              03:请求方式:通过地址栏通知浏览器发送下一次啊请求,因此是get方式

    缺点:重定向解决方案需要在浏览器与服务器之进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。

  • 2)请求转发解决方案

 01 原理:

    用户第一次通过手动方式要求浏览器访问OneServlet。Oneservlet工作完毕后,通过当前的请求对象代替浏览器向tomcat发送请求,申请调用Twoservlet。tomcat在接受到这个请求之后,自动调用TwoServlet来完成剩余任务。

02 实现命令

    请求对象代替浏览器向tomcat发送请求

        //1、通过当前请求对象生成资源文件申请报告对象

        RequestDispatcher dispatcher= request.getRequestDispatcher("/资源文件名");一定以"/开头"

        //2、将报告对象发送给tomcat

        dispatcher.forward(当前请求对象,当前响应对象);

03 优点

      1)无论涉及到多少个servlet,用户手动通过浏览器发送一次请求

      2)servlet之间的调用发生在服务器计算机上,节省服务器与浏览器之间的往返次数,增加处理服务的速度。

04 特征

    1)请求次数:

    手动发起一次请求。

    2)请求地址:

    只能向tomcat服务器申请调用当前网站资源文件地址    request.getRequestDispathcer("/当前网站资源名")

    3)请求方式:在请求转发的过程中,浏览器只发送了一个请求协议包。参与本次请求的所有servlet共享一个请求协议包,因此这些servlet的请求方式与浏览器发送的请求协议包一致。

  • 多个servlet数据共享的方案
  • 1、servletContext接口(全局作用域对象)

    **工作原理:

    在每一个网站中都存在一个全局作用域对象,这个全局作用域对象相当于一个map,在这个网站中oneservlet可以将一个数据存入到全局作用域对象,当前网站中其他servlet此时都可以从全局作用域对象得到这个数据进行使用。

    **全局作用域对象生命周期

    在http服务器启动的过程中,自动为当前网站在内存中创建一个全局作用域对象。

    在http服务器运行期间,一个网站只有一个全局作用域对象

    在http服务运行期间,全局作用域对象一直处于存活状态

    在http服务准备关闭时,负责将当前网站中全局作用域对象进行销毁处理。

    **命令实现

【同一个网站】 oneservlet将数据共享给twosrvet

oneSwevlet{

 public void doGet(HttpServletRequest request,HttpServletResponse response){

       //1.通过请求对象向当前网站索要servletConext

    ServletContext application = request.getServletContext();

      //2.将数据添加到全局作用域对象作为【共享数据】

    application.setAttribute("key",vaue);

        }

}

 

 

twoSwevlet{

 public void doGet(HttpServletRequest request,HttpServletResponse response){

       //1.通过请求对象向当前网站索要servletConext

    ServletContext application = request.getServletContext();

      //2.将数据添加到全局作用域对象作为【共享数据】

     object key =application.getAttribute("key");

        }

}

  • 2、Cookie 

**工作原理:

             用户通过浏览器第一次向MyWeb网站发送请求申请OneServet,OneServlet在运行期间创建一个Cookie存储与当前用户相关的数据,OneServlet工作完毕后,将Cookie对象写入到响应头交还给当浏览器。               浏览器在接收到响应包后,将Cookie存储在浏览器的缓存,一段时间之后,用户通过同一浏览器再次向MyWeb网站发送申请TwoServlet时,此时浏览器无条件的需要将MyWeb网站之前推送过来的Cookie写入到请求头中,发送过去,此时TwoServlet在运行是,就可以通过请求头中Cookie中的信息,得到Onesrvlet提供的共享数据信息。

    **cookie的销毁时机

      1、默认情况下,Cookie的对象存放在浏览器的缓存中,因此浏览器关闭,cookie对象就被销毁掉。

       2、在手动设置的情况下,可以要求浏览器将接受的Cookie存放在客户端的计算机硬盘上,同时需要指定cookie在硬盘上存活的时间。在存活的时间范围内,关闭浏览器或者服务器都不会导致Cookie销毁,在存活的时间到达后,cookie自动从硬盘上被删除。

         代码:cookie.setMaxAge(60);//cookie在硬盘上存活一分钟。

    **命令实现

【同一个网站】 oneservlet与Twoservlet借助于cookie实现共享数据

oneSwevlet{

           public void doGet(HttpServletRequest request,HttpServletResponse response){

        //1、创建一个cookie对象,保存共享数据(当前用户数据)

         Cookie cookie1 =new Cookie("Key1","abc");

        Cookie  cookie2 =new Cookie("Key2","efg");

        ******************cookie相当于一个map,但是一个cookie只能存放一个键值对;

        ****************** cookie的键值对只能是String,键值对的键不能是中文

        //2、将cookie写入到响应头中去,交给浏览器

        response.addCookie(cookie1);

        response.addCookie(cookie2);

       }

   }

 

        客户端   <-----------------响应包  【200】

                                                          【cookie:Key=abc;Key=efg】

                                                          【】

                                                          【处理结果】

        浏览器向myWeb网站发送请求访问TwoServlet------> 请求包【url:/myweb/two  method:get】

                                                                                                       【请求参数:xxx

                                                                                                         cookie   key1=abc;key2=efg

                                                                                                        】

                                                                                                       【】

                                                                                                       【】

twoSwevlet{

 public void doGet(HttpServletRequest request,HttpServletResponse response){

       //1.调用请求对象从请求头中得到浏览器返回的Cookie

            Cookie cookieArr[] =request.getCookies();

         //2、for循环遍历数据得到每一个cookie的key与value

               for(Cookie card:cookieArrr){

                  String key =card.getName();//读取key

                  String vlue=card.getValue();//读取value

                 }

}

 

  • 3、HttpSession

        ****又称为【会话作用域对象】

        ****HttpSession和Cookie的区别

        1)存储位置:

                                 cookie客户端(浏览器内存/硬盘中)

                                 session在服务端计算机的内存中

        2)存储的数据类型:

                                 cookie对象存储的类型只能是String

                                 HttpSession对象可以存储任意类型的共享数据

        3)存储数据的数量

                              一个cookie只能存储一个共享数据,

                               HttpSession使用map集合存储共享数据,所以可以存储任意类型数量的共享数据。

            ****命令的实现:

                  同一个网站下(MyWeb)下OneServlet将数据传递给woServlet

   OneSrvlet{

            public void doGet(HttpServletRequest request ,HttpServletResponse respons){

                     //1、调用请求对象向Tomcat索要sesson

                         HttpSession session =request.getSession();

                     //2、将数据存入session中

                         session.setAttribute("key1",共享数据);

           }

       }

浏览器访问/mywe中的TwoServlet

      TwoServlet{

             public void doGet(HttpServletRequest request,HttpServletResponse response){

                  //1、调用请求对象向Tomcat索要session

                 HttpSession session =request.getSession();

                  //2、从session取出共享数据

                 Object 数据 = sessio.getAttribute("key1");  

     }       

}

        ***Http服务器是使用【cookie】将用户与session关联起来

        ****getSession()与getSession(false)的区别

          1)getSession():如果当前用户在服务端已经有了session,要求tomcat将这个session返回;如果当前用户在服务端没有session,则要求tomcat在服务端创建一个全新的session。

          2)getSession(false):如果当前用户在服务端已经有了session,要求tomcat将这个session返回;如果当前用户在服务端没有session,则返回为null

         ****HttpSession的销毁时机

            1、用户与HttpSession关联时,使用的cookie放在浏览器缓存中。   

            2、在浏览器关闭时,意味着HttpSession与用户的关系被切断

            3、但是tomcat无法检测机器何时关闭,所以在浏览器被关闭时服务端的HttpSession并不会被销毁。

            4、HttpSesssion的销毁时机:tomcat为每一个HttpSession对象设置【空闲时间】,这个空闲时间默认为30分钟,如果当前的HttpSession对象空闲时间长达30分钟,此时tomcat认为用户已经放弃了自己的Session,tomcat就会销毁掉这个HttpSession

        ****HttpSession的空闲时间手动设置

            /web/WEB-INF/web.xml

               <session-config>

                    <session-timeout> 5 <session-timeout>         <!--当前网站中每一个session的最大空闲时间-->

                <session-config>

      

  • 4、HttpServletequest接口实现数据共享

在同一个网站中,如果两个servlet之间通过【请求转发】方式进行调用,彼此之间共享一个请求协议包。

            命令的实现:oneServlet通过请求转发申请调用TwoSerlet时,需要给TwoServlet提供共享数据

           oneServlet{

                     public void doGet(HttpServletRequest req,HttpServletResponse response){

                       //1、将数据添加到【请求作用域对象】中attribute属性

                              req.setAttribute("key1","数据");//数据类型可以任意类型;

                        //2、向tomcat申请调用TwoServlet

                              req.getRequestDispatcher("/two").forward(req,response);

       }

  }

           twoSerlet{

                  //从当前请求对象得到oneServlet写入到共享数据

                   object 数据  =  req.getAttribute("key1");

           }

}

posted @ 2021-02-15 17:24  8ling1ling  阅读(86)  评论(0)    收藏  举报