Servlet的url匹配以及url-pattern详解
Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间。
一,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文件中,以下语法用于定义映射:
l 以”/’开头和以”/*”结尾的是用来做路径映射的。
l 以前缀”*.”开头的是用来做扩展映射的。
l “/” 是用来定义default servlet映射的。
l 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
分享到:
相关推荐
### URL-Pattern的三种写法详解 在Web应用开发中,`web.xml`配置文件扮演着极其重要的角色,其中`<url-pattern>`元素用于定义Servlet的映射规则,即URL模式。通过不同的URL模式,我们可以精确地控制Servlet如何被...
要注意的是,Servlet 2.5版本开始,一个Servlet可以对应多个`<url-pattern>`,每个`<url-pattern>`定义了一个独立的匹配规则。 总的来说,理解Servlet的URL-Pattern匹配规则对于正确配置和管理Servlet至关重要,它...
- `/`:代表根路径,匹配URL的开头部分,但不包括任何后续内容。这意味着如果设置`<url-pattern>/</url-pattern>`,那么Servlet将处理所有以`/`开头的请求,例如`/login`和`/products`。然而,它不匹配包含更具体...
当`<url-pattern>`配置为`<url-pattern>/</url-pattern>`时,这个Servlet被称为缺省Servlet。任何未在`web.xml`中找到匹配的`servlet-mapping`的URL请求都会被转发给缺省Servlet处理。在Tomcat的`conf/web.xml`中,...
该标签告诉Spring MVC框架,如果找不到任何匹配的处理器,则将请求转发给Web服务器的默认Servlet。这意味着对于那些未被Spring MVC控制器处理的URL,如静态资源的URL,将会由Web容器直接处理。例如: ```xml ...
- `<url-pattern>`:指定访问该Servlet的URL路径。 #### 四、具体Servlet的功能解析 1. **注册功能**: - Servlet名称:`register` - 实现类:`myservlet.control.HandleRegister` - URL映射:`/helpRegister`...
这里需要注意的是,`<servlet-name>`必须与`<servlet>`元素中的`servlet-name`相匹配。 ##### 3. 加载Spring配置文件 为了让Spring能够正确加载配置文件,我们需要在`web.xml`中添加监听器来加载Spring的上下文...
当服务器接收到请求时,它会解析URL,查找匹配的`<url-pattern>`,然后根据`<servlet-class>`加载并实例化对应的Servlet类。这个过程包括加载字节码文件到内存,创建Servlet对象,以及调用`init()`方法进行初始化。 ...
<url-pattern>/myservlet</url-pattern> </servlet-mapping> <!-- 配置会话超时 --> <session-config> <session-timeout>30</session-timeout> </session-config> <!-- 欢迎页面 --> <welcome-file-list> ...
【Servlet与web.xml详解】 Servlet是Java EE标准中的一部分,用于构建动态Web应用程序。Tomcat作为Servlet容器,它遵循Servlet规范来运行和管理Servlet。在Servlet中,有以下几个关键概念: 1. **Listener(监听器...
### Struts2与Servlet共存问题详解 #### 一、问题背景 在Java Web开发中,Struts2框架因其简洁的MVC模式和强大的插件系统而被广泛使用。但在某些场景下,开发者可能需要同时使用Struts2和其他Servlet技术(如...
### Servlet过滤器详解 #### 一、Filter的基本概念与作用 **过滤器(Filter)**是一种Web组件,它能够在客户端请求到达目标资源(如Servlet、JSP页面等)之前进行预处理,以及在响应返回客户端之前进行后处理。...
这里需要注意`servlet-name`和`servlet-class`必须与实际编写的Servlet类相匹配,而`url-pattern`定义了访问该Servlet的URL模式。 #### 三、在Servlet中使用数据库连接池 最后,我们来看看如何在Servlet中利用...
【FCKeditor配置详解】 FCKeditor是一款流行的开源富文本编辑器,常用于网页内容的编辑和管理。本文将深入探讨如何将FCKeditor 2.4版本集成到SSH(Struts2、Hibernate、Spring)框架中,并解决可能出现的问题。 **...
这里,`ServletName`是Servlet的别名,`ServletClass`是Servlet类的全限定名,`/path/*`是匹配的URL模式。 ### 4. 过滤器配置 ```xml <filter-name>FilterName</filter-name> <filter-class>...
本文将深入探讨J2EE环境中路径的基本概念及其应用方法,包括相对路径和绝对路径的定义、获取路径的方法,以及在JSP和Servlet中路径使用的差异等。 #### 二、基本概念 ##### 2.1 路径类型 在J2EE中,路径主要分为...
### Java SSH框架搭建配置详解 #### 一、概述 SSH框架是Java Web开发中的一个非常流行的组合,这里的SSH指的是Spring、Struts以及Hibernate三个开源框架的首字母缩写。这三个框架各自解决不同的问题:Spring主要...