Servlet 学习笔记(三)
学习内容来自 B站千峰Java视频
Servlet 生命周期
生命周期四个阶段:
-
实例化
-
初始化
-
服务
-
销毁
整个流程
Servlet 特性
线程安全问题
如何保证线程安全
也不建议使用 synchronized,高并发场景下性能损失太大
所以最好使用局部变量
状态管理
现有问题
概念
状态管理是指将浏览器与 web 服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来
状态管理分类
Cookie
概念
创建 Cookie
获取 Cookie
修改 Cookie
只要保证新添加的 Cookie 与已有 Cookie 的名和路径一致即可修改 Cookie
注意:如果修改 Cookie 的名或者路径会新建一个 Cookie,而改变 Cookie 值会覆盖原有的 Cookie
Cookie 编码与解码
创建带中文的 Cookie:
如果不指定编码格式直接使用中文则会报错
读取带中文 Cookie
Cookie 优点和缺点
优点:
缺点:
Session
概念
原理
Session 是服务器创建的
在同一会话(一般是浏览器关闭之前的连续多次请求)中,共用一个 Session
Session 使用
获取 Session
Session 保存数据
Session 获取数据
Session 移除数据
Session 与 Request 区别
Session 的生命周期
ServletContext 对象
概述
获取 ServletContext 对象
ServletContext 作用
-
获取项目真实路径
-
获取项目上下文路径
-
全局容器
ServletContext 特点
应用场景
比如统计当前项目访问次数
作用域总结
过滤器
现有问题
概念
过滤器作用
编写过滤器
编写 Filter 类
@WebFilter(value = "/t") // 拦截路径
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("--MyFilter--");
// 让请求继续
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("--end--");
}
@Override
public void destroy() {
}
}
编写 Servlet 类
@WebFilter(value = "/t")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("--MyFilter--");
// 让请求继续
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("--end--");
}
@Override
public void destroy() {
}
}
过滤器配置
注解配置
在上面的例子中就使用了注解配置
xml 配置
在 web.xml 中进行配置
拦截路径
过滤器链和优先级
过滤器链
过滤器优先级
最简洁的就是只配置注解方式的过滤器
典型应用
-
解决中文乱码问题,使用过滤器拦截所有需要显示或者输入中文内容的请求
-
权限验证,使用过滤器拦截所有需要验证权限的请求