这次要学习的是filter。红薯提供我又进行了些更改的hellofilter代码如下:
package demo;
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;
import com.core.ActionHandler;
import com.core.Config;
import com.core.Handler;
public class HelloFilter implements Filter {
private Handler handler;
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("Filter 初始化");
Config.cns.add("Blog");
handler = new ActionHandler();
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
System.out.println("拦截 URI="+request.getRequestURI());
String coname = request.getParameter("c");
System.out.println(request.getParameter("c") + Config.cns.contains(request.getParameter("c")));
if(Config.cns.contains(coname)) {
handler.handle((HttpServletResponse)res, request);
}
else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
System.out.println("Filter 结束");
}
}
 
HelloFilter实现了Filter接口,Filter定义了三个方法:
当我们启动tomcat后客户端还未访问的时候,控制台便输出了以下信息
控制台输出了”Filter 初始化”,即tomcat会自动初始化我们在web.xml注册的filter,即调用了init()方法。
当客户端访问 http://localhost:8080/hello.view 以后,控制台输出:
也就是说访问了一次,tomcat在执行某个servlet前会调用doFilter,所以我们需要将filter交给框架指定的filter类(试了试osc上很热门的jfinal,很不错),这样整个工程就会交给框架托管了。doFilter有三个参数,ServletRequest、ServletResponse和FilterChain。
ServletRequest、ServletResponse这两个参数想来肯定就是传给servlet那个public的service方法了。至于FilterChain,字面的意思就是过滤链了,如果我们在web.xml注册了多个Filter的话,就会带着ServletRequest、ServletResponse去执行下个Filter的dofilter方法。在这个案例,由于我们只有一个Filter,所以就去执行具体的servlet方法了。
Filter可以拦截下http请求,我们可以在这里可以做些额外的工作,比如判断用户是否登陆啊等等,当然我也没有具体做过开发,没什么发言权,希望有人给点指点,让我理解得更好点。
至于destory方法,和init方法一样也是由web容器调用的,当服务结束的时候调用,可是每次我关闭tomcat的时候,由于小黑窗关得太快,我都看不到啊,怎么写进日志里呢,求大神指点。