今天在公司看到有同事在寫filter,晚上一個人在家無聊,就想聊聊這個東西.
jsp開發中的JianTingQi和過濾器,這兩個東西要說起來,很大,很繁.今天我想用一個現實的例子,來說明這兩個東東的作用.
案例描述
假設你平時生活在北京,有天你去一個很邊遠很貧窮的山村體驗生活,到了那個山村后,你想要什麼東西,村長都會同意,然後安排村民送給你,但是有一點例外的是,一旦你問他們要錢,村長堅決不給,還會帶領村民把你打回北京去.
你為了從村民那裡帶走盡量多的東西,所以你在出發前準備了一個大袋子,希望把村民給的東西都放到袋子里;然後你在回到城市后,這個袋子就沒用了,你就把這個袋子給扔了.
代碼模擬
恩,我想用如下簡單代碼來模擬以上案例,大家可以想一下JianTingQi扮演者什麼角色?過濾器扮演什麼角色?
1. 新建一個java web project;
2. 默認的index.jsp頁面上加上兩個鏈接,模擬要村民要紅薯和要錢,如下:
<html>
<body>
<h1>歡迎掉入無名村,哈哈</h1><br>
<ahref="hongshu.jsp">給紅薯</a><br/>
<ahref="money.jsp">給錢</a><br/>
</body>
</html>
3. 新建一個大布袋類:BigBag.java,如下:
packagechb.demo.web;
importjava.util.HashMap;
publicclassBigBag...{
publicstaticHashMap<String,Integer>bag;//村民的東西就放在這個袋子里
}
4. 新建一個JianTingQi:MyListener.java,如下:
packagechb.demo.web;
importjava.util.HashMap;
importjavax.servlet.ServletContextEvent;
importjavax.servlet.ServletContextListener;
publicclassMyListenerimplementsServletContextListener...{
publicvoidcontextDestroyed(ServletContextEventarg0)...{
BigBag.bag=null;
System.out.println("回城了,讓掉爛袋子吧");
}
publicvoidcontextInitialized(ServletContextEventarg0)...{
BigBag.bag=newHashMap<String,Integer>();
System.out.println("要進山了,準備好布袋子");
}
}
5. 再新建一個過濾器:MyFilter.java,如下:
packagechb.demo.web;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
publicclassMyFilterimplementsFilter...{
publicvoiddestroy()...{
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException...{
HttpServletRequestreq=(HttpServletRequest)request;
HttpServletResponsersp=(HttpServletResponse)response;
if(req.getRequestURI().toString().endsWith("money.jsp"))...{
//什麼時候有過錢啊?打回北京去
rsp.sendRedirect("gohome.jsp");
System.out.println("什麼時候有過錢啊,滾回家去!");
return;
}elseif(req.getRequestURI().toString().endsWith("hongshu.jsp"))...{
if(BigBag.bag.containsKey("hongshu"))...{
intnum=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);
}
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException...{
}
}
6. 在web.xml中配置JianTingQi和過濾器,如下所示:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="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個紅薯」
當點擊一下「給錢」的鏈接時,控制台輸出「什麼時候有過錢啊,滾回家去!」
怎麼樣?有點明白了?
其實,JianTingQi就是在服務啟動之前做好保證服務正常運行的準備工作,服務結束的時候再善後一下;對應案例中的情況,就是在上路之前把袋子準備好,回來了把袋子扔掉;類似保姆的工作,照顧孩子起床,再照顧孩子睡下.
過濾器就是針對伺服器的請求,加以過濾限制;對應案例中的情況,就是村長了,掌握著生殺大權,什麼事都得過我這關才行^_^
[火星人 ] 戲說java web開發中的listener和filter已經有642次圍觀