java web编程学习3

此次要学习的是filter。红薯提供我又进行了些更改的hellofilter代码以下:java

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 结束");
	}
}

 web

HelloFilter实现了Filter接口,Filter定义了三个方法:tomcat

image

当咱们启动tomcat后客户端还未访问的时候,控制台便输出了如下信息框架

image

控制台输出了”Filter 初始化”,即tomcat会自动初始化咱们在web.xml注册的filter,即调用了init()方法。ide

当客户端访问 http://localhost:8080/hello.view 之后,控制台输出:学习

image

也就是说访问了一次,tomcat在执行某个servlet前会调用doFilter,因此咱们须要将filter交给框架指定的filter类(试了试osc上很热门的jfinal,很不错),这样整个工程就会交给框架托管了。doFilter有三个参数,ServletRequest、ServletResponse和FilterChain。.net

ServletRequest、ServletResponse这两个参数想来确定就是传给servlet那个public的service方法了。至于FilterChain,字面的意思就是过滤链了,若是咱们在web.xml注册了多个Filter的话,就会带着ServletRequest、ServletResponse去执行下个Filter的dofilter方法。在这个案例,因为咱们只有一个Filter,因此就去执行具体的servlet方法了。日志

Filter能够拦截下http请求,咱们能够在这里能够作些额外的工做,好比判断用户是否登录啊等等,固然我也没有具体作过开发,没什么发言权,但愿有人给点指点,让我理解得更好点。code

至于destory方法,和init方法同样也是由web容器调用的,当服务结束的时候调用,但是每次我关闭tomcat的时候,因为小黑窗关得太快,我都看不到啊,怎么写进日志里呢,求大神指点。xml

相关文章
相关标签/搜索