Servlet和Filter的url匹配以及url-pattern详解

Servlet和Filter的url匹配以及url-pattern详解
Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的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”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: servlet mapping中的url-pattern是指用于匹配请求URL的模式,它可以是一个具体的URL路径,也可以是一个通配符表达式,用于匹配多个URL路径。在web.xml文件中配置servlet mapping时,需要指定url-pattern,以便将请求分发到对应servlet处理。例如,url-pattern可以是"/hello",表示匹配请求路径为"/hello"的URL,也可以是"/*",表示匹配所有请求路径的URL。 ### 回答2: 在Servlet中,url-pattern用于指定一个URLServlet映射关系。当浏览器发送请求时,服务器会根据URL匹配规则找到对应Servlet来处理请求。 url-pattern可以使用多种形式的通配符来定义,常见的有以下几种: 1. 精确匹配:使用完整的URL路径来匹配,例如"/example"表示只有当请求的URL路径为"/example"时才能匹配对应Servlet。 2. 路径匹配:使用通配符"*"来匹配任意路径段,例如"/example/*"表示可以匹配任意以"/example/"开头的URL路径。 3. 后缀匹配:使用通配符"*.后缀名"来匹配以指定后缀名结尾的URL路径,例如"*.do"表示可以匹配以".do"结尾的URL路径。 4. 默认匹配:使用"/"作为url-pattern的值时,表示该Servlet是默认的Servlet,会处理所有未被其他Servlet匹配到的请求。 url-pattern的配置可以在Servlet的部署描述符(web.xml)中进行,也可以使用注解(@WebServlet)来进行配置。在配置时需要注意url-pattern的顺序,首先匹配到的Servlet将处理请求。 总之,url-pattern用于定义ServletURL之间的映射关系,通过合适的配置可以确保请求能够被正确地分发给对应Servlet进行处理。 ### 回答3: 在Servlet中,url-pattern是用来指定ServletWeb应用中的URL映射的规则。通过url-pattern,可以将Servlet与特定的URL路径进行关联,使得当该URL被访问时,对应Servlet能够被正确调用和执行。 url-pattern可以使用一种简单的通配符规则,以匹配不同的URL路径,包括以下几种形式: 1. 精确匹配:可以直接指定一个具体的URL路径,例如"/myservlet",表示该Servlet与路径为"/myservlet"的URL进行匹配。 2. 后缀匹配:可以使用"*.后缀名"的形式进行匹配,例如"*.do",表示该Servlet与所有以".do"结尾的URL进行匹配。 3. 前缀匹配:可以使用"前缀/*"的形式进行匹配,例如"/servlet/*",表示该Servlet与所有以"/servlet"开头的URL进行匹配。 4. 扩展名匹配:可以使用"/"和"*"进行匹配,例如"/servlet/*",表示该Servlet与所有的URL进行匹配。 在实际应用中,url-pattern的选择根据具体的需求来确定。精确匹配通常用于与特定的URL建立直接联系,后缀匹配和前缀匹配用于处理一类具有相同特征的URL,而扩展名匹配则用于处理所有的URL请求。 需要注意的是,当存在多个url-pattern匹配同一个URL地址时,Servlet容器会选择匹配规则最准确的Servlet进行处理。因此,在配置url-pattern时,应确保不会引起冲突或模糊性,避免出现无法预期的结果。 总之,url-patternServlet映射URL访问的重要方式,通过合理配置url-pattern,可以实现灵活、高效的URL映射Servlet调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值