zoukankan      html  css  js  c++  java
  • 戏说java web开发中的listener和filter

    戏说java web开发中的listener和filter

             今天在公司看到有同事在写filter,晚上一个人在家无聊,就想聊聊这个东西。

             jsp开发中的 监听器和过滤器,这两个东西要说起来,很大,很繁。今天我想用一个现实的例子,来说明这两个东东的作用。

    案例描述

            假设你平时生活在北京,有天你去一个很边远很贫穷的山村体验生活,到了那个山村后,你想要什么东西,村长都会同意,然后安排村民送给你,但是有一点例外的是,一旦你问他们要钱,村长坚决不给,还会带领村民把你打回北京去。

            你为了从村民那里带走尽量多的东西,所以你在出发前准备了一个大袋子,希望把村民给的东西都放到袋子里;然后你在回到城市后,这个袋子就没用了,你就把这个袋子给扔了。

    代码模拟

             恩,我想用如下简单代码来模拟以上案例,大家可以想一下监听器扮演者什么角色?过滤器扮演什么角色?

    1. 新建一个java web project;

    2. 默认的index.jsp页面上加上两个链接,模拟要村民要红薯和要钱,如下:

    <html>
      
    <body>
        
    <h1>欢迎掉入无名村,哈哈</h1><br>
        
    <href="hongshu.jsp">给红薯</a><br/>
        
    <href="money.jsp">给钱</a><br/>
      
    </body>
    </html>

    3. 新建一个大布袋类:BigBag.java,如下:

    package chb.demo.web;

    import java.util.HashMap;

    public class BigBag {
        
    public static HashMap<String, Integer> bag;//村民的东西就放在这个袋子里
    }

     4. 新建一个监听器:MyListener.java,如下:

    package chb.demo.web;

    import java.util.HashMap;

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;

    public class MyListener implements ServletContextListener{

        
    public void contextDestroyed(ServletContextEvent arg0) {
            BigBag.bag 
    = null;
            System.out.println(
    "回城了,让掉烂袋子吧");
        }


        
    public void contextInitialized(ServletContextEvent arg0) {
            BigBag.bag 
    = new HashMap<String, Integer>();
            System.out.println(
    "要进山了,准备好布袋子");
        }


    }

    5. 再新建一个过滤器:MyFilter.java,如下:

    package chb.demo.web;

    import java.io.IOException;

    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class MyFilter implements Filter {

        
    public void destroy() {

        }


        
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) 
    throws IOException, ServletException {
            HttpServletRequest req 
    = (HttpServletRequest)request;
            HttpServletResponse rsp 
    = (HttpServletResponse)response;
            
    if(req.getRequestURI().toString().endsWith("money.jsp")){
                
    //什么时候有过钱啊?打回北京去
                rsp.sendRedirect("gohome.jsp");
                System.out.println(
    "什么时候有过钱啊,滚回家去!");
                
    return;
            }
    else if(req.getRequestURI().toString().endsWith("hongshu.jsp")){
                
    if(BigBag.bag.containsKey("hongshu")){
                    
    int num = BigBag.bag.get("hongshu")+1;
                    BigBag.bag.put(
    "hongshu", num);
                    System.out.println(
    "得到第"+num+"个红薯");
                }
    else{
                    BigBag.bag.put(
    "hongshu"1);
                    System.out.println(
    "得到第1个红薯");
                }

                
    //村长同意了,下面就是到村民家中拿了。。
                chain.doFilter(request, response);
            }
    else{
                
    //只要不要钱就行,放行
                chain.doFilter(request, response);
            }

        }


        
    public void init(FilterConfig filterConfig) throws ServletException {

        }


    }

    6. 在web.xml中配置监听器和过滤器,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation
    ="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    >

        
    <filter>
            
    <filter-name>myFilter</filter-name>
            
    <filter-class>chb.demo.web.MyFilter</filter-class>
        
    </filter>

        
    <filter-mapping>
            
    <filter-name>myFilter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>

        
    <listener>
            
    <listener-class>chb.demo.web.MyListener</listener-class>
        
    </listener>
        
    <welcome-file-list>
            
    <welcome-file>index.jsp</welcome-file>
        
    </welcome-file-list>
    </web-app>

    好了,大功告成,部署运行,观察结果怎样?

    分析结果

    我们会观察到如下结果:

    1. 当服务启动过程中,控制台输出“要进山了,准备好布袋子”
    2. 当点击一下“给红薯”的链接时,控制台会输出“得到第x个红薯”
    3. 当点击一下“给钱”的链接时,控制台输出“什么时候有过钱啊,滚回家去!”

    怎么样?有点明白了?

    其实,监听器就是在服务启动之前做好保证服务正常运行的准备工作,服务结束的时候再善后一下;对应案例中的情况,就是在上路之前把袋子准备好,回来了把袋子扔掉;类似保姆的工作,照顾孩子起床,再照顾孩子睡下。

    过滤器就是针对服务器的请求,加以过滤限制;对应案例中的情况,就是村长了,掌握着生杀大权,什么事都得过我这关才行^_^

             好了,就瞎撇到这吧,以上纯属个人见解,如有偏颇或者错误之处,欢迎指正。
  • 相关阅读:
    A Node Influence Based Label Propagation Algorithm for Community detection in networks 文章算法实现的疑问
    Fast Newman-FN算法以及模块度定义介绍
    Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
    设计一个smartnic
    Intel GEN11 GPU
    Intel GEN9 GPU
    Shared Virtual Memory (SVM) Functions
    connect via ssh to virtualbox guest vm without knowing ip address
    smartnic
    技术精品翻译
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330227.html
Copyright © 2011-2022 走看看