第一。多个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");