Listener监听器与Filter过滤器

Listener监听器

Javaweb开发中的监听器,是用于监听web常见对象
HttpServletRequest HttpSession ServletContext
监听它们的创建与销毁 属性变化 session绑定javaBean

监听机制(监听什么东西)
事件 就是一个事情
事件源 产生这个事情的源头
监听器 用于监听指定的事件的对象 
注册监听 要想让监听器可以监听到事件产生,必须对其进行注册。
Javaweb开发中常见监听器

监听域对象的创建与销毁
监听ServletContext创建与销毁 ServletContextListener

/**
 * 声明一个监听器(监听ServletContext创建与销毁)
 * @author lanou
 *
 */
public class MyServletContextListener implements ServletContextListener{

    //初始化方法
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext初始化方法");
    }
    //销毁方法
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext销毁方法");
    }
}

监听HttpSession创建与销毁 HttpSessionListener

public class MyHttpSessionListener implements HttpSessionListener{

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //HttpSessionEvent 事件源对象
        //获取session
        HttpSession session = se.getSession();
        System.out.println("session创建"+session.getId());
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session销毁");
    }
}

监听HttpServletRequest创建与销毁 ServletRequestListener

public class MySevletRequestListener implements ServletRequestListener{

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("request创建");
    }
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("销毁");
    }
}

监听域对象的属性变化
监听ServletContext属性变化 ServletContextAttributeListener
监听HttpSession属性变化 HttpSessionAttributeListener
监听HttpServletRequest属性变化 ServletRequestAttributeListener

/**
 * 监听Request域中值得变化
 * @author lanou
 *
 */
public class MyServletRequestAttritbuteListener implements ServletRequestAttributeListener{

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        System.out.println("添加");
    }
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        System.out.println("删除");
    }
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        System.out.println("替换");
        //查看一下替换的内容
        System.out.println(srae.getName() +" "+srae.getValue());
    }
}

监听session绑定javaBean
它是用于监听javaBean对象是否绑定到了session域 HttpSessionBindingListener
注意:
1.不用在xml中注册
2.实现接口的类 是javaBean类

/**
 * 测试HttpSessionBindingListener接口
 * @author lanou
 *
 */
public class User implements HttpSessionBindingListener{

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("添加");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("移除");
    }

}

Filter过滤器(拦截器)

Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。
配置方式
创建一个类实现Filter接口
重写接口中方法 doFilter方法是真正过滤的。
在web.xml文件中配置
注意:需要放行资源

/**
 * 创建Filter拦截器(过滤器)步骤
 * @author lanou
 *
 *注意:Filter与servlet生命周期的区别
 *     Filter在你服务器启动时就会创建
 */
public class MyFilter implements Filter{
    public MyFilter() {
        System.out.println("Filter实例化方法");
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter创建了");
    }

    //拦截到资源会触发该方法
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //解决乱码问题(路径配置合适,就都能解决乱码问题)
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        System.out.println("拦截了");
        //调用放行的方法
        chain.doFilter(request, response);
        System.out.println("拦截完了");

    }

    @Override
    public void destroy() {
        System.out.println("Filter销毁了");
    }

}

Filter生命周期
Servlet生命周期:
实例化 –》 初始化 –》 服务 –》 销毁

当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.

Filter配置
基本配置

<filter>
        <filter-name>filter名称filter-name>
        <filter-class>Filter类的包名.类名filter-class>
    filter>
    <filter-mapping>
        <filter-name>filter名称filter-name>
        路径
    filter-mapping>
1.
        完全匹配   以”/demo1”开始,不包含通配符*
        目录匹配   以”/”开始  以*结束
        扩展名匹配  *.xxx  不能写成/*.xxx
2.
        它是对指定的servlet名称的servlet进行拦截的。
3. 对访问方式进行拦截
        可以取的值有  REQUEST  FORWARD    
它的作用是:当以什么方式去访问web资源时,进行拦截操作.   

1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
2.FORWARD 它描述的是请求转发的拦截方式配置
public class FirstServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("我是FirstServlet");
        //请求转发 转发到SecondServlet
        request.getRequestDispatcher("/secondServlet").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
public class SecondServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("我是SecondServlet");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

你可能感兴趣的:(Listener监听器与Filter过滤器)