servlet和filter的异同

之前总觉得filter就是一种特殊servlet,因此他们在web.xml中配置因该是同样的,可是事实并不是如此!html


请看下文:java

看Servelt规范: 
web

引用
A filter is a reusable piece of code that can transform the content of HTTP requests, responses, and header information. Filters do not generally create a response or respond to a request as servlets do, rather they modify or adapt the requests for a resource, and modify or adapt responses from a resource.



简要翻译下: 
filter是一个能够复用的代码片断,能够用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。 

再在看Filter的继承体系(不继承Servlet接口):
 
app

Java代码 
  1. public interface Filter  




因此第一个结论:Servlet和Filter没有关系!可是2者能够很好的协同工做。
 
url






还有不一样的就是, servlet容器对url匹配过程spa

当一個请求发送到servlet容器中,容器就会將减去上下文的路径做为匹配servlet的映射url 。.net

好比  我我访问的是http://localhost:8088/test/aa.html.  servlet容器就谁去掉上下文test翻译

获得/aa.html 这个就是servlet的映射url。 这个映射的过程仍是有顺序的(这就和filter不一样了下面会体会到)。code


当一個servlet匹配成功后就不会在往下去匹配了, 。 其余还有其余的匹配规则:orm


1, 精确路径的匹配;例子:好比servletA url-pattern为 /testservletBurl-pattern为 /* ,这个时候,若是我访问的urlhttp://localhost/test ,这个时候容器就会先 进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其余的servlet了。



2, 最长路径的匹配:例子:servletAurl-pattern/test/*,而servletBurl-pattern/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB

3. 扩展匹配,若是url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletAurl-pattern*.action



4 ,对于filter ,它没有映射的路径,在配置文件中不须要写url,只须要写filter类就行了,不会像servlet那样只匹配一个servlet,由于filter的集合是一个链,因此只要考虑执行的顺序就能够,而不会出现只选择一个filter,写的每一个filter都会执行Filter的处理顺序和filter-mappingweb.xml中定义的顺序相同。

 



已有 0 人发表留言,猛击->>这里<<-参与讨论


JavaEye推荐
相关文章
相关标签/搜索