做java web开发 无论是新手还是老手 都不可避免的要接触到filter和servlet 乃至于很多情况下都要自定义filter和servlet 他们都是有生命周期的 基本的类似初始化方法和销毁方法比较好理解 不再赘述。
filter 是拦截器 过滤器的意思 当客户端发起一个请求的时候 请求信息以request对象的方法传入到服务端 在web.xml中 可以自定义很多filter web容器 将他们组织成类似一个锁链(chain)的东西 对请求进行拦截。如果你看过spring中aop部分的ProxyFactoryBean的源码 会发现里面的模式和filter几乎是一样的
invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);// Proceed to the joinpoint through the interceptor chain.retVal = invocation.proceed();
这个里面的chain即是一个链 对调用某目前对象方法进行相应的拦截
但是在javax.servlet.Filter中 还有个dispatcher参数 这个参数的取值为REQUEST,FORWARD,INCLUDE和ERROR 表示该请求方式 默认情况下是REQUEST 也即浏览器发起的请求。 其它方式 比如request.getRequestDispatcher("xx").forward(request, response);这种方式 该filter是不进行拦截的。其它几个也是类似。
servlet你可以理解为一个处理动作 通过servlet-mapping中的url-pattern对请求路径进行相应的拦截 它是没有类似filter中的dispatcher参数的。
我们目前接触的比较多的filter有 CharacterEncodingFilter: 对请求内容进行统一编码 FilterDispatcher:struts2中的核心控制器
Servlet比较出名是springMVC中的DispatcherServlet 是一个标准的干净的MVC框架