Servlet
一、介绍
- javaEE规范的一种
- 作用
- 指定开发动态文件的步骤
- 指定HTTP服务器调用动态文件规则
- 管理动态文件对象规则
二、Servlet接口实现类
- Servlet接口是雷子Servlet规范下的一个接口,接口存在于HTTP服务器
- Tomcat服务器下lib文件内有servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
- HTTP服务器调用动态文件,必须是Servlet接口实现类
2.1 开发步骤
-
创建java类实现HttpServlet接口
-
重写父类HttpServlet的两个方法 doGet/doPost方法 重写CTRL+o
-
将实现类信息注册到Tomcat服务器中
web/WEB-INF/web.xml
<!-- 将实现类路径交给Tomcat-->
<servlet>
<!-- 声明变量存储实现类的路径-->
<servlet-name>my</servlet-name>
<!-- 实现类的路径-->
<servlet-class>My</servlet-class>
</servlet>
<!-- 降低用户访问实现类的难度,取别名-->
<servlet-mapping>
<servlet-name>my</servlet-name>
<!-- 设置别名 /开头-->
<url-pattern>/my</url-pattern>
</servlet-mapping>
三、Servlet对象生命周期
-
实现类对象只能HTTP服务器自动创建
-
默认情况 收到请求第一次请求自动创建
- 可以手动配置 启动服务器时自动创建对象
<servlet> <!-- 声明变量存储实现类的路径--> <servlet-name>my</servlet-name> <!-- 实现类的路径--> <servlet-class>My</servlet-class> <!-- 大于0的整数 让对象在服务器启动时就创建--> <load-on-startup>1</load-on-startup> </servlet>
-
服务器运行时,一个实现类只能被创建一个对象
-
服务器关闭时,所有对象会被销毁
四、HttpServletResponse接口
- 来自Servlet规范中 Tomcat中servlet-aqi.jar
- 实现类由HTTP服务器提供【响应对象】
- 负责将doGet/doPost方法执行结果 写入响应体 交给浏览器
4.1 主要功能
-
执行结果以二进制 写入响应体中
-
设置响应头中的【content-type】属性值
控制浏览器使用对应的编译器
-
设置响应头【location】属性值 将地址赋值
从而控制浏览器向指定的服务器发送请求
4.2 使用
以二进制 写入响应体中
//设置响应头中的【content-type】 [charset]修改编码集
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(xxx);
//设置响应头location
resp.sendRedirect("Http://www.baidu.com");
五、HttpServletRequest接口
- 来自Servlet规范中 Tomcat中servlet-aqi.jar
- 实现类由HTTP服务器提供【请求对象】
- 负责在doGet/doPost运行中获取Http请求协议包中的信息
5.1 主要功能
- 读取请求行的信息
- 读取保存【请求头】【请求体】中的信息
- 可以代替浏览器向服务器申请资源文件调用
5.2 使用
读取请求包中的信息
请求头和请求体的方法是一样的
请求头保存 Get参数 Tomcat默认解码UTF-8
请求体保存 Post参数 Tomcat默认解码ISO-8859-1 如果是中文 就乱码
//读取请求行中url信息
String url = req.getRequestURL().toString();
//读取请求行中method信息
String method = req.getMethod();
//资源文件精准定位
String uri = req.getRequestURI();
//修改Tomcat解码字符集
req.setCharacterEncoding("gbk");
//读取请求头中的请求参数名
Enumeration<String> parames = req.getParameterNames();
while (parames.hasMoreElements()){
String parame = parames.nextElement();
//读取请求参数值
String parameter =req.getParameter(parame);
System.out.println(parame+":"+parameter);
}
5.3 响应与请求对象生命周期
-
当HTTP服务器接收浏览器发送的请求协议包之后
自动为协议包生成请求对象和响应对象
-
HTTP服务器调用doGet/doPost方法时
将两个对象作为实参传递到方法,确保方法的执行
-
HTTP准备推送响应协议包之前
负责将两个对象销毁
-
请求对象和响应对象贯穿一次请求的处理过程
六、项目
6.1 前期准备
6.2 用户注册流程图
七、默认网站定位
http://localhost:8080/myweb/
//Tomcat默认定位规则 安装位置下conf/web.xml打开拉到底
//依次 如果没有就404
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
7.1自定义默认网站定位
//在web.xml配置文件下
<welcome-file-list>
<welcome-file>xxx.html</welcome-file>
</welcome-file-list>
八、HTTP状态码
8.1 介绍
-
由三位数组成
-
Http服务器在推送响应包前,根据本次请求情况
将Http状态码写入响应包状态行
-
返回了对应文件,通过http状态码通知浏览器如何处理
不能返回,就勇敢http状态码向浏览器解释原因
8.2 分类
-
组成 100-599 分5大类
-
1xx:最具有特征100:不是独立的资源文件
浏览器会继续请求资源文件
-
2xx:
200:通知浏览器本次返回文件是独立完整的文件
-
3xx:
302:c此次返回不是文件 是一个资源文件地址
浏览器自动根据地址去索要文件
-
4xx:
404: 没有找到对应资源文件
405:找到servlet文件 没找到对应请求方式
-
5xx:
500:找到servlet文件 找到对应请求方式 java 处理异常
九、多个servlet之间
9.1 调用规则
-
前提条件:需要服务器中多个servlet协同处理
但是浏览器一次只能访问一个,需要用户手动发起多次请求
-
提高用户使用感受
多个servlet 用户只需要手动请求一次
9.2 重定向解决方案
-
工作原理:用户手动请求一次,浏览器访问OneServlet工作完毕,将Two地址写入响应头 location属性,服务器将302状态码写入状态行、
-
实现命令:
//写入响应头 location属性 //请求地址:/网站名/资源文件 或者 整个地址 resp.sendRedirect("请求地址");
-
请求次数
浏览器至少发起两次 用户手动第一次
后续都浏览器自动发送的
-
请求方式:
重定向解决方案 通过地址栏发起下一次请求 GET
-
缺点:
浏览器与服务器之间进行多次往返,增加用户等待服务时间
9.3 请求转发解决方案
-
工作原理:用户手动请求一次,浏览器访问OneServlet工作完毕,
通过当前请求对象代替浏览器向服务器发送请求
调用Two,然后服务器自动调用完成任务
-
实现命令:
// 通过请求对象生成资源文件申请报告对象
RequestDispatcher report = req.getRequestDispatcher("/资源文件");
//将报告对象发送给服务器(当前请求对象,当前响应对象)
report.forward(req,resp);
//简化版
req.getRequestDispatcher("/资源文件").report.forward(req,resp);
- 请求次数:1次
- 请求地址:只能向服务器申请当前网站下的资源文件地址【不要写网站】
- 请求方式:根据第一次请求中method属性决定
十、多个servlet的数据共享方案
- 数据共享:OneServlet执行结束将产生的数据给Two
- Servlet规范中提供了四种数据共享方案
- ServletContext接口
- Cookie类
- HttpSession接口
- HttpServletRequest接口
10.1 ServletContext接口
-
介绍
1)来自Servlet接口规范中的一个接口
在Tomcat servlet-api.jar中
2)如果两个Servlet来自同一个网站下
可以通过这个接口实现数据共享
3)称为【全局作用域对象】
-
工作原理:每个网站都存在一个全局作用域对象相当于Map 留言板[外链图片转存失败,源站可能有
-
全局作用域对象生命周期:
1)服务器启动中,自动为当前网站创建全局作用域对象
2)服务器运行中,一个网站只有一个全局作用域对象
3)服务器运行,会一直存活
4)服务器关闭,会负责销毁
-
命令实现:
//请求方法中 用请求对象获得全局作用域对象ServletContext application = rep.getServletContext();//将数据添加到全局作用域 作为共享数据application.setAttribute("key",数据)://在另一个Servlet中获取共享数据ServletContext application = req.getServletContext();Object xxx = application.getAttribute("key");
10.2 Cookie类
-
介绍
1)来自Servlet接口规范中的一个工具类
在Tomcat servlet-api.jar 中
2)如果两个Servlet来自同一个网站下 并且是同一个浏览器/用户提供服务
可以借助这个Cookie对象实现数据共享
3)Cookie存放用户的私人数据,提高服务质量
4)现实类似用户在服务端得到【会员卡】
-
工作原理:第一次访问网站的OneServlet在运行中
会创建一个Cookie存放与当前用户相关的数据 one工作完毕
会写入响应头 交还给当前浏览器
浏览器会将Cookie缓存 后面用户通过【同一个浏览器】向服务器 Two发送请求
会将Cookie写入请求头发送过去 Two就可以读取请求头中Cookie中信息
获得One提供的共享数据
-
实现命令:
//One 创建Cookie对象 也是相当Map 但是只能存放一个键值对 key(不中文)/value只能StringCookie card_1 = new Cookie("key","value");Cookie card_2 = new Cookie("key","value");//将Cookie写入响应头中 可以多个Cookieresp.addCookie(card_1);resp.addCookie(card_2);//Two 调用请求头得到浏览器的Cookie集合Cookie[] cookies = req.getCookies();//遍历集合for(Cookie card:cookies){ String key = card.getName(); String value = card.getValue();}
-
会员卡Cookie项目
-
生命周期
1)销毁时机
Cookie对象放在浏览器缓存
浏览器关闭 对象就被销毁
2)手动设置情况下
可以将浏览器将对象放在客户端硬盘上
同时指定存活时间 时间到自动删除
//在硬盘存活时间 关闭浏览器 服务器 都不会被销毁只有时间到cookie.setMaxAge(60); //时间是秒
10.3 HttpSession接口
-
介绍
1)来自Servlet接口规范中的一个接口
实现类也在 在Tomcat servlet-api.jar中
2)如果两个Servlet来自同一个网站下 并且是同一个浏览器/用户提供服务
3)会话作用域对象
-
HttpSession与Cookie区别
1)存储位置
服务端计算机内存 / 客户端计算机(浏览器内存/硬盘)
2)数据类型
任意数据类型Object / 只能是String
3)数据数量
map数组任意个 / 只能一个
4)参照物
服务端的私人保险柜 / 服务器的会员卡
-
命令实现
//One调用请求对象 获取HttpSission对象HttpSission session = req.getSession();//将数据添加session.setAttribute("key",数据);//TwoHttpSesion session = req.getSession();Object 数据 = session.getAttribute("key");
-
服务器如何把用户和HttpSession关联起来
会返回一个 Cookie的手牌 缓存在浏览器中
下次请求 就携带手牌
-
getSession()与getSssion(false)
(): 如果用户有储物柜 返回
没有就创建一个新的 返回
(false):如果有 返回
没有就返回null
-
销毁时机
1)用户和HttpSession关联的Cookie只能缓存在浏览器中
2)浏览器关闭 关联被切断
3)由于服务器不能检查浏览器何时关闭 并不会销毁HttpSession
4)解决此问题 服务器会为每个HttpSession设置一个空闲时间默认30分钟 时间到 删除
-
HttpSession空闲时间手动设置
<!--在当前网站/web/WEB-INF/web.xml--> <!-- 分钟 --> <session-config> <session-timeout>5</session-timeout> </session-config>
10.4 HttpServletRequest接口
-
介绍
1)同一个网站下 两个Servlet通过请求转发 会共享同一个请求协议包
一个请求协议包对应一个请求对象 所以可以通过请求对象完成数据共享
2)请求作用域对象
-
命令实现
//将数据添加进请求作用域对象req.setAttribute("key",数据);//数据类型 Objeit//向服务器申请调用第二个Servletreq.getRequestDispatcher("/资源文件").report.forward(req,resp);//Two获取数据Object 数据 = req.getAttribute("key");
十一、监听器
11.1 介绍
1. 来自Servlet规范中的一个接口
共有8个接口 在Tomcat servlet-api.jar中
2. 监听器接口需要自己写 服务器没有提供对应的实现类
3. 监控【作用域对象生命周期变化时刻】与【作用域对象共享数据变化时刻】
11.2 作用域对象
-
Servlet规范中,认为在服务器内存中 某些条件为Servlet之间提供共享服务的对象 称作用域对象
-
Servlet规范下作用域对象:
ServletContext:全局作用域对象
HttpSession:会话作用域对象
HttpServletRequest:请求作用域对象
-
监听器接口实现类开发规范:三步
1)根据监听的实际情况,选择对应的监听器接口进行实现
2)重写监听时间处理方法
3)在web.xml 文件将监听器接口实现类注册到服务器
<!--注册--><listener> <listener-class>实现类</listener-class></listener>
11.3 ServletContextListener接口
-
作用:监听全局作用域对象被初始化和销毁时刻
-
监听时间处理方法:
//全局作用域对象初始化时刻contextInitlized();//销毁时刻contextDestory();
11.4 ServletContextAttributeListener接口
1)作用:监听全局作用域对象被初始化和销毁时刻
//在全局作用域对象添加共享数据contextAdd()://在全局作用域对象更新共享数据contextReplaced();//在全局作用域对象删除共享数据contextRemove();
十二、Filter接口(过滤器)
12.1. 介绍
1. 来自Servlet规范中的一个接口
在Tomcat servlet-api.jar中
- 由开发人员负责 服务器不负责
- 在服务器调用资源文件之前 对服务器进行拦截
12.2 具体作用
-
拦截服务器,帮助服务器检测请求合法性
-
拦截服务器,对当前请求进行增强操作
-
开发步骤:三步
1)创建Fileter接口实现类
2)重写doFiletter方法
//在上面可以对请求头功增强能 filterChain.doFilter(请求对象,响应对象); //放行
3)在web.xml文件实现类注册服务器
<!--将过滤器类文件路径交给服务器--><filter> <filter-name>变量名</filter-name> <filter-class>类路径</filter-class></filter><!--通知服务器调用何种资源文件需要被当前过滤器拦截--><filter-mapping> <filter-name>变量名</filter-name> <url-pattern>/文件</url-pattern></filter-mapping>//对所有文件过滤拦截文件格式 //所有文件 /*//某个文件 /xxx.xxx//某文件下所有文件 /xxx/*//某类型文件 /*.xxx<filter-mapping> <filter-name>变量名</filter-name> <url-pattern>xxxx</url-pattern></filter-mapping>
12.3 过滤器防止恶意登录
//合法用户 创建一个会话作用域对象HttpSission session = req.getSession();//在Servlet实现类中 判断if(getSssion(false) == null){}
缺点:1.增加开发难度 2.不能对静态文件进行保护
流程图: