Servlet
Servlet规范
1.Servlet来自于JAVAEE规范中的一种
2.作用:
- 在Servlet规范中,指定【动态资源文件】开发步骤
- 在Servlet规范中,指定Http服务器调用动态资源文件规则
- 在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
Servlet接口实现类:
- Servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器提供jar包
- Tomcat服务器下lib文件就有一个servlet-api.jar存放Servlet接口
- Servlet规范中认为,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
class Student{
// 不是动态资源文件,Tomcat无权调用
}
class Student implements Servlet{
// 合法动态资源文件,Tomact有权调用
Servlet servelt = new Student;
servlet.doGet();
}
Servlet接口实现类开发步骤
- 第一步:创建一个Java类继承HttpServlet父类,使之成为一个Servlet接口实现类
- 第二步:重写HttpServlet父类两个方法(doGet doPost)
浏览器---get--》oneServlet.doGet()
浏览器---post--》oneServlet.doPost() - 第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
[网站] ----> 【web】 -----> 【WEB - INF】 ---- Web.xml
<!--将Servlet接口实现类类路径交给Tomcat-->
<servlet>
<servlet-name>one</servlet-name> <!--声明一个变量存储servlet接口实现类类路径-->
<servlet-class>com.cedric.OneServlet</servlet-class>
</servlet>
<!--为了降低用户访问servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
<servlet-name>one</servlet-name>
<url-pattern>/one</url-pattern><!-- 设置简短请求别名,别名在书写时必须以‘/’为开头 -->
</servlet-mapping>
Servlet对象生命周期:
1.网站中所有的servlet接口实现类的实例对象,只能由Http服务器负责创建,开发人员不能手动创建Servlet接口实现按类的实例对象
2.在默认情况下,Http服务器接收到对于当前Servlet接口实现类第一次清华时自动创建这个servlet接口实现按类的实例对象
再手动配置的情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象
<servlet>
<servlet-name>one</servlet-name> <!--声明一个变量存储servlet接口实现类类路径-->
<servlet-class>com.cedric.OneServlet</servlet-class>
<load-on-startup>25</load-on-startup><!--填写一个大于0的整数即可-->
</servlet>
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
4.在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
HttpServletResponse接口
介绍:
1.HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2.HttpServletResponse接口实现类由Http服务器负责提供
3.HttpServletResponse接口负责将doGet/doPost方法执行结果写入到响应体交给浏览器
4.开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
主要功能
1.执行结果以二进制的形式写入到【相应体】
2.设置响应头中【content-type】属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译【文字、图片等】
3.设置响应头中【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求
HttpServletRequest接口
介绍
1.HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
2.HttpServletRequest接口实现类由Http服务器负责提供
3.HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
4.开发人员习惯将HttpServletRequest接口修饰的对象称为【请求对象】
作用
1.可以读取Http请求协议包中【请求行】信息
2.可以读取保存在Http请求包中【请求头】或者【请求体】中请求参数信息
3.可以代替浏览器向Http服务器申请资源文件调用
请求对象与响应对象生命周期
1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】
2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法中,确保doGet/doPost正确执行
3.在Http服务器准备推送Http响应包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中相当于用户在服务端的代言人
欢迎资源文件
前提:用户可以记住网站名,但是不会记住网站资源文件名
默认欢迎资源文件:用户发送了针对某个网站【默认请求时】,由Http服务器自动从当前网站返回的资源文件
Tomcat对于默认欢迎资源文件定位规则
规则位置:Tomcat安装位置/conf/web.xml
规则命令:
<welcome-file-list>
<welcom-file-list>index.html</welcom-file-list>
<welcom-file-list>index.htm</welcom-file-list>
<welcom-file-list>index.jsp</welcom-file-list>
</welcome-file-list>
设置当前网站的默认欢迎资源文件规则
规则位置:网站/web/WEB-INF/web.xml
<welcome-file-list>
<welcom-file-list>index.login</welcom-file-list>
<welcom-file-list>index.hello</welcom-file-list>
</welcome-file-list>
网站自设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
Http状态码
1.由三位数字组成的一个符号
2.Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入打哦响应包中【状态行】上
3.如果Http服务器针对本次请求,返回了对应的资源文件,通过Http状态码通知浏览器应该如何处理这个结果
如果Http服务器针对本次请求无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因
分类:
100---599:分为五个大类
100:通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件
200:通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要索要其他关联文件
302:通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件
response.sendRedirect("资源文件地址")写入到响应头中location,而这个行为导致Tomcat将302状态码写入到状态行(这个包里没有文件,但是有某个文件的文件地址,根据这个地址去索要文件)
404:通知浏览器,由于在服务端没有定位到被访问的资源文件因此无法提供帮助
405:通知浏览器,在服务端已经和定位到被访问的资源文件(Servlet)但是这个Servlet对于浏览器采用的请求方式不能处理
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)这个Servlet可以接收浏览器采用请求方式,但是Servlet请求期间,由于Java异常导致处理失败
多个Servlet之间调用规则
前提条件:
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理,但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发送多次请求才能得到服务,这样增加了获得服务难度,导致用户放弃访问当前网站
提高用户使用感受规则:
无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起
多个Servlet之间调用规则:
1.重定向解决方案
2.请求转发解决方案
重向定向解决方案
工作原理
用户第一次通过【手动方式】通知浏览器访问OneServlet,OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行
在浏览器接收到响应包后,会读取302状态,此时浏览器自动根据响应头中的location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务
实现命令
response.sendRedirect("请求地址")
将地址写入到响应包中响应头中location属性
特征
1.请求地址:即可以把当前网站内部的资源文件地址发送给浏览器,也可以把其他网站资源文件地址发送给浏览器
2.请求次数:;浏览器至少发送两次请求,但是只有第一次请求是用户手动发送,后续请求都是浏览器自动发送的
3.请求方式:重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【Get】
4.缺点:
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间
请求转发解决方案
原理
用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwiServlet来完成剩余任务
实现命令:请求对象代替浏览器向Tomcat发送请求
//1.通过当前请求对象生成资源文件申请报告对象 RequestDispatcher report = request.getRequestDispatcher("/资源文件名");//一定要以/开头 //2.将报告对象发送给Tomcat report.forward(当前请求对象,当前响应对象)
优点
1.无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
2.Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数增加处理服务速度
特征
请求次数:在请求转发过程中,浏览器只发送一次请求
请求地址:只能向Tomcat服务器申请调用当前网站下载资源文件地址:request.getRequestDispathcer("/资源文件名")
请求方式:在请求转发过程中,浏览器只发送了一个Http请求协议包,参与本次请求的所有Servlet共享同一个请求协议包,因此,这些Servlet接收到请求方式与浏览器的请求方式保持一致
多个Servlet之间数据共享实现方案
数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用
Servlet规范中提供了四种数据共享方案
1.ServletContext接口
2.Cookie类
3.HttpSession接口
4.HttpServletRequest接口
ServletContext接口
1.来自于Servlet规范中一个接口,在Tomcat servlet-api.jar中,在Tomcat中负责提供这个接口实现类
2.如果两个Servlet来自于同一个网站,彼此之间通过网站的ServletContext实例对象实现数据共享
3.开发人员习惯于将ServletContext对象称为【全局作用域对象】
工作原理
每一个网站都存在一个全局作用域对象,这个全局作用域对象相当于一个Map,在这个网站中OneServlet可以将一个数据存入到全局作用域对象,当前网站中其他Servflet此时都可以从全局作用域对象得到这个数据进行相关使用
全局作用域对象生命周期
1.在Http服务器启动过程中,自动为当前网站在内存中创建一个全局作用域对象
2.在Http服务器运行期间,一个网站只有一个全局作用域对象
3在Http服务器运行期间,全局作用域对象一直处于存活
4.在Http服务准备关闭时,负责将当前网站中全局作用域对象进行销毁处理
全局作用域对象生命周期贯穿网站整个运行期间
实现命令:【同一个网站】OneServlet将数据共享给TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse reponse){
//1.通过请求对象向Tomcat索要当前网站中【全局作用域对象】
ServletContext application = request.getServletContext();
//2.将数据添加到全局作用域对象作为【共享数据】
application.setAttribute("key1",任意类型数据);
}
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServ;etResponse response){
//1.通过请求对象向Tomcat索要当前网站中【全局作用域对象】
ServletContext application = request.getServletContext();
//2.从全局作用域对象得到指定的关键字对应数据
Object 数据 = application.getAttribute("key1");
}
}
Cookie
1.Cookie来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
2.如果两个servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于Cookie对象进行数据共享
3.Cookie存放当前用户的私人数据,在共享数据过程中提高服务质量
原理
用户通过浏览器第一次向MyWeb网站发送请求申请OneServlet OneServlet在运行期间创建一个Cookie存储与当前用户相关数据 OneServlet工作完毕后,【将Cookie写入到响应头】交还给当前浏览器 浏览器收到响应包之后,将cookie存储在浏览器的缓存一段时间后, 用户通过同一个浏览器再次向myWeb网站发送请求TwoServlet时 浏览器需要无条件的将myweb网站之前推送过来的Cookie,写入到请求头中发送过去 此时TwoServlet在运行时,就可以通过读取请求头中cookie中的信息,得到OneServlet提供的共享数据
实现命令:同一个网站OneServlet与Twoservlet借助于cookie实现数据共享
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
//1.创建一个cookie对象,保存共享数据(当前用户数据)
Cookie card = new Cookie("key1","abc");
Cookie card1 = new Cookie("key2,"efg");
/*
cookie相当于一个map
一个cookie中只能存放一个键值对
这个键值对的key和value只能是String
键值对中的key不能是中文
*/
//2.将cookie写入到响应头,交给浏览器
resp.addCookie(card);
resp.addCookie1(card1);
}
}
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse resp){
// 1.调用请求对象从请求头中得到浏览器返回的Cookie
Cookie cookieArray[] = request.getCookies();
//2.循环遍历数据得到每一个cookie的key与value
for(Cookie card:cookieArray){
String key = card.getName();//读取key
String value = card.getValue();//读取value"abc"
//提供一个较好的服务
}
}
}
Cookie销毁时机
1.在默认情况下,Cookie对象存放在浏览器缓存中,因此只要浏览器关闭,Cookie对象就会被销毁
2.在手动设置情况下,可以要求浏览器将接收的Cookie存放在客户端计算机硬盘上,同时需要指定Cookie在硬盘上的存活时间,在存活时间范围内,关闭浏览器,关闭客户端计算机,关闭服务器都不会导致Cookie被销毁,在存活时间到达时,Cookie自动从硬盘上被删除
cookie.setMaxAge(60);//Cookie在硬盘上存活1分钟
HttpSession接口:
1.HttpSession来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
2.如果两个servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助于HttpSession对象进行数据共享
3.开发人员习惯于将HttpSession接口修饰对象称为【会话作用域对象】
Cookie与HttpSession区别
存储位置:
Cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存
数据类型:
Cookie对象存储共享数据类型只能是String
HttpSession对象可以存储任意类型的共享数据Object
数据数量:
一个Cookie对象只能存储一个共享数据
HttpSession使用Map结合存储共享数据,所以可以存储任意数量共享数据
参照物
Cookie相当于客户在服务端【会员卡】
HttpSession相当于客户在服务端【私人保险柜】
命令实现
同一个网站下OneServlet将数据传递给TwoServlet
OneServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
// 1.调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
HttpSession session = request.getSession();
// 2.将数据添加到用户私人储物柜
session.setAttribute("key1",共享数据);
}
}
// 浏览器访问/myWeb中TwoServlet
TwoServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response){
// 1..调用请求对象向Tomcat索要当前用户在服务端的私人储物柜
HttpSession session = request.getSession();
// 2.从会话作用域对象得到OneServlet提供的共享数据
Object 共享数据 = session.getAttribute("key1");
}
}
Http服务器通过Cookie将用户与HttpSeession关联起来
getSession()与getSession(false)
getSession()
如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回
如果当前用户在服务端尚未拥有自己的私人储物柜,要求tomcat为当前用户创建一个全新的私人储物柜
getSession(false)
如果当前用户在服务端已经拥有了自己的私人储物柜,要求tomcat将这个私人储物柜进行返回
如果当前用户在服务端尚未拥有自己的私人储物柜,此时Tomcat返回null
HttpSession销毁时机
1.用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中 2.在浏览器关闭时,意味着用户与他的HttpSession关系被切断 3.由于Tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会导致Tomcat将浏览器关联的HttpSession进行销毁 4.为了解决这个问题,Tomcat为每一个HttpSession对象设置【空闲时间】这个空闲时间默认30分钟,如果当前HttpSession 对象空闲时间达到30分钟,此时Tomcat认为用户已经放弃了自己的HttpSession,此时Tomcat就会销毁掉这个HttpSession
HttpSession空闲时间手动设置
在当前网站/web/WEB-INF/web.xml
<session-config>
<session-timeout>5</session-timeout><!--当前网站中每一个session最大空闲时间5分钟-->
</session-config>
HttpServletRequest接口实现数据共享
1.在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用,彼此之间共享同一个请求协议包。而一个请求协议包只对应一个请求对象,因此Servlet之间共享一个请求对象,此时可以利用这个请求对象在两个servlet之间实现数据共享
2.在请求对象实现servlet之间数据共享功能时,开发人员将请求对象称为【请求作用域对象】
命令实现:OneServlet通过请求转发申请调用TwoServlet时,需要给TwoServlet提供共享数据
OneServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
// 1.将数据添加到【请求作用域对象】中attribute属性
req.setAttribute("key1",数据);// 数据类型可以任意类型 Object
//2.向Tomcat申请调用TwoServlet
req.getRequestDispatcher("/two").forward(req,response);
}
}
TwoServlet{
public void doGet(HttpServletRequest req,HttpServletResponse response){
// 从当前请求对象得到OneServlet写入到共享数据
Object 数据 = req.getAttribute("key1");
}
}
Servlet规范扩展(监听器接口)
1.一组来自Servlet规范下接口,共有8个接口,在Tomcat存在servlet-api.jar包
2.监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
3.监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用于对象共享数据变化时刻】
作用域对象
1.在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据分享方案的对象,被称为作用域对象
Servlet规范下作用域对象
ServletContext:全局作用域对象
HttpSession:会话作用域对象
HttpServletRequest:请求作用域对象
监听器接口实现类开发规范
1.根据监听的实际情况,选择对应监听器接口进行实现
2.重写监听器接口声明【监听事件处理方法】
3.在web.xml文件将监听器接口实现类注册到Http服务器
ServletContextListenter接口
作用:通过这个接口合法的检测全局作用域对象被初始化时刻及被销毁时刻
事件监听处理方法
public void contextInitlized():在全局作用域对象被Http服务器初始化被调用
public void contextDestory():在全局作用域对象被Http服务器销毁的时候被调用
ServletContextAttributeListener接口
作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
监听事件处理方法
public void contextAdd():在全局作用域对象添加共享数据 public void contextReplaced():在全局作用域对象更新共享数据 public void contextRemopve():在全局作用域对象删除共享数据
全局作用域对象共享数据变化时刻
ServletContext application request.getServletContext();
application.setAttribute("key1",100); //新增共享数据
application.setAttribute("key1",200);//更新共享数据
application.removeAttribute("key1"); //删除共享数据
Filter接口(过滤器接口)
1.来自于Servelt规范下接口,在Tomcat中存在于servlet-api.jar包
2.Filter接口实现类由开发人员负责提供,Http服务器不负责提供
3.Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
作用
1.拦截Http服务器,帮助Http服务器检测当前请求合法性
2.拦截Http服务器,对当前请求进行增强操作
Filter接口实现类开发步骤
1.创建一个Java类实现Filter接口
2.重写Filter接口中doFilter方法
3.web.xml将过滤器接口实现类注册到Http服务器
Filter拦截地址格式
1.命令格式
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-patten>拦截地址</url-patten>
</filter-mapping>
命令作用:拦截地址通知Tomcat在调用何种资源文件之前需要调用OneFilter过滤器拦截
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>one.jpg</url-pattern>
要求Tomcat在调用某一个具体文件夹下所有资源文件之前,来调用OneFilter拦截
<url-pattern>/img/*</url-pattern>
要求Tomcat在调用某一个具体文件之前,来调用OneFilter拦截
<url-pattern>*.jpg</url-pattern>