1. 程式人生 > >【servlet】路徑匹配 url-pattern

【servlet】路徑匹配 url-pattern

servlet有自己的一套匹配規則。大致分三種,精確,路徑和字尾。

先說路徑:

以/開頭且以/*結尾的是路徑匹配,該路徑下的所有url都會被匹配。如果可以匹配多個路徑,那麼以最長的為結果。

字尾:

*.xxx。固定寫法,*前面不能有東西,不能和路徑匹配一起用,比如/abc/*.txt是不允許的。有一種特殊的字尾匹配是“/*”,這個在所有的字尾匹配中優先順序最高,可以匹配任何url。但是如果已經有精確匹配或者路徑匹配,那麼以精確匹配或者路徑匹配為準。

其餘的大部分都是精確匹配(除了“/”)。

那麼匹配的邏輯是,先精確匹配,找不到再最長路徑匹配,找不到再字尾匹配,還找不到交給default servlet,pattetn是“/”,定義在tomcat的web.xml配置檔案裡,預設會尋找歡迎頁,如果沒有定義歡迎頁那麼404。

  <!-- ==================== Default Welcome File List ===================== -->
  <!-- When a request URI refers to a directory, the default servlet looks  -->
  <!-- for a "welcome file" within that directory and, if present, to the   -->
  <!-- corresponding resource URI for display.                              -->
  <!-- If no welcome files are present, the default servlet either serves a -->
  <!-- directory listing (see default servlet configuration on how to       -->
  <!-- customize) or returns a 404 status, depending on the value of the    -->
  <!-- listings setting.                                                    -->
  <!--                                                                      -->
  <!-- If you define welcome files in your own application's web.xml        -->
  <!-- deployment descriptor, that list *replaces* the list configured      -->
  <!-- here, so be sure to include any of the default values that you wish  -->
  <!-- to use within your application.                                       -->

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
   <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

所以這裡一共有四個優先順序:

精確》路徑》字尾》default。字尾內部又分為兩個優先順序。其次搞清楚各自的格式。

只要搞清楚了優先順序,那麼/*和/的區別不是很簡單嗎。