Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。
一、Servlet容器对url的匹配过程:
当一个请求发送到Servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为Servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做Servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个Servlet匹配成功以后,就不会去理会剩下的Servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:
1. 精确路径匹配。例子:比如ServletA 的url-pattern为 /test,ServletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被ServletA精确匹配,那么就去调用ServletA,也不会去理会其他的Servlet了。
2. 最长路径匹配。例子:ServletA的url-pattern为/test/*,而ServletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的Servlet来匹配,也就是这里的ServletB.
3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的Servlet.例子:ServletA的url-pattern:*.action
4. 如果前面三条规则都没有找到一个Servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default Servlet,则容器会将请求丢给default Servlet(什么是default Servlet?后面会讲)。
根据这个规则表,就能很清楚的知道Servlet的匹配过程,所以定义Servlet的时候也要考虑url-pattern的写法,以免出错。
对于filter,不会像Servlet那样只匹配一个Servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter.Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。
二、url-pattern详解
在web.xml文件中,以下语法用于定义映射:
以“/‘开头和以”/*“结尾的是用来做路径映射的。
以前缀“*.”开头的是用来做扩展映射的。
“是用来定义default Servlet映射的。
剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义“/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致Servlet容器无法判断。
分享到:
相关推荐
在Tomcat这样的标准Servlet容器中,这个过程涉及多个关键组件和步骤: 1. **初始化**:Servlet容器在启动时会读取配置文件(如`server.xml`),解析其中的Web应用上下文定义,为每个Web应用创建一个Context对象。...
在本示例中,我们看到一个简化的Servlet容器的实现,这个容器仅用于理解基本概念,而非生产环境中的实际应用。 首先,让我们分析代码结构。`HttpServer1` 类是一个基础的服务器端点,它监听指定的端口(在这个例子...
Servlet容器的启动过程通常是这样的:通过调用Tomcat的启动类`org.apache.catalina.startup.Tomcat`的`start`方法,可以启动整个服务器。Tomcat会扫描指定的Web应用程序目录,解析`WEB-INF/web.xml`文件,根据其中的...
1. Servlet容器启动过程 Servlet容器(如Tomcat)在启动时会加载其配置文件,比如Tomcat的`server.xml`,并根据配置信息初始化各个级别的容器。Tomcat的容器结构包括Engine(引擎)、Host(主机)、Context(上下文...
在Apache Tomcat这样的Servlet容器中,Host和Engine容器扮演着至关重要的角色,它们构成了Tomcat内部的层次结构,使得能够高效地管理和运行多个Web应用程序。本文将深入探讨这两个概念及其在Tomcat部署中的作用。 ...
Servlet与Servlet容器之间的关系可以类比为枪和子弹,Servlet是实现业务逻辑的“子弹”,而Servlet容器则是装载和发射这些“子弹”的“枪”。 Servlet容器的工作原理主要涉及以下几个关键点: 1. **Servlet容器...
Servlet3.1引入了异步处理能力,允许开发者在Servlet容器内部创建异步上下文(AsyncContext),从而将控制权交还给容器,避免了线程阻塞。这种方式使得服务器可以处理更多的并发请求,提高系统吞吐量。开发者可以在...
Servlet容器提供了必要的运行环境和支持服务,而Servlet则负责处理具体的业务逻辑。这种分离的设计模式有利于提高系统的灵活性和扩展性。 #### 三、Servlet容器的功能与实现 1. **管理Servlet的生命周期**:...
Apache Tomcat 7.0.61是广泛使用的开源Servlet容器,它实现了Servlet 3.0规范,提供了稳定、高性能的运行环境。 一、Servlet 3.0新特性 1. 注解支持:Servlet 3.0引入了注解(Annotation)来声明Servlet、Filter和...
如果请求匹配到一个Servlet,Servlet容器将创建一个Servlet实例(如果尚未创建),然后调用Servlet的相关方法来处理请求。默认情况下,Servlet容器会调用Servlet的`service()`方法,该方法会根据请求类型(GET、POST...
- **请求分发**: Servlet容器通过匹配URL路径来选择合适的Servlet进行处理。 5. **过滤器Filter** - **Filter接口**: 允许在请求到达Servlet之前或之后进行拦截处理,如认证、字符编码转换、日志记录等。 - **...
当收到HTTP请求时,Servlet容器解析请求,匹配合适的Servlet,然后调用相应的服务方法处理请求。 `service()`方法是Servlet的核心,根据请求类型(GET、POST等)选择调用`doGet()`或`doPost()`。这些方法允许开发者...
整个过程涉及到了Servlet容器(如Tomcat)的介入,容器负责创建Servlet实例、管理其生命周期以及调度请求。 二、Servlet配置 Servlet的配置通常在Web应用的部署描述符`web.xml`文件中进行。配置包括定义Servlet类、...
5. **Servlet容器**:Servlet运行在Servlet容器(如Tomcat、Jetty)中,容器负责管理Servlet的生命周期,处理线程安全问题,并提供与Web服务器的集成。 6. **过滤器(Filter)**:Servlet API还提供了Filter接口,...
- **加载与初始化**:当Web应用启动或首次接收到匹配Servlet映射的请求时,Servlet容器(如Tomcat)会加载Servlet类,并调用`init()`方法进行初始化。 - **服务**:每当有请求到达,Servlet容器会调用`service()...
Servlet3.0规范加入了对WebSocket协议的支持,通过`@ServerEndpoint`注解,开发者可以直接在Servlet容器中创建WebSocket服务,实现了双向通信,为实时Web应用提供了可能。 5. **微内核** Servlet3引入了微内核...
Servlet运行在Servlet容器中,如Tomcat、Jetty等。容器负责管理Servlet的生命周期,处理请求分发,并提供上下文环境。开发者可以通过web.xml部署描述符配置Servlet和过滤器,或者使用Java annotations进行声明式配置...