转:Servlet的url匹配以及url-pattern详解

简介:       Servlet是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet中的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”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。

 

相关文章
|
4月前
|
前端开发 JavaScript Java
Web.xml - Servlet与Filter的url-pattern
Web.xml - Servlet与Filter的url-pattern
56 8
|
XML 数据格式
可以使用注解将Servlet和URL对应起来
可以使用注解将Servlet和URL对应起来
71 0
Servlet的多URL映射方式
如何实现Servlet的多URL映射方式
|
前端开发 Java 容器
Servlet的url-pattern配置
Servlet的url-pattern配置一定是精确的严谨的
|
XML Java 应用服务中间件
URL访问Java程序-----Servlet
   随着学的东西越来越多,自己也不能保证非常良好地掌握这么多知识。所以希望自己在学习的过程中学会去写博客,记录自己在学习过程中遇到的问题和技巧。  进入正题,Servlet是web开发者绝对绕不开的一个知识,我对Servlet的认识就是让浏览器通过URL去访问服务器的某项Java程序代码。
2094 0
|
容器
Servlet 中的 url-pattern
在 web.xml 中 < servlet-mapping >和< filter-mapping >都有< url-pattern >配置项 它们的作用都是匹配一次请求是否会执行这个 Servlet 或 Filter,那么这个 URL 是怎么匹配的,又是何时匹配的呢? 先看看 Servlet 是何时匹配的。
991 0
|
容器 前端开发 JavaScript
|
应用服务中间件 容器
Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html#springmvc
1124 0
|
前端开发 Java Spring
《Servlet、JSP和Spring MVC初学指南》——第2章 会话管理 2.1URL重写
清单2.1中的Top10Servlet类会显示最受游客青睐的10个伦敦和巴黎的景点。信息分成两页展示,第一页展示指定城市的5个景点,第二页展示另外5个。该Servlet使用URL重写来记录所选择的城市和页数。该类扩展自HttpServlet,并通过/top10访问。
1676 0
|
XML Java 应用服务中间件