javaweb/day07|day08
Filter过滤器
生命周期:
服务器启动创建
服务器关闭销毁
使用步骤
- 自定义类, 实现Filter接口
- 重点实现doFilter方法
- 注册Filter @WebFilter web.xml-配置]
- doFilter中, 直接响应, 要么放行 chain.doFilter
- 测试: 发送的是Servlet请求
@WebFilter("/MyServlet01")//url-pattern代表要过滤的请求资源路径
public class MyFilterA implements Filter {
public void destroy() {
System.out.println("FilterA destroy");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("MyFilterA before");
chain.doFilter(req, resp);
System.out.println("MyFilterA after");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("FilterA init");
}
}
要点
FilterChain
FilterChain: 过滤器链, 由filter-mapping将过滤器连接串起来的
doFilter() -> 执行下一个过滤器, 本质是递归
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
多个过滤器顺序
按照web.xml文件中的<filter-mapping>标签顺序
例DAC Demo01Servlet进来了 CAD
FilterConfig获得初始化参数
<filter>
<filter-name>MyFilterC</filter-name>
<filter-class>a_filter.MyFilterC</filter-class>
<init-param>//初始化参数值
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilterC</filter-name>
<url-pattern>/Demo01Servlet</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
服务器一启动就会执行
public class MyFilterC implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获得Filter的初始化参数
String driver = filterConfig.getInitParameter("driver");
System.out.println(driver);
}
servlet中初始化参数
@WebServlet(value = "/Demo01Servlet",
initParams =
@WebInitParam(name="location", value="db.properties"))
public class Demo01Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String location = getServletConfig().getInitParameter("location");
System.out.println(location);
System.out.println("Demo01Servlet进来了");
MyFilterA before
db.properties
Demo01Servlet进来了
MyFilterA after
功能-作用
案例——自动登录实现
day07/com.zzxx. autoLogin
案例——装饰者模式——解决乱码
Listener
监听某个对象的的状态变化的组件。
监听三大域对象:
使用
- 自定义类实现Listener接口
- 着重实现方法
- 注册
重点:ServletContextListener
能监测到服务器的开启和关闭
@WebListener//注册
public class MyServletContextListener implements ServletContextListener {
// 在ServletContext对象创建时调用
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("application 创建了");
}
// 检测到ServletContext对象的销毁,并且调用该方法
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("application 销毁了");
}
}
作用
- 初始化的工作:初始化对象、初始化数据 ---- 加载数据库驱动、连接池的初始化
- 加载一些初始化的配置文件 — spring的配置文件
- 任务调度----定时器----Timer/TimerTask
对象感知监听器
1.将对象存储在session中和将对象从session中移除
2.session对象的钝化, 活化
在服务器关闭时, session没有消失, 持久化在磁盘上
tomcat/work/Catalina/localhost/…/web08/SESSIONS.ser
将session数据持久化到磁盘上 -> session钝化
将磁盘上的session文件恢复到内存中 -> session活化
String name -> 可以保存在磁盘上
User user -> 不能保存在磁盘上, 不能序列化,
需要实现Serializable接口
设置session钝化时间:
<Context docBase="/Users/bonnie/IdeaWorks/javaweb/out/artifacts/web08_war_exploded">
<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->
<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下,配置钝化的对象文件在
work/catalina/localhost/钝化文件 -->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="bonnie" />
</Manager>
</Context>