Servlet规范第二部分

第一。多个Servlet之间的调用规则:

1.前提条件:某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理,但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。

2.提高用户使用感受规则:

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

3.多个Servlet之间调用规则

1)重定向解决方案

2)请求转发解决方案

第二。重定向解决方案:

1。工作原理:用户第一次通过手动方式通知浏览器访问OneServlet。OneServlet工作完之后,将TwoServlet地址写到响应头Location属性中,导致Tomcat将302状态码写入到状态行。

在浏览器接收到相应包后,会读取到302状态。此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成剩余任务。

2.实现命令。respone.sendRedirect(“请求地址”)//重定向不应该加上斜杠,因为其代表的是站点根目录,不加就代表项目根目录,非要加的话要/项目名/TwoServlet(网站名,部署在tomact中)

3.特征

1)请求地址: 既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
                   也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)

2)请求次数:至少发送两次,但只有第一次是用户手动发送,其他事自动。

3)请求方式:重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此 通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】

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

第三。请求转发解决方案:

1.原理:用户第一次通过手动方式要求浏览器访问OneServlet。该Servlet工作完毕之后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat接收到这个请求之后,自动调用TwoServlet来完成剩余任务。

2.实现命令:RequestDispatcher  report = request.getRequestDispatcher("/资源文件名").forward(当前请求对象,当前响应对象);一定要以"/"为开头

3.优点:

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

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

4.特征:

1)请求次数:在请求过程中,浏览器只发送一次请求

2)请求地址:只能向Tomcat服务器申请调用当前网站下资源文件地址
            request.getRequestDispathcer("/资源文件名") //不要写网站名

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

第四。多个Servlet之间数据共享实现方案:

1数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用

2.Servlet规范中提供四种数据共享方案

1.ServletContext接口:

1)来自Servlet规范中一个接口。在Tomcat服务器中负责提供这个接口实现类

2)如果多个Servlet来自同一个网站,彼此之间通过网站的ServletContext实例对象(全局作用域对象)实现数据共享

工作原理: 每一个网站都存在一个全局作用域对象。  这个全局作用域对象【相当于】一个Map.
              在这个网站中OneServlet可以将一个数据 存入到全局作用域对象,当前网站中其他
              Servlet此时都可以从全局作用域对象得到这个数据进行使用。

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

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

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

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

4)在服务器关闭时,负责当前网站中ServletContext进行销毁处理

ServletContext对象生命周期贯穿网站整个运行期间

命令实现:

装数据OneServlet:ServletContext application = request.getServletContesst();

application.setAttribute("key1",数据) //类似map集合。

取数据TwoServlet:ServletContext application = request.getServletContesst();

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

2.Cookie类

1.介绍:Cookic来自于Servlet规范中一个工具类,

             如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookic对象进行数据共享

              cookie存放当前用户的私人数据,在共享数据过程中提高服务质量

              在现实生活场景中,Cookic相当于用户在服务端得到的会员卡

2。原理:用户通过浏览器第一次向myweb网站发送请求申请OneServlet。OneServlet在运行期间创建一个CooKie储存与当前用户相关数据,OneServlet工作完毕后,将Cookie写入到响应头交还给当前浏览器。

浏览器收到响应包之后,将Cookie存储在浏览器的缓存一段时间后,用户通过同一个浏览器再次向myweb网站发送请求申请TwoServlet时。浏览器需要无条件的将myweb网站之前推送过来的Cookie,写入到请求头发送过去。此时TwoServlet在运行时,就可以通过读取请求头中cookie中信息,得到OneServlet提供的共享数据

实现命令:同一个网站OneServlet与TwoServlet借助于Cookie实现数据共享

CooKie ck1 = new Cookie(“key1”,数据);

cookie ck2 = new Cookie(“key2”,数据);

/*

cookie相当于一个map

一个cookie中只能存放一个键值对

这个键值对的key与value只能是String

键值对key不能是中文

将cookie写入到响应头,交给浏览器

resp.addCookie(ck1);

resp.addCookie(ck2)

*/

TwoServlet:

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

Cookie CookieArray【】 =  request.getCookies();

//2.遍历数据得到每一个cookie的key与value

for(Cookie ck:cookieArray){

String key = ck.getName();读取key

String value = ck.getValue();读取value

}

Cookie销毁时机:

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

2.在手动设置,可以要求浏览器将接收的Cookie存放在客户端计算机硬盘上,同时指定在硬盘存活时间,在存活时间到达时,会自动从硬盘上被删除。

3.HttpSession接口

介绍:

1).HttpSession接口来自于Servlet规范下的一个接口,其实现类由Http服务器提供,

2),如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HiipSession对象进行数据共享(会话作用域)

HttpSession与Cookie区别:

储存位置:Cookie:存放在客户端计算机(浏览器内存/硬盘) 

                   HttpSession:存放在服务端计算机内存

数据类型:Cookie对象存储共享数据类型只能是String

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

数据数量: 一个Cookie对象只能存储一个共享数据
             HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据

参照物:  Cookie相当于客户在服务端【会员卡】

               HttpSession相当于客户在服务端【私人保险柜】

命令实现:同一个网站(myWeb)下OneServlet将数据传递给TwoServlet

OneServlet:  

 HttpSession session = request.getSession();

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

TwoServlet:

HttpSession   session = request.getSession();

  Object 共享数据 = session.getAttribute("key1");

.Http服务器如何将用户与HttpSession关联起来:Tomcat将Session id作为一个cookie对象写入到响应头,然后浏览器再次访问该网站时自动发送这个cookie对象此时提供服务的TwoServlet 就可以凭借柜子编号得到用户的私人储物柜并读取由OneServlet写入的共享数据

getSession()  与  getSession(false)

getSession(): 如果当前用户在服务端已经拥有了自己的私人储物柜.要求tomcat将这个私人储物柜进行返回,如果当前用户在服务端尚未拥有自己的私人储物柜,要求tocmat为当前用户创建一个全新的私人储物柜

getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜. 要求tomcat将这个私人储物柜进行返回。如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat将返回null

.HttpSession销毁时机: 

1.用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中.
2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断
3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁:为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】
  这个空闲时间默认30分钟,如果当前HttpSession对象空闲时间达到30分钟
   此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession

4。HttpServletRequest接口

介绍:在同一个网站中,如果两个servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象,因此servlet之间共享同一个请求对象,此时可以利用这个请求对象在两个Servlet之间实现数据共享。

 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】

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

OneServlet:

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

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

TwoServlet:

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值