zoukankan      html  css  js  c++  java
  • web.xml 中的过滤器(拦截器)Filter与监听器Listener的作用和区别(转)

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

    1. package com.hello.web.listener;  
    2.   
    3. import java.io.IOException;  
    4.   
    5. import javax.servlet.*;  
    6. import javax.servlet.http.HttpServletRequest;  
    7. import javax.servlet.http.HttpServletResponse;  
    8.   
    9. // 主要目的:过滤字符编码;其次,做一些应用逻辑判断等.  
    10. // Filter跟web应用一起启动  
    11. // 当web应用重新启动或销毁时,Filter也被销毁  
    12. public class MyCharsetFilter implements Filter  
    13. {  
    14.     private FilterConfig config = null;  
    15.       
    16.     public void destroy()  
    17.     {  
    18.         System.out.println("MyCharsetFilter准备销毁...");  
    19.     }  
    20.   
    21.     public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain chain) throws IOException, ServletException  
    22.     {  
    23.         // 强制类型转换  
    24.         HttpServletRequest request = (HttpServletRequest) arg0;  
    25.         HttpServletResponse response = (HttpServletResponse) arg1;  
    26.         // 获取web.xm设置的编码集,设置到Request、Response中  
    27.         request.setCharacterEncoding(config.getInitParameter("charset"));  
    28.         response.setContentType(config.getInitParameter("contentType"));  
    29.         response.setCharacterEncoding(config.getInitParameter("charset"));  
    30.         // 将请求转发到目的地  
    31.         chain.doFilter(request, response);  
    32.     }  
    33.   
    34.     public void init(FilterConfig arg0) throws ServletException  
    35.     {  
    36.         this.config = arg0;  
    37.         System.out.println("MyCharsetFilter初始化...");  
    38.     }  
    39. }  

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

    1. <filter>  
    2.       <filter-name>filter</filter-name>  
    3.       <filter-class>dc.gz.filters.MyCharsetFilter</filter-class>  
    4.       <init-param>  
    5.           <param-name>charset</param-name>  
    6.           <param-value>UTF-8</param-value>  
    7.       </init-param>  
    8.       <init-param>  
    9.           <param-name>contentType</param-name>  
    10.           <param-value>text/html;charset=UTF-8</param-value>  
    11.       </init-param>  
    12.   </filter>  
    13.   <filter-mapping>  
    14.       <filter-name>filter</filter-name>  
    15.       <!-- * 代表截获所有的请求  或指定请求/test.do  /xxx.do -->  
    16.       <url-pattern>/*</url-pattern>  
    17.   </filter-mapping>  

     以上的例子简单的说明了Filter的使用,具体其他的应用可以看具体的场景。

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

    1. MyServletContextListener.java  
    2. package dc.gz.listeners;  
    3. import javax.servlet.ServletContext;  
    4. import javax.servlet.ServletContextEvent;  
    5. import javax.servlet.ServletContextListener;  
    6. import org.apache.commons.dbcp.BasicDataSource;  
    7.    
    8. /** 
    9.  * Web应用监听器 
    10.  */  
    11. public class MyServletContextListener implements ServletContextListener {  
    12.    
    13.     // 应用监听器的销毁方法  
    14.     public void contextDestroyed(ServletContextEvent event) {  
    15.         ServletContext sc = event.getServletContext();  
    16.         // 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空  
    17.         sc.removeAttribute("dataSource");  
    18.         System.out.println("销毁工作完成...");  
    19.     }  
    20.    
    21.     // 应用监听器的初始化方法  
    22.     public void contextInitialized(ServletContextEvent event) {  
    23.         // 通过这个事件可以获取整个应用的空间  
    24.         // 在整个web应用下面启动的时候做一些初始化的内容添加工作  
    25.         ServletContext sc = event.getServletContext();  
    26.         // 设置一些基本的内容;比如一些参数或者是一些固定的对象  
    27.         // 创建DataSource对象,连接池技术 dbcp  
    28.         BasicDataSource bds = new BasicDataSource();  
    29.         bds.setDriverClassName("com.mysql.jdbc.Driver");  
    30.         bds.setUrl("jdbc:mysql://localhost:3306/hibernate");  
    31.         bds.setUsername("root");  
    32.         bds.setPassword("root");  
    33.         bds.setMaxActive(10);//最大连接数  
    34.         bds.setMaxIdle(5);//最大管理数  
    35.         //bds.setMaxWait(maxWait); 最大等待时间  
    36.         // 把 DataSource 放入ServletContext空间中,  
    37.         // 供整个web应用的使用(获取数据库连接)  
    38.         sc.setAttribute("dataSource", bds);  
    39.         System.out.println("应用监听器初始化工作完成...");  
    40.         System.out.println("已经创建DataSource...");  
    41.     }  
    42. }  

    web.xml中配置如下,很简单:

    1. <!-- 配置应用监听器  -->  
    2. <listener>  
    3.     <listener-class>dc.gz.listeners.MyServletContextListener</listener-class>  
    4. </listener>  

    这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。

  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/cornucopia/p/4502566.html
Copyright © 2011-2022 走看看