zoukankan      html  css  js  c++  java
  • 过滤器和监听器的区别

    1.过滤器

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过过滤编码的代码示例来了解它的使用:

     MyCharsetFilter.java 编码过滤器   
    package ...;   
    import ...;   
    // 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.   
    // Filter跟web应用一起启动   
    // 当web应用重新启动或销毁时,Filter也被销毁   
    public class MyCharsetFilter implements Filter {   
         private FilterConfig config = null;   
         public void destroy() {   
             System.out.println("MyCharsetFilter准备销毁...");   
         }   
        
         public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {   
             // 强制类型转换   
             HttpServletRequest request = (HttpServletRequest)arg0;   
             HttpServletResponse response = (HttpServletResponse)arg1;   
             // 获取web.xm设置的编码集,设置到Request、Response中         request.setCharacterEncoding(config.getInitParameter("charset"));          response.setContentType(config.getInitParameter("contentType"));          response.setCharacterEncoding(config.getInitParameter("charset"));            
            // 将请求转发到目的地   
             chain.doFilter(request, response);   
         }   
        
         public void init(FilterConfig arg0) throws ServletException {   
             this.config = arg0;   
             System.out.println("MyCharsetFilter初始化...");   
         }   
     }
    

    以下是 MyCharsetFilter.java 在web.xml 中配置: 

    <filter>   
          <filter-name>filter</filter-name>   
          <filter-class>dc.gz.filters.MyCharsetFilter</filter-class>   
          <init-param>   
              <param-name>charset</param-name>   
              <param-value>UTF-8</param-value>   
          </init-param>   
          <init-param>   
              <param-name>contentType</param-name>   
              <param-value>text/html;charset=UTF-8</param-value>   
          </init-param>   
      </filter>   
      <filter-mapping>   
          <filter-name>filter</filter-name>   
          <!-- * 代表截获所有的请求  或指定请求/test.do  /xxx.do -->   
          <url-pattern>/*</url-pattern>   
      </filter-mapping>
    

    2.监听器:

    现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。下面利用监听器对数据库连接池DataSource的初始化演示它的使用:

    MyServletContextListener.java   
     package dc.gz.listeners;   
     import javax.servlet.ServletContext;   
     import javax.servlet.ServletContextEvent;   
     import javax.servlet.ServletContextListener;   
     import org.apache.commons.dbcp.BasicDataSource;   
        
      /**  
      * Web应用监听器  
      */   
     public class MyServletContextListener implements ServletContextListener {     
         // 应用监听器的销毁方法   
         public void contextDestroyed(ServletContextEvent event) {   
             ServletContext sc = event.getServletContext();   
             // 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空   
             sc.removeAttribute("dataSource");   
            System.out.println("销毁工作完成...");   
         }   
        
         // 应用监听器的初始化方法   
         public void contextInitialized(ServletContextEvent event) {   
             // 通过这个事件可以获取整个应用的空间   
             // 在整个web应用下面启动的时候做一些初始化的内容添加工作   
             ServletContext sc = event.getServletContext();   
             // 设置一些基本的内容;比如一些参数或者是一些固定的对象   
             // 创建DataSource对象,连接池技术 dbcp   
             BasicDataSource bds = new BasicDataSource();   
             bds.setDriverClassName("com.mysql.jdbc.Driver");           
    bds.setUrl("jdbc:mysql://localhost:3306/hibernate"); bds.setUsername("root"); bds.setPassword("root"); bds.setMaxActive(10);//最大连接数 bds.setMaxIdle(5);//最大管理数 //bds.setMaxWait(maxWait); 最大等待时间 // 把 DataSource 放入ServletContext空间中, // 供整个web应用的使用(获取数据库连接) sc.setAttribute("dataSource", bds); System.out.println("应用监听器初始化工作完成..."); System.out.println("已经创建DataSource..."); } }
  • 相关阅读:
    CodeForces 734F Anton and School
    CodeForces 733F Drivers Dissatisfaction
    CodeForces 733C Epidemic in Monstropolis
    ZOJ 3498 Javabeans
    ZOJ 3497 Mistwald
    ZOJ 3495 Lego Bricks
    CodeForces 732F Tourist Reform
    CodeForces 732E Sockets
    CodeForces 731E Funny Game
    CodeForces 731D 80-th Level Archeology
  • 原文地址:https://www.cnblogs.com/caidupingblogs/p/6056494.html
Copyright © 2011-2022 走看看