zoukankan      html  css  js  c++  java
  • Servlet的url-pattern匹配规则详细描述

    一、前言

      对于很多新手而言,url-pattern的匹配规则和书写方式,很容易混淆,我这边转载一篇文章,希望对新手有所帮助~

    二、正文

    2.1 概述

      在利用servlet或Filter进行url请求的匹配时,很关键的一点就是匹配规则,但servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是由自己的规则,比较容易混淆。本文来详细举例介绍下。下面的说明都是在tomcat服务器中得到验证的。

    先介绍一下匹配的概念,上例子代码。在一个app(如名字为myapp)的web.xml文件中,有如下信息:

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.nau.MyServlet</servlet-class>
      </servlet>
      
      <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>xxxxxx</url-pattern>
        <url-pattern>yyyyyyy</url-pattern>
     </servlet-mapping>  

      上面的配置信息,其中<servlet>标签首先配置声明一个servlet,包括servlet的名字和对应的java类名。其中<servlet-mapping>标签声明了与该servlet相应的匹配规则,每个<url-pattern>标签代表1个匹配规则。

      当浏览器发起一个url请求后,该请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如url是http://10.43.11.143/myapp/kata/detail.html,其应用上下文是myapp,容器会将http://10.43.11.143/myapp去掉,剩下的/kata/detail.html部分拿来做servlet的映射匹配。这个映射匹配过程是有优先顺序的(具体的优先顺序规则后面介绍),而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了。

      注意Filter的匹配规则与servlet一样,但对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。 

      下面我们详细介绍各种匹配规则~

    2.2 精确匹配

    <url-pattern>中配置的项必须与url完全精确匹配。

    如配置信息如下:

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/kata/detail.html</url-pattern>
        <url-pattern>/demo.html</url-pattern>
        <url-pattern>/table</url-pattern>
    </servlet-mapping>

    当在浏览器中输入如下几种url时,都会被匹配到该servlet
    http://10.43.11.143/myapp/kata/detail.html
    http://10.43.11.143/myapp/demo.html
    http://10.43.11.143/myapp/table

    注意:

    http://10.43.11.143/myapp/table/ 是非法的url,不会被当作http://10.43.11.143/myapp/table识别

    另外上述url后面可以跟任意的查询条件,都会被匹配,如

    http://10.43.11.143/myapp/table?hello 这个请求就会被匹配到MyServlet。

    2.3 扩展名匹配

    如果匹配规则如下

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

    则任何扩展名为jsp(文件名和路径任意)的url请求都会匹配,比如下面的url都会被匹配
    http://10.43.11.143/myapp/demo.jsp
    http://10.43.11.143/myapp/test.jsp

    2.4 路径匹配

    如果匹配规则如下

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/kata/*</url-pattern>
    </servlet-mapping>

    则请求的ulr只要前面(myapp之后)的路径是/kata,而后面的路径可以任意。比如下面的url都会被匹配。
    http://10.43.11.143/myapp/kata/demo.html
    http://10.43.11.143/myapp/kata/test.jsp
    http://10.43.11.143/myapp/kata/test/detail.html

    http://10.43.11.143/myapp/kata/action

    http://10.43.11.143/myapp/kata/action/

    注意:路径和扩展名匹配无法同时设置,比如下面的三个<url-pattern>都是非法的,如果设置,启动tomcat服务器会报错。

    <url-pattern>/kata/*.jsp</url-pattern>

    <url-pattern>/*.jsp</url-pattern>

    <url-pattern>he*.jsp</url-pattern>

    另外注意:<url-pattern>/aa/*/bb</url-pattern>
    这个是精确匹配,url必须是 /aa/*/bb,这里的*不是通配的含义

    2.5 匹配任意的url

      如果<url-pattern>配置成如下两种的任意一种

        <url-pattern>/</url-pattern>

        <url-pattern>/*</url-pattern>

      则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。

    2.6 优先顺序

      当一个url与多个servlet的匹配规则可以匹配时,则按照 “ 精确路径 > 最长路径>扩展名”这样的优先级匹配到对应的servlet。举例如下:

      例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。  

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

      例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

    2.7 小结

      本文我们详细介绍了servlet的匹配规则。总的来说就是分为精确、路径和扩展名三种匹配方式,并且介绍了优先级。

    2.8 补充说明

      2.8.1 url-pattern /和/*的区别

        <url-pattern>/</url-pattern>会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url;

             <url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)

         2.8.2 Web 应用部署描述符中,用于映射语法的规定

       1)以“/”字符开头,并以“/*”结尾的字符串用于路径映射
       2)以“*.”开头的字符串被用于扩展名映射
       3)空字符串("")是用于指定精确映射应用程序 context root 的 URL 模式,比如从 http://host:port/<contextroot>/ 来的请求。在这种情况下路径信息是“/”,servlet 路径和 context 路径是一个空的字符串("")
       4)字符串中仅有“/”字符时,表示应用程序“默认”的 servlet。在这种情况下 servlet 路径是请求 URI 去掉 context 路径,且路径信息为 null
      5)其他的字符串仅用于精确匹配

    三、链接

    1、http://www.cnblogs.com/51kata/p/5152400.html

    2、https://zhidao.baidu.com/question/714873332416416005.html

    3、http://bbs.51cto.com/thread-1128433-1.html

  • 相关阅读:
    leetcode5 Longest Palindromic Substring
    leetcode17 Letter Combinations of a Phone Number
    leetcode13 Roman to Integer
    leetcode14 Longest Common Prefix
    leetcode20 Valid Parentheses
    leetcode392 Is Subsequence
    leetcode121 Best Time to Buy and Sell Stock
    leetcode198 House Robber
    leetcode746 Min Cost Climbing Stairs
    tomcat下使用druid配置jnid数据源
  • 原文地址:https://www.cnblogs.com/xdouby/p/6446080.html
Copyright © 2011-2022 走看看