今天在公司看到有同事在写filter晚上一个人在家无聊就想聊聊这个东西
jsp开发中的监听器和过滤器这两个东西要说起来很大很繁今天我想用一个现实的例子来说明这两个东东的作用
案例描述
假设你平时生活在北京有天你去一个很边远很贫穷的山村体验生活到了那个山村后你想要什么东西村长都会同意然后安排村民送给你但是有一点例外的是一旦你问他们要钱村长坚决不给还会带领村民把你打回北京去
你为了从村民那里带走尽量多的东西所以你在出发前准备了一个大袋子希望把村民给的东西都放到袋子里然后你在回到城市后这个袋子就没用了你就把这个袋子给扔了
代码模拟
恩我想用如下简单代码来模拟以上案例大家可以想一下监听器扮演者什么角色?过滤器扮演什么角色?
新建一个java web project
默认的indexjsp页面上加上两个链接模拟要村民要红薯和要钱如下
<html>
<body>
<h>欢迎掉入无名村哈哈</h><br>
<a>给红薯</a><br/>
<a>给钱</a><br/>
</body>
</html>
新建一个大布袋类BigBagjava如下
packagechbdemoweb;
importjavautilHashMap;
publicclassBigBag{
publicstaticHashMap<StringInteger>bag;//村民的东西就放在这个袋子里
}
新建一个监听器MyListenerjava如下
packagechbdemoweb;
importjavautilHashMap;
importjavaxservletServletContextEvent;
importjavaxservletServletContextListener;
publicclassMyListenerimplementsServletContextListener{
publicvoidcontextDestroyed(ServletContextEventarg){
BigBagbag=null;
Systemoutprintln(回城了让掉烂袋子吧);
}
publicvoidcontextInitialized(ServletContextEventarg){
BigBagbag=newHashMap<StringInteger>();
Systemoutprintln(要进山了准备好布袋子);
}
}
再新建一个过滤器MyFilterjava如下
packagechbdemoweb;
importjavaioIOException;
importjavaxservletFilter;
importjavaxservletFilterChain;
importjavaxservletFilterConfig;
importjavaxservletServletException;
importjavaxservletServletRequest;
importjavaxservletServletResponse;
importjavaxservlethttpHttpServletRequest;
importjavaxservlethttpHttpServletResponse;
publicclassMyFilterimplementsFilter{
publicvoiddestroy(){
}
publicvoiddoFilter(ServletRequestrequestServletResponseresponse
FilterChainchain)throwsIOExceptionServletException{
HttpServletRequestreq=(HttpServletRequest)request;
HttpServletResponsersp=(HttpServletResponse)response;
if(reqgetRequestURI()toString()endsWith(moneyjsp)){
//什么时候有过钱啊?打回北京去
rspsendRedirect(gohomejsp);
Systemoutprintln(什么时候有过钱啊滚回家去!);
return;
}elseif(reqgetRequestURI()toString()endsWith(hongshujsp)){
if(ntainsKey(hongshu)){
intnum=BigBagbagget(hongshu)+;
BigBagbagput(hongshunum);
Systemoutprintln(得到第+num+个红薯);
}else{
BigBagbagput(hongshu);
Systemoutprintln(得到第个红薯);
}
//村长同意了下面就是到村民家中拿了
chaindoFilter(requestresponse);
}else{
//只要不要钱就行放行
chaindoFilter(requestresponse);
}
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
}
在webxml中配置监听器和过滤器如下所示
<?xmlversion=encoding=UTF?>
<webappversion=xmlns=
xmlns:xsi=instance
xsi:schemaLocation=
app__xsd>
<filter>
<filtername>myFilter</filtername>
<filterclass>chbdemowebMyFilter</filterclass>
</filter>
<filtermapping>
<filtername>myFilter</filtername>
<urlpattern>/*</urlpattern>
</filtermapping>
<listener>
<listenerclass>chbdemowebMyListener</listenerclass>
</listener>
<welcomefilelist>
<welcomefile>indexjsp</welcomefile>
</welcomefilelist>
</webapp>
好了大功告成部署运行观察结果怎样?
分析结果
我们会观察到如下结果
当服务启动过程中控制台输出要进山了准备好布袋子
当点击一下给红薯的链接时控制台会输出得到第x个红薯
当点击一下给钱的链接时控制台输出什么时候有过钱啊滚回家去!
怎么样?有点明白了?
其实监听器就是在服务启动之前做好保证服务正常运行的准备工作服务结束的时候再善后一下对应案例中的情况就是在上路之前把袋子准备好回来了把袋子扔掉类似保姆的工作照顾孩子起床再照顾孩子睡下
过滤器就是针对服务器的请求加以过滤限制对应案例中的情况就是村长了掌握着生杀大权什么事都得过我这关才行^_^