JavaWeb第七天--Filter、事务、监听器

129 阅读2分钟

一、过滤器

D310459D-A947-451D-ACF5-226B64E7B4EA.png

1.介绍

  1. Filter也属于Servlet规范
  2. Filter开发步骤:新建类实现Filter接口,然后实现三个方法:init、doFilter、destroy
  3. 配置Filter,可以用注解,也可以用配置文件方式
  4. 过滤器链注解方式配置,过滤器链的拦截顺序是按照全类名的先后顺序
  5. 过滤器链xml方式配置,按照配置的先后顺序

二、事务

06691F96-9E12-46B2-8449-49C96481FD7B.png

C0F4141F-31FC-4103-9F2C-3CF26F1DE638.png 三个DAO操作,共用一个连接

54B06CD4-F7D8-48B1-BAD7-3CE877EB6546.png 创建过滤器

@WebFilter("*.do")
public class OpenSessionInViewFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        try{
            TransactionManager.beginTrans();
            System.out.println("开启事务....");
            filterChain.doFilter(servletRequest, servletResponse);
            TransactionManager.commit();
            System.out.println("提交事务...");
        }catch (Exception e){
            e.printStackTrace();
            try {
                TransactionManager.rollback();
                System.out.println("回滚事务....");
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    @Override
    public void destroy() {

    }
}

管理事务

public class TransactionManager {

    //开启事务
    public static void beginTrans() throws SQLException {
        ConnUtil.getConn().setAutoCommit(false);
    }

    //提交事务
    public static void commit() throws SQLException {
        Connection conn = ConnUtil.getConn();
        conn.commit();
        ConnUtil.closeConn();
    }

    //回滚事务
    public static void rollback() throws SQLException {
        Connection conn = ConnUtil.getConn();
        conn.rollback();
        ConnUtil.closeConn();
    }
}

三、监听器

1) ServletContextListener - 监听ServletContext对象的创建和销毁的过程
2) HttpSessionListener - 监听HttpSession对象的创建和销毁的过程
3) ServletRequestListener - 监听ServletRequest对象的创建和销毁的过程

4) ServletContextAttributeListener - 监听ServletContext的保存作用域的改动(add,remove,replace)
5) HttpSessionAttributeListener - 监听HttpSession的保存作用域的改动(add,remove,replace)
6) ServletRequestAttributeListener - 监听ServletRequest的保存作用域的改动(add,remove,replace)

7) HttpSessionBindingListener - 监听某个对象在Session域中的创建与移除
8) HttpSessionActivationListener - 监听某个对象在Session域中的序列化和反序列化

1.BeanFactory创建过程优化

1.初始化servletContext的时候,创建BeanFactory

public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //在初始化的时候就完成beanFactory的创建
        BeanFactory beanFactory = new ClassPathXmlApplicationContext();
        ServletContext application = servletContextEvent.getServletContext();
        application.setAttribute("beanFactory",beanFactory);
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}

2.中央处理器中,直接通过context的attribut获取BeanFactory

public class DispatcherServlet extends ViewBaseServlet{
    private BeanFactory beanFactory;
    public DispatcherServlet(){};

    public void init()throws ServletException{
    //之前实在此处主动创建IOC容器
    //beanFactory = new ClassPathXmlApplicationContext();
    //现在优化为从application作用域去获取
        super.init();

        ServletContext application = getServletContext();
        Object beanFactoryObj = application.getAttribute("beanFactory");
        if (beanFactoryObj != null){
            beanFactory = (BeanFactory) beanFactoryObj;
        }
    }

3.根据配置上下文初始化参数获取contextConfig文件path

@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //1.获取ServletContext对象
        ServletContext application = servletContextEvent.getServletContext();
        //2.获取上下文的初始化参数
        String path = application.getInitParameter("contextConfigLocation");
        //3.创建Ioc容器
        BeanFactory beanFactory = new ClassPathXmlApplicationContext(path);
        //4.将Ioc容器保存在application作用域
        application.setAttribute("beanFactory",beanFactory);
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 配置上下文参数 -->
    <context-param>
        <param-name>view-prefix</param-name>
        <param-value>/</param-value>
    </context-param>
    <context-param>
        <param-name>view-suffix</param-name>
        <param-value>.html</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>application.xml</param-value>
    </context-param>
</web-app>