Filter過濾器的hello world

helloWorld:
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號: 73203。
馬克-to-win:請同學(xué)們先做本部分的Filter的hello world實(shí)驗(yàn)。之后根據(jù)實(shí)驗(yàn),再返回來學(xué)習(xí)我接下來的這段話。由于在web.xml當(dāng)中,我們Filter的url-pattern是/*,所以當(dāng)用戶訪問根目錄下的任何目標(biāo)文件時,我們這個Filter都會起作用。當(dāng)發(fā)現(xiàn)用戶要訪問home.jsp時,MarkToWinFilter中的 doFilter方法會被運(yùn)行。其中"之前 filterChain.doFilter"不出意外的會被打印出來。馬克-to-win:接著就是chain.doFilter(request, response);方法。chain是什么?看那張說明“Filter的攔截的工作過程”的圖了嗎?那里面的1234567,7個步驟點(diǎn),你不覺得就像一個chain(鏈兒)嗎?所以chain.doFilter(request, response);的意思就是順著鏈,繼續(xù)往下走一步,就一步而已,繼續(xù)執(zhí)行。馬克-to-win:如果還是Filter,就還是執(zhí)行 chain.doFilter,如果是Servlet,就執(zhí)行doXXX方法。Servlet執(zhí)行完以后,別忘了,還要回來執(zhí)行doFilter中的 chain.doFilter后面的部分。請大家仔細(xì)觀察實(shí)驗(yàn)執(zhí)行結(jié)果。


例 1.2.1
home.jsp:
<%@ page contentType="text/html; charset=GBK" %>
<%System.out.println("inside jsp"); %>
<br>這是在home.jsp<br>
MarkToWinFilter.java:
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MarkToWinFilter implements Filter {
    public MarkToWinFilter() {
        System.out.println("單獨(dú)啟動服務(wù)器時,constructor被運(yùn)行,先于init");
    }
    public void destroy() {
        System.out.println("destroy服務(wù)器關(guān)閉時運(yùn)行");
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
/*下面這句話必須要。否則客戶端瀏覽器里"之前"和"之后"兩個詞兒,中文就顯示亂碼。在chain上的response始終就是那一個,回寫到客戶端的結(jié)果先緩存在response當(dāng)中,最后一并顯示在客戶端瀏覽器中。*/       
        response.setCharacterEncoding("GBK");
        PrintWriter out = response.getWriter();
        out.println("之前 filterChain.doFilter");
        System.out.println("之前 filterChain.doFilter");
        chain.doFilter(request, response);
        System.out.println("之后 filterChain.doFilter");
        out.println("之后 filterChain.doFilter");
    }
    public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("單獨(dú)啟動服務(wù)器時,init被運(yùn)行");
    }
}





在web.xml當(dāng)中,加入以下的片段:

    <filter>
        <filter-name>MarkToWinFilter</filter-name>
        <filter-class>com.MarkToWinFilter</filter-class>
    </filter>
  <filter-mapping>
      <filter-name>MarkToWinFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>


在瀏覽器中,當(dāng)運(yùn)行home.jsp時,輸出的結(jié)果是:
之前 filterChain.doFilter
這是在home.jsp
之后 filterChain.doFilter



Console當(dāng)中輸出的結(jié)果是:
之前 filterChain.doFilter
inside jsp
之后 filterChain.doFilter


看Console的記錄,在服務(wù)器啟動過程中,有這么兩句話:
單獨(dú)啟動服務(wù)器時,constructor被運(yùn)行,先于init
單獨(dú)啟動服務(wù)器時,init被運(yùn)行