javastreamfilter 戏说java web开发中的listener和filter
戏说java web开发中的listener和filter
今天在公司看到有同事在写filter 晚上一个人在家无聊 就想聊聊这个东西
jsp开发中的监听器和过滤器 这两个东西要说起来 很大 很繁 今天我想用一个现实的例子 来说明这两个东东的作用
案例描述
假设你平时生活在北京 有天你去一个很边远很贫穷的山村体验生活 到了那个山村后 你想要什么东西 村长都会同意 然后安排村民送给你 但是有一点例外的是 一旦你问他们要钱 村长坚决不给 还会带领村民把你打回北京去
你为了从村民那里带走尽量多的东西 所以你在出发前准备了一个大袋子 希望把村民给的东西都放到袋子里 然后你在回到城市后 这个袋子就没用了 你就把这个袋子给扔了
代码模拟
恩 我想用如下简单代码来模拟以上案例 大家可以想一下监听器扮演者什么角色?过滤器扮演什么角色?
新建一个java web project
默认的index jsp页面上加上两个链接 模拟要村民要红薯和要钱 如下
<>
<body>
<h >欢迎掉入无名村 哈哈</h ><br>
<a>给红薯</a><br/>
<a>给钱</a><br/>
</body>
</>
新建一个大布袋类 BigBag java 如下
packagechb demo web;
importjava util HashMap;
publicclassBigBag {
publicstaticHashMap<String Integer>bag;//村民的东西就放在这个袋子里
}
新建一个监听器 MyListener java 如下
packagechb demo web;
importjava util HashMap;
importjavax servlet ServletContextEvent;
importjavax servlet ServletContextListener;
publicclassMyListenerimplementsServletContextListener {
publicvoidcontextDestroyed(ServletContextEventarg ) {
BigBag bag=null;
System out println( 回城了 让掉烂袋子吧 );
}
publicvoidcontextInitialized(ServletContextEventarg ) {
BigBag bag=newHashMap<String Integer>();
System out println( 要进山了 准备好布袋子 );
}
}
再新建一个过滤器 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 HttpServletRequest;
importjavax servlet 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(ntainsKey( hongshu )) {
intnum=BigBag bag get( hongshu )+ ;
BigBag bag put( hongshu num);
System out println( 得到第 +num+ 个红薯 );
}else {
BigBag bag put( hongshu );
System out println( 得到第 个红薯 );
}
//村长同意了 下面就是到村民家中拿了
chain doFilter(request response);
}else {
//只要不要钱就行 放行
chain doFilter(request response);
}
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException {
}
}
在web xml中配置监听器和过滤器 如下所示
<?xmlversion= encoding= UTF ?>
<web appversion= xmlns=
xmlns:xsi= instance
xsi:schemaLocation=
app_ _ 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>
<wele file list>
<wele file>index jsp</wele file>
</wele file list>
</web app>
好了 大功告成 部署运行 观察结果怎样?
分析结果
我们会观察到如下结果
当服务启动过程中 控制台输出 要进山了 准备好布袋子
当点击一下 给红薯 的链接时 控制台会输出 得到第x个红薯
当点击一下 给钱 的链接时 控制台输出 什么时候有过钱啊 滚回家去!
怎么样?有点明白了?
其实 监听器就是在服务启动之前做好保证服务正常运行的准备工作 服务结束的时候再善后一下 对应案例中的情况 就是在上路之前把袋子准备好 回来了把袋子扔掉 类似保姆的工作 照顾孩子起床 再照顾孩子睡下
lishixinzhi/Article/program/Java/hx/201311/27012