多个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");
}
}