代理设计模式
当某个事件发生某一个事件时,通知另一个对象,让另一个对象做某事
监听器
定义
监听某个对象的状态变化的组件
- 事件源
- request
- session
- servletContext
- 监听器 监听事件的对象
- 注册监听器 与事件源绑定
- 响应处理
监听器划分
三个监听域对象的创建与销毁
- ServletContextListener
- HttpSessionListener
- ServletRequestListener
三个监听域对象当中属性变化
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
域监听器
ServletContext域监听器
ServletContext域的生命周期,服务器启动时创建服务器关闭时销毁。
步骤
- 实现接口
- 覆盖监听器的方法
- web.xml进行配置
// Java
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
public class Listener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce){
System.out.println("创建了");
}
public void contextDestroyed(ServletContextEvent sce){
System.out.println("销毁了");
}
}
//xml
<listener>
<listener-class>tashi.Listener</listener-class>
</listener>
HttpSession域的创建与销毁的监听器
HttpSession域的生命周期,第一次调用request.getSession()调用,服务器关闭session或手动销毁关闭。
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionLisener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session销毁");
}
}
//xml
<listener>
<listener-class>tashi.SessionLisener</listener-class>
</listener>
ServletRequestListener
同理,监听请求对象的创建域销毁
对象存储监听
- ServletContextAttributeListener
- HttpSessionAttributeListener
- ServletRequestAttributeListener
ServletContextAttributeListener
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class AttributeListenerTest implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
//添加
System.out.println("添加\t");
System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
//删除
System.out.println("删除\t");
System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
//更新
System.out.println("更新\t");
System.out.println(scae.getName()+"\t"+scae.getValue()+"\t"+scae.getSource());
}
}
//Servlet
@WebServlet("/index")
public class Download extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.getServletContext().setAttribute("Pets", "MIaoMiao");
}
}
过滤器
是什么
filter时客户端对访问资源的过滤,对目标资源访问前后进行逻辑处理。它负责拦截请求与响应,便于查看客户机与服务器之间交换的数据
步骤
- 编写一个过滤器类实现Filter接口
- 实现接口中尚未实现的方法
- web.xml进行配置
//过滤器
import javax.servlet.*;
import java.io.IOException;
public class T1 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("来到了过滤器");
filterChain.doFilter(servletRequest,servletResponse);//放行
}
@Override
public void destroy() {
}
}
//web.xml
<filter>
<filter-name>T1</filter-name>
<filter-class>tashi.filter.T1</filter-class>
</filter>
<filter-mapping>
<filter-name>T1</filter-name>
<url-pattern>/Download</url-pattern>
</filter-mapping>
解析
当我们发送一个请求的时候,web容器会先到filter当中 创建三个参数,req,resp,filterChain。在过滤器当中放行之后才可以访问对应的servlet类
中间的过滤器可以有多个,在一个过滤器当中可以调用另外一个过滤器。
在配置xml时,首先定义过滤器的名称和Java类名,然后用 url-pattern
映射工作空间的目录
filter的生命周期
init方法
当filter对象创建时调用。服务器启动时创建。
- 参数 filterConfig
dofilter方法
用于处理请求和响应,当请求与过滤器相关联web资源时 进行调用
destroy方法
filter对象销毁时调用。服务器关闭会销毁
应用实例
需要对某些IP进行访问限制,不让非法的IP访问系统,需要用到过滤器限制