请求对象和响应对象生命周期
- 在http服务器接收到浏览器发送的【http请求协议包】之后 自动为当前的【HTTP请求协议包】生成一个【请求对象】和一个【响应对象】
- 在HTTP服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
- 在HTTP服务器准备推送http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
- 【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
- 【请求对象】和【响应对象】相当于用户在服务端的代言人
欢迎资源文件
-
用户可以记住网站名,但是不会记住网站资源文件名
-
默认欢迎资源文件:
-
- 用户发送了一个针对某个网站的【默认请求】时
- 此时由http服务器自动从当前网站返回的资源文件
http状态码
- 状态码:一个三位数组成的符号
- http服务器推送响应之前,根据本次请求处理情况 将Http状态码写入到响应包中【状态行】上
- 作用: 如果http服务器针对本次请求,返回来对应的资源文件。通过http状态码通知服务器应该如何处理结果
- 分类: 100————599之间 分为五个大类
-
- 1xx 为开头的 :状态码100 本次返回的资源文件不是一个独立的资源文件 ,需要浏览器在接收响应包之后,继续向HTTP服务器要依赖的其他资源文件
- 2xx开头 : 常见200 通知浏览器本次返回的资源文件是完整独立资源文件,浏览器在接收之后不需要再索要其他关联文件
- 3XX开头 : 常见302 状态码 :通知浏览器返回的不是一个资源文件的内容 而是一个资源文件的地址,需要浏览器根据这个地址自动发送强求来索要这个资源文件
- 4XX开头: 常见404 : 通知浏览器 ,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助
- 常见 405: 通知浏览器 : 在服务端中定位到了被访问的资源文件,当时这个Servlet对浏览器发送的请求方式不能处理
- 5XX 开头 :500 :通知浏览器,在服务端已经定位到被访问的资源文件(servlet) 这个Servlet可以接受浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常处理失败
多个Servlet之间调用规则
-
某些来自于浏览器发送请求,往往需要服务端对个Servlet协同处理,但是浏览器一次只能访问一个Servlet,导致用户需要通过浏览器发起多次请求才能得到服务,这样增加用户获得服务难度,导致用户放弃访问当前网站
-
提高用户使用感受规则: 无论本次请求涉及到多少个Serlvet,用户只需要【手动】通知浏览器发起一次请求即可
-
解决方案: 重定向解决方案 请求转发解决方案
-
重定向解决方案:
-
-
工作原理:用户第一次通过【手动方式】通知浏览器访问第一个Servlet,第一个工作完毕后 将第二个servlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行
-
在浏览器接收到响应包之后,会读取到302状态,此时浏览器自动根据响应头中location属性地址发起第二次请求 第二个Servlet去完成请求中剩余任务
-
实现命令 : response.sendRedirect(“请求地址”)
-
重定向特征:
-
请求地址:
-
- 既可以把当前网站内部的资源文件地址发送给服务器(/网站名/资源文件名)
- 也可以把其他网站资源文件地址发送给服务器(“http://ip地址 ”)
-
请求次数 :
-
- 浏览器至少要发送两次请求,但是只有第一次请求是用户手动发送后续请求是浏览器自动发送请求
-
请求方式: 重定向解决方案中 ,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件请求方式一定是【get】
-
缺点: 重定向解决方案需要在浏览器与服务器之间进行多次往返 大量时间消耗在往返的次数上,增加用户等待服务时间
-
-
请求转发解决方案:
-
- 原理 : 用户第一次通过手动方式要求浏览器访问第一个Servlet,第一个Servlet工作完之后,通过当前的请求对象代替浏览器想Tomecat发送请求,申请调用第二个Servlet,Tomcat在接收到这个请求之后,自动调用第二个Servlet来完成剩余的任务
- 实现命令: 请求对象代替浏览器向Tomcat发送请求
- 通过当前请求对象生成资源文件申请报告对象
- RequestDispatcher teport = request.getRequestDispatcher("/资源文件名")
- 将报告对象发送给Tomcat
- report.forward(当前请求对象,当前响应对象)
- 优点:无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
- Servlet 之间调用发生在服务端(增加了服务器的压力)计算机上,节省服务端与浏览器之间的往返次数 增加处理服务速度
- 特征 : 请求次数: 在请求转发过程中,浏览器只发送一次请求
-
请求地址: 只能向Tomcat服务器调用当前网站下资源文件地址 不能写网站名
-
- 请求方式:在请求转发过程中,浏览器只发送一个http请求协议包。参与本次请求的所有Servlet将共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致
多个Servlet之间数据共享实现方案
-
数据共享:第一个Servlet工作完毕后,将产生数据交给第二个Servlet来使用
Servlet规范中提供四种数据共享方案
- ServletContext接口
- Cookle类
- HTTPSession接口
- HttpServletRequest接口
ServletContext接口
- 介绍 : 来自于Servlet规范中一个接口 ,在tomcat中存在Servlet-api.jar
在tomcat中负责提供这个接口实现类
- 如果两个Servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享
- 开发人员习惯将ServletContent对象成为【全局作用域对象】
-
工作原理:
- 每一个网站都存在一个全局作用域对象
- 这个全局作用域对象【相当于】一个Map
- 在这个网站中OneServlet可以将一个数据存入到全局变量作用域对象,当前网站的其他Servlet都可以从全局变量中的到这个数据并且使用
-
全局作用域对象生命周期:
-
在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
-
在Http服务器运行期间是,一个网站只有一个全局作用域对象
-
在Http服务器运行期间,全局作用域对象一直处于存活状态
-
在HTTP服务器准备关闭时,负责将当前网站中全局作用域对象进行销毁
全局作用域对象生命周期贯穿网站整个运行期间
-
-
命令实现 :【同一个网站】 第一个Servlet将数据共享给其他Srevlet
-
- 放入全局作用域 【请求对象】向Tomcat索要当前网站中【全局作用域对象】
- ServletContext application = request.getServletContext()
- 将数据添加到全局作用域对象作为【共享数据】
- application。SetAtteibute(“key1”,“数据”)
-
- 请求获得全局作用域数据
- ServletContext application= request.getServletContext();
- 从全局作用域对象得到指定关键字对应数据
- 数据 = applivation.getAttribute(“key1”) 数据类型为object类型 可以根据需要进行强制转换
Cookie
-
介绍 : Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供Servlet-api.jar中
-
如果两个Servlet来自于同一个网站,并且为同一个浏览器提供服务,此时可以借助于Cookie对象进行数据共享
-
Cookie存放当前用户的私人数据,在共享数据过程提高服务质量
-
在现实生活场景中。Cookie相当于用户在服务端得到的【会员卡】
-
原理 :
- 用户通过浏览器第一次向Myweb网站发送请求申请OneServlet,
- Oneservlet在运行期间创建一个Cookie存储与当前用户相关数据 OneServlet工作完毕后【将Cookie写入到响应头】交还给当前浏览器
- 浏览器收到响应包之后,将cookie存储到浏览器的缓存 一段时间之后,用户通过【同一个浏览器】再次向【myweb网站】发送请求申请TwoServlet时
- 【浏览器需要无条件的将myweb网站之前推送过来的cookie,写入到响应头当中】发送过去
- 此时TwoServlet在运行时,就可以通过读取请求头中的cookie信息,从而得到OneServlet中的共享信息
-
实现命令 :
创建: // 创建一个cookie对象 用来保存共享数据 Cookie card = new cookie("key1","asd") // 将cookie写入到响应头当中,交给浏览器 resp.addCookie(card) 调用: //调用请求对象 从请求头得到浏览器返回的Cookie Cookie cookieArray[] = request.getCookies(); // 循环遍历数据得到每一个cookie得到key和value for(Cookie card:cookieArray){ String key = caed:getName();//读取key值“key1” String value = vard,getValue();//读取value “asd” //对数据进行操作 。。。。。 }
-
生命周期 cookie销毁时机:
-
- 在默认情况下cookie存在浏览器的缓存当中
- 只要浏览器关闭 ,cookie就会销毁
- 在手动设置情况下,可以要求浏览器将接受的cookie存放在客户端计算机上硬盘,同时制定cookie的存活时间 ,即使关闭客户端关闭浏览器都不会消失,在存活时间到达的时候cookie会从硬盘上被删除
- cookie.setMaxAge(60)//存活60秒
HttpSession 接口
-
介绍:
- HTTPSession接口来自于Servlet规范下的一个接口,存在于Tomcat提供Servlet-api.jar中,其实现类由Http服务器提供,Tomcat提供实现类存在于Servlet-api.jar中
- 如果两个Servlet来自于同一个网站,并且为同一个浏览器/客户提供服务,此时可以借助于HTTPSession对象进行数据共享
- 开发人员习惯将HTTPSession接口修饰对象称为【会话作用域对象】
-
HTTPSession和Cookie区别: 【面试题】
-
存储位置不同: 一个在天上一个在低下
- Cookie:存放在客户端计算机上
- HTTPSession : 存在服务端计算机内存上
-
数据类型 :
- Cookie只能存储String类型
- HTTPSession对象可以存储任意类型的共享数据object类
-
数据数量
- 一个Cookie对象只能存储一个共享数据
- HTTPSession使用map集合存储共享数据,所有可以存储任意数量共享数据
-
参照物
- Cookie相当于客户在服务端【会员卡】
- HTTPSession相当于客户在服务端的【私人保险柜】
-
命令实现
//OneServlet将数据传递给TwoServlet //1 调用请求对象向Tomcat索要当前用户在服务端的私人储物柜 HttpSession session = request.getSession(); //2将数据添加到用户私人储物柜 session.setAttribute("key1","共享数据"); //1TwoServlet 调用请求对象向Tomcat索要当前用户在服务端的私人储物柜 HttpSession session = request.getSession(); //2将数据添加到用户私人储物柜 session.setAttribute("key1","共享数据");
-
Http服务器如何将用户与HttpSeeion关联起来 : 通过cookie
-
getSession()与getSession(false)区别
- getSession() : 如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回 如果当前用户在服务端尚未拥有自己的私人储物柜 要求tomcat为当前用户创建一个全新的私人储物柜
- getSession(false):如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回 如果当前用户在服务端尚未拥有自己的私人储物柜此时Tomcat将返回null
-
-
HTTPSession销毁时机
- 用后与HttpSession关联时使用的cookie只能存放在浏览器缓存中
- 在浏览器关闭时 意味着用户与他的HTTPSession关系被切断
- 由于tomcat无法检测浏览器什么时候关闭,因此浏览器关闭时不会 导致Tomcat将浏览器关联的HTTPSession进行销毁
- 为了解决这个问题,Tomcat为每一个HTTPSession对象设置【空闲时间】
- 这个空闲时间默认为30分钟,如果当前HTTPSession对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HTTPSession,此时Tomcat就会销毁掉这个HTTPSession
-
httpSession 空闲时间手动设置
-
在web.xml 中设置
<session-config> <session-timeout>5</session-timeout>//设置空闲时间5分钟 </session-config>
-
HttpServletRequest接口实现数据共享
- 介绍 :
- 如果在同一个网站中,如果两个Servlet通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包,而一个请求协议包只对应一个请求对象,因此Servlet之间共享同一个请求地偶像,此时可以利用这个请求对象在两个Servlet之间实现数据共享
- 在请求对象实现Servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
- 命令实现:
OneServlet
//1.将数据添加到【请求作用域对象】中attribute属性
request.setAttribute("key1",数据);//数据类型可以任意类型object
//2.向Tomcat申请调用TwoServlet
request.getRequestDispatcher("/two").forward(request,response)
TweServlet
//从当前请求对象得到OneServlet写入到共享数据
object 数据 = request.geAttribute("key1");
Servlet扩展--------------- 监听器接口
-
介绍
- 一组来自于Servlet规范下接口,共有八个接口。在Tomcat存在Servlet-api.jar保重
- 监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
- 监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
-
作用域对象:
- Servlet规范中存在于服务端内存中,可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】
- Servlet规范下作用域对象:
- ServletContext: 全局作用域对象
- HTTPSession: 会话作用域对象
- HttpServletRequest: 请求作用域对象
-
监听器接口实现类开发规范: 三步
- 1 。 根据监听的实际情况,选择对应监听器接口进行实现
- 2 。 重写监听器接口声明【监听事件处理方法】
- 3 。在web.xml文件将监听器接口实现类注册到Http服务器
-
ServletContextListener接口
- 作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
- 监听事件处理方法:
- public void contextInitlized(); 在全局对对象被Http服务器创建
- public void contextDestroyed(); 在全局对对象被Http服务器销毁
- xml 中配置监听器
- ServletContextAttributeListener接口
- 作用: 通过接口合法的检测全局作用域对象共享数据变化时刻
- 监听事件处理方法:
- public void attributeAdd() 在全局作用域对象添加共享数据被触发
- public void attributeRemoved () 在全局作用域对象删除共享数据被触发
- public void attributeReplaced 在全局作用域对象被更新时触发
Servelt规范---- Filer接口(过滤器接口)
-
介绍:来自于Servlet规范下接口,在tomcat中处在于servlet-api.jar包中
- Filter接口实现类由开发人员提供,Http服务器不负责提供
- Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
-
具体作用:
- 拦截Http服务器,帮助Http服务器检测当前请求合法性
- 拦截Http服务器,对当前请求进行增强操作
-
Filter接口实现类开发步骤:三步
- 创建一个java类实现Filter接口
- 重写Filter接口中doFilter方法
- web.xml将过滤器注册实现类注册到Http服务器
-
Filter拦截地址格式
-
命令格式:在web.xml中写
- oneFilter
- 拦截地址
-
命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用oneFilter进行拦截
-
要求Tomcat在调用某个具体文件之前,来调用oneFilter拦截
- /img/mm.jpg
-
要求tomcat在调用某一个文件夹下所有的资源文件之前来调用onefilter
- /img/*、
-
要求tomcat在调用任意文件夹下某种类型文件之前,来调用oneFilter
- *.jpg
-
要求tomcat在调用网站中任意文件时,来调用oneFilter拦截
- /*
-