bilibili动力节点servlet学习笔记
*Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序。
Tomcat就是一种Web服务器
servlet开发
一、Tomcat根据Servlet规范调用Servlet接口实现类规则
1.Tomcat有权创建Servlet接口实现类实例对象
Servlet myServlet=new MyServlet();
2.Tomcat根据实例对象调用service方法处理当前请求
myServlet.service();
二、Servlet规范介绍
1.servlet规范来自于JAVAEE规范的一种
2.作用:
a.指定动态资源文件的开发步骤
b.指定Http服务器调用[动态资源文件]规则
c.指定Http服务器管理[动态资源文件]实例对象规则
三、Servlet接口实现类
1.Servlet 接口来自于 Servlet 规范下一个接口,这个接口存在 Http 服务器(例:Tomcat)
2.Tomcat 服务器下 lib 文件右一个 serlet-api.jar 存放 Servlet 接口
3.Servlet 规范中,Http 服务器调用[动态资源文件]必须是一个 Servlet 接口实现类
*动态资源文件——一个实现了Servlet接口的java类,Tomcat才有权调用
四、Servlet接口实现类开发步骤
1.创建一个 java 类,让它继承 HttpServlet 父类,让它成为 Servlet 实现类
extends extends implements
MyServlet---------->(abstract)HttpServlet--------->(abstract)GenericServlet---------->(interface)servlet接口
抽象类:
a.降低接口实现类对接口实现过程难度
b.将接口中不需要使用抽象方法交给抽象类实现
c.这样接口实现类只需要对接口需要方法进行重写
2.重写 HttpServlet 类两个方法:doGet,doPost
get
浏览器----->MyServlet.doGet()
post
浏览器----->MyServlet.doPost()
通过父类决定在何种情况下调用子类------[设计模式]-------模板设计模式
HttpServlet: service(){
if(请求方式 == GET){
this.doGet;
}
if(请求方式 == POST){
this.doPost;
}
}
MyServlet: doGet,doPost
3.将 Servlet 接口实现类信息[注册]到Tomcat服务器中
[WEB-INF]----->web.xml
<!--将 Servlet 接口实现类类路径地址交给Tomcat-->
<servlet>
<servlet-name>myServlet</servlet-name><!--声明一个变量存储 servlet 接口实现类类路径-->
<servlet-class>com.servlet.myServlet</servlet-class><!--声明 servlet 接口实现类路径,包名.类名-->
</servlet>
则:Tomcat String myServlet="servlet_2.myServlet"
<!--为了降低用户访问 Servlet 接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/first</url-pattern><!--设置简短请求别名,别名在书写时必须以"/"开头-->
</servlet-mapping>
如果现在浏览器向 Tomcat 索要 myServlet 时地址:http://localhost:8080/servlet_2/first
注:在 servlet3.0 以后,我们可以不用再 web.xml 里面配置 servlet,
只需要加上 @WebServlet 注解就可以修改该 servlet 的属性了。
五、ServLet 对象生命周期
1.网站中所有 Servlet 接口实现类实例对象,只能由 Http 服务器负责创建,开发人员不能手动创建
2.在默认情况下, Http 服务器接收到对于当前 Servlet 接口实现类第一次请求时自动创建该接口的实例对象
3.在手动情况下,要求 Http 服务器在启动时自动创建某个 Servlet 接口实现类的实例对象:
<servlet>
<servlet-name>myServlet</servlet-name><!--声明一个变量存储srvlet接口实现类类路径-->
<servlet-class>com.servlet.myServlet</servlet-class>
<load-on-startup>30</load-on-startup><!--填写一个大于0的整数即可-->
</servlet>
作用:
a.为整个web应用创建必要的数据库表和数据
b.完成一些定时的任务[定时写日志,定时备份数据]
3.Http 服务器运行期间,一个 Servlet 接口实现类只能创建出一个实例对象
4.在 Http 服务器关闭时刻,自动将网站中所有的 Servlet 对象进行销毁.
*****Servlet实现类第一次被请求时创建,Http服务器关闭时销毁*******
六、HttpServletResponse 接口
1.介绍:
a.HttpServletResponse 接口来自于 Servlet 规范中,在 Tomcat 中存在 servlet-api.jar
b.HttpServletResponse 接口实现类由 Http 服务器负责提供
c.HttpServletResponse 口负责将 doGet/doPost 方法执行结果写入到[响应体]交给浏览器
d.开发人员习惯于将 HttpServletResponse 接口修饰的对象称为[响应对象]
2.功能:
a.设置响应头中[content-type]属性值,从而控制浏览器的使用
对应编译器将响应体二进制数据编译为[文字、图片、视频、命令]
b.将执行结果以二进制形式写入到[响应体]
c.设置响应头中[location]属性,将一个请求地址赋值给[location],从而控制浏览器发送请求
3.使用:
String result="Hello World";
response.content-type("text/html;charset=utf-8");//设置context-type属性值
PrintWriter out=response.getWriter();//通过响应对象,向Tomcat索要输出流
out.print(a);//通过输出流,将执行结果以二进制形式写入到响应体
String result2="http://www.baidu.com";
response.sendRedirect(result2);//重定向
七、HttpServletRequest 接口
1.介绍:
a.HttpServletResponse 接口来自于 Servlet 规范中,在 Tomcat 中存在 servlet-api.jar
b.HttpServletResponse 接口实现类由 Http 服务器负责提供
c.HttpServletResponse 接口负责在 doGet/doPost 方法运行时读取 Http 请求协议包中信息
d.开发人员习惯于将 HttpServletRequest 接口修饰的对象称为[请求对象]
2.功能:
a.可以读取 Http 请求协议包中[请求行]信息
b.可以读取保存 Http 请求协议包中[请求头]或[请求体]中请求参数信息
c.可以代替浏览器向 Http 服务器中请求资源文件调用
3.使用:
a.通过请求对象获得[请求头]中[所有请求参数名]
Enumeration paramNames=request.getParameterNames();//将所有请求参数名称保存到一个枚举对象进行返回
while(paramNames.hasMoreElements()){
String paramName=(String)paramNames.nextElement();
System.out.println("请求参数名"+paramName);
}
b.读取[请求头]中请求对象指定参数的值
String value=request.getParameter("请求参数名");
c.读取[请求体]中请求对象指定参数的值
request.setCharacterEncoding("utf-8");
String value=request.getParameter("请求参数名");
原因:浏览器以[GET]方式发送请求,请求参数保存在[请求头],在Http请求协议包到达Http服务器后,
请求头二进制内容由Tomcat负责解码,Tomcat9.0默认使用utf-8字符集
浏览器以[POST]方式发送请求,请求参数保存在[请求体],在Http请求协议包到达Http服务器后,
请求头二进制内容由当前请求对象(request)负责解码,request默认使用[iso-8859-1]字符集
欢迎资源文件
1.前提:
用户可以记住网站名,但是不会记住网站资源文件名
2.默认欢迎资源文件:
用户发送了一个针对某个网站的[默认请求]时,
此时由 Http 服务器自动从当前网站返回资源文件
3.Tomcat 对于默认文件欢迎资源文件定位规则
a.规则位置:
Tomcat 安装位置/conf/web.xml
b.规则命令:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
4.设置当前网站的默认欢迎资源文件规则
a.规则位置:
WEB-INF/web.xml
b.规则命令:
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
c.网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
多个servlet之间调用
1.前提条件
某些来自浏览器的请求往往需要服务器端中多个 servlet 协同处理,但是浏览器一次只能访问一个 servlet,
导致用户需要手动多次通过浏览器发起多次请求才能得到服务,增加用户获得服务的难度。
2.解决方案:
a.重定向
将要调用的 servlet 实现类地址写入到响应头 location 属性中
response.sendRedirect("请求地址");
请求方式:GET
缺点:需要在浏览器与服务器之间进行多次往返从而消耗大量时间
b.请求转发
通过当前的请求对象代替浏览器向 Http 服务器发送请求,申请调用另一个 Servlet 实现类
实现命令:
1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report=request.getRequestDispatcher("/资源文件名");
2.将报告对象发送给 Tomcat
report.forward(request,response);
即:request.getRequestDispatcher("/资源文件名").forward(request,response);
请求方式:post/get
缺点:只能向 Http 服务器申请调用当前网络下资源文件
servlet数据共享
十、多个Servlet之间数据共享实现方案
1.数据共享:OneServlet 工作完毕后,将数据交给 TwoServlet 来使用
2.Servlet 规范中提供四种数据共享 方案
1.ServletContext接口
2.Cookie类
3.HttpSession接口
4.HttpServletRequest接口
十一、ServletContext接口
1.介绍:
a.来自于 Servlet 规范中一个接口,在 Tomcat 中存在于 servlet-api.jar,由 Tomcat 负责提供该接口实现类
****b.如果两个 Servlet 来自于同一个网站,彼此之间通过网站的 ServletContext 实例对象实现数据共享
c.开发人员习惯于将 ServletContext 对象称为「全局作用对象」
2.工作原理:
全局作用域对象相当于一个 Map,每个 Servlet 实现类都可以对其进行访问修改
3.生命周期:
a.在Http服务器启动时创建,关闭时销毁。
b.一个网站只有一个全局作用域对象
4.命令实现:
a.通过[请求对象]向 Tomcat 索要当前网站中[全局作用对象]
ServletContext application = request.getServletContext();
b.将数据添加到全局作用域对象作为[共享数据]
application.setAttribute("key1",data);
c.从全局作用域对象得到指定关键字对应数据
Object data = application.getAttribute("key1");
十二、Cookie类
1.介绍
1).Cookie 来自于Servlet规范中一个工具类,存在于Tomcat提供servlet-api.jar中
****2).如果两个用户来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助Cookie对象进行数据共享
3).Cookie存放当前用户的私人数据,再共享数据过程中提高服务质量
4).现实生活场景中,Cookie就相当于用户在服务端得到的[会员卡]
2.原理:
用户通过浏览器第一次访问网站时,servlet在运行期间会创建一个Cookie类存储与当前用户相关信息,
之后通过[将Cookie写入到响应头]交还给浏览器
过一段时间后,用户再通过[同一浏览器]访问[同一网站]时,浏览器需要无条件的将网站之前推送过来
的Cookie发送过去,实现网站下不同[servlet]数据共享
3.生命周期:
1).默认情况,因Cookie存在于浏览器缓存,当浏览器关闭,Cookie对象被销毁
2).手动设置,可以要求浏览器将接收到的Cookie存到计算机硬盘,同时需要指定存活时间
cookie.setMaxAge(60); //秒 这里的cookie为具体的Cookie实例对象
4.实现命令:
注意:
Cookie相当于一个map
一个Cookie中只能存放一个键值对
键值对的key与value只能是String
键值对中key不能是中文
1).创建一个Cookie对象,保存共享数据
Cookie card=new Cookie("key","abc");
2).将Cookie写入到响应头,交给浏览器
response.addCookie(card);
3).调用请求对象从请求头中的到浏览器返回的Cookie
Cookie[] cookieArray = request.getCookies();
十三、HttpSession接口
1.介绍
1).HttpSeesion接口来自于Servlet规范下一个接口,存在于Tomcat中servlet-api.jar
其实现类由Http服务器实现类提供
2).如果两个Servlet来自于同一个网站,并且为同一个浏览器/用户提供服务,此时借助HttpSession对象进行数据共享
3).开发人员习惯于将HttpSession接口修饰对象称为[会话作用域]
2.HttpSession与Cookie区别
1).存储位置:
Cookie 存放在客户端[浏览器缓存/硬盘]
HttpSession 存放在服务器
2).数据类型:
Cookie对象存储共享数据类型只能是Strig
HttpSession对象可以存放任意类型共享数据Object
3).数据数量:
一个Cookie对象只能存放一个共享数据[键值对]
HttpSession使用map集合存放共享数据,存任意数量
4).参照物:
Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器
上的“客户明细表”来确认客户身份。
Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
所以就安全性,Cookie不如Session安全
3.Session与Cookie联系
Session通过SessionID来识别每一个用户
实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,
服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,
以后每次请求把这个会话ID发送到服务器,我就知道你是谁了
如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,
会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,
URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户
4.命令实现:
1).通过[请求对象]向Tomcat索要[Session对象]
HttpSession session = request.getSession();
2).将数据添加到Session对象
session.setAttribute("key1",data);
3).从Session对象得到指定关键字对应数据
Object data = session.getAttribute("key1");
5.getSession() 与 getSession(false) 区别:前者会在服务器没有当前用户Session对象时新建一个
而后者则返回null
6.销毁
1).session调用了 session.invalidate()方法。
2).前后两次请求超出了session指定的生命周期时间。
十四、HttpServletRequest接口
1.介绍:
1).在同一网站中,两个servlet通过[请求转发]进行调用,彼此之间共享一个请求协议包,
此时可以利用这个请求对象实现数据共享
2).在请求对象实现servlet之间数据共享时,开发人员将请求对象称为[请求作用域对象]
2.命令实现:
1).将数据添加到[请求作用域对象]中Attribute属性
request.setAttribute("key1",数据);// 数据可以是任意类型
2).从request取用共享数据
Object data = request.setAttribute("key1");
Servlet规范拓展
十五、监听器接口
1.介绍:
1).一组来自于Servlet规范下接口,共有8个接口,在Tomcat的servlet-api.jar中
2).监听器接口需要由开发人员亲自实现,Http服务器并不提供其实现类
3).监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享数据变化时刻】
2.作用域对象:
1).为两个Servlet之间提供数据共享的对象
2).Servlet规范下作用域对象:
ServletContext:全局作用域对象
HttpSession:会话作用域对象
HttpServletRequest:请求作用域对象
3.监听器接口实现类开发规范:三步
1).根据监听器的实际情况,选择对应监听器接口进行实现
2).重写监听器接口声明[监听处理方法]
3).在web.xml文件将监听器接口实现类注册到Http服务器
<listener>
<listener-class>类路径</listener-class> // 包.类
</listener>
4.ServletContextListener接口
1).作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
2).监听事件处理方法:
public void contextInitlized(); 在全局作用域对象被Http服务器初始化时调用
public void contextDestroy(); 在全局作用域对象被Http服务器销毁时调用
5.ServletContextAttributeListener接口
1).作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
2).监听事件处理方法:
public void contextAdd(); 在全局作用域对象添加共享数据
public void contextReplaced(); 在全局作用域对象更新共享数据
public void contextRemove(); 在全局作用域对象删除共享数据
6.监听器接口的应用——提高程序运行速度
1).问题:每次访问数据库(JDBC)做操作时,都要建立连接,释放连接,但是这相当的耗费时间
2).解决:可以事先在Http服务器(Tomcat)启动时,创建一定数量连接,当服务器关闭时,再销毁。
自然而然的就会想到ServletContext全局作用域对象,它的生命周期随Tomcat启动而创建,随
Tomcat关闭而销毁,我们可以将事先创建的连接放入Map集合,再存入Servlet全局作用域对象,
而这就需要用到监听器,ServletContextListener接口。
十六、过滤器
1.介绍
1).来自于Servlet规范下的接口,在Tomcat的servlet-api包中
2).Filter接口实现类由开发人员负责提供,Http服务器不负责提供
3).Filter接口在Http服务器调用资源之前,对Http服务器进行拦截
2.具体作用
1).拦截Http服务器,帮助Http服务器检测当前请求合法性
2).拦截Http服务器,对当前请求进行增强操作
3.Filter接口实现类开发步骤
1).创建一个Java类实现Filter接口
2).重写Filter接口中的doFilter接口
public void doFilter(ServletRequest servletRequest,ServletResponse servletresponse,FilterChain filterChain){}
通过servletRequest获取请求对象参数,
通过servletResponse通知Tomcat直接返回相应的消息而不调用网站资源
通过filterChain(servletRequest,servletResponse)放行,
3).在web.xml中将过滤器接口实现类注册到Http服务器
<filter>
<filter-name>oneFilter</filter-name>
<filter-class>类路径</filter-class>
<filter>
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-pattern>/mm.jpg</url-pattern>
</filter-mapping>
当拦截不是某个具体文件,而是文件夹时:
<filter-mapping>
<filter-name>oneFilter</filter-name>
<url-pattern>/mm/*</url-pattern>
</filter-mapping>
4.过滤器应用——解决用户恶意登录
当用户绕过登录界面直接访问站内相关资源,造成恶意登录
解决1:给用户授予令牌——Session,
每当用户通过正常登录进来后,给用户发放一个Session对象,而当用户调用站内相关文件时,
正常登录的用户在服务器端会有相应Session,而恶意登录的则没有
缺点:1.代码重复高,每个资源都要先检查用户是否有相应Session对象
2.动态资源文件并不能做这样的检测
解决2.通过过滤器Filter,拦截每个请求对象,检查其是否有令牌(Session)
但是注意,包含登录相关的资源文件要选择放行?!
否则会导致网站封闭!?