JAva web開発におけるlistenerとfilter


jsp開発中のリスナーとフィルタ、この2つは、どちらかというと、大きくて煩雑です.今日は現実的な例で、この2つの役割を説明したいと思います.
ケーススタディ
もしあなたが普段北京で生活しているとしたら、ある日あなたはとても辺鄙で貧しい山村に行って生活を体験して、その山村に着いたら、あなたは何がほしいですか.村長は同意して、それから村人を手配してあなたにあげますが、少し例外があります.
村人からできるだけ多くのものを持っていくために、出発前に大きな袋を用意して、村人からもらったものを袋に入れたいと思っています.そしてあなたが町に帰った後、この袋は役に立たないので、この袋を捨てました.
コードシミュレーション
はい、以下の簡単なコードで上記のケースをシミュレートしたいのですが、リスナーの役割を考えてみてください.フィルターはどんな役を演じますか?
1.java web projectを新規作成する.
2.デフォルトのindex.jspページに2つのリンクを追加し、村人にサツマイモとお金を要求するシミュレーションを行いました.以下のようにします.

<html>
  <body>
    <h1>       ,  </h1><br>
    <a href="hongshu.jsp">   </a><br/>
    <a 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.新しいListener: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.フィルタをもう1つ追加: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>

さあ、大成功、配置運行、観察結果はどうですか.
解析結果
次のような結果が得られます.
サービスが開始されると、コンソールは「山に入ります.布袋を用意してください」と出力します.
「サツマイモへ」のリンクをクリックすると、コンソールから「x番目のサツマイモを得る」と出力されます.
「お金をあげる」リンクをクリックすると、コンソールから「いつお金があったのか、家に帰れ!」と出力されます.
どうですか.ちょっと分かった?
実は、リスナーはサービスが起動する前にサービスが正常に運行することを保証する準備をして、サービスが終了する時にもう一度後回しにします.対応例では、出発する前に袋を用意し、帰ってきたら袋を捨てる.家政婦のような仕事をして、子供の世話をして起きて、子供の世話をして寝ます.
フィルタはサーバの要求に対して、フィルタ制限を加える.対応例としては村長がいて、生殺の大権を握っていて、何事も私の関門を通らなければなりません^^;