转载:servlet的路径匹配规则

Servlet的路径匹配规则

转载出处:link http://www.cnblogs.com/yuanyee

客户端通过URL地址访问服务器(servlet容器)资源,所以servlet若要能对外提供服务,必须要将程序按照java规范将其映射到对应的URL上,映射的规则是需要开发人员在WEB.XML中显示指定,指定的方法如下:

 <servlet>
 	 <!-- Servlet名称 与Servlet-mapping中一致 -->
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 设置spring配置文件路径 -->
    <!-- 如果不设置初始化参数,那么DispatcherServlet会读取默认路径下的配置文件 -->
    <!-- 默认配置文件路径:/WEB-INF/springmvc-servlet.xml -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
    <!-- 指定初始化时机,值为自然数,表示Tomcat启动时,Servlet会跟随着初始化,自然数越小优先级越高-->
    <!-- 如果不指定初始化时机或为负值,Servlet就会在第一次被请求的时候,才会初始化,而且只会被初始化一次 -->
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- URL-PATTERN的设置 -->
    <!-- /* 优先于tomcat中内置的*.jsp路径映射,所以DispatcherServlet会拦截到.jsp的请求但是由于无法处理所以导致不能访问页面,对于静态资源的访问springMVC提供了默认的Handler处理器 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

servlet容器对客户端请求的匹配过程

一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url。如客户端输入http://www.pghty.com/platform/blog/article/index,servlet容器会将
http://www.p
ghty.com/platform减去,剩下platform/blog/article/index与web.xml中设定的匹配规则进行匹配,而这种匹配是按照一定的规则进行的,并且有一个servlet匹配成功后,就不会取匹配其他servlet(注意filter与此不同):
(1)匹配精确路径:以“/”开头,以字母(非”*”)结束,如

<url-pattern>/blog/article/add</url-pattern>

如web.xml中配置如下:

<servlet-mapping>
    <servlet-name>BlogServlet</servlet-name>
    <url-pattern>/blog/article/index.jsp</url-pattern>
    <url-pattern>/blog/article/add</url-pattern>
</servlet-mapping>

则以下路径都会被匹配到该servlet
  http://www.pghty.com/platform/blog/article/index.jsp
  http://www.p
ghty.com/platform/blog/article/add

(2)匹配最长路径:以“/”开头,并以 /* 结尾,如

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

如web.xml中配置如下:

<servlet-mapping>
    <servlet-name>BlogServlet</servlet-name>
    <url-pattern>/blog/article/*</url-pattern>
</servlet-mapping>

则以下路径都会被匹配到该servlet
  http://www.pghty.com/platform/blog/article/index.jsp
  http://www.p
ghty.com/platform/blog/article/add
(3)匹配扩展名:以* 开头,以扩展名结束,如

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

如web.xml中配置如下:

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

则任何扩展名为jsp或do的url请求都会匹配,比如下面的url都会被匹配
  http://www.pghty.com/platform/blog/article/index.jsp
  http://www.p
ghty.com/platform/index.do

(4)匹配默认:“/” 用来表示对应的servlet 为默认的servelet

几个注意点:

(1)http://www.p**ghty.com/platform/blog/article/是非法url

(2)匹配的url后面可以跟任意的查询条件,如:http://www.p**ghty.com/platform/blog/article/add?username=davee

(3)以上四种匹配规则中,(1)(2)(3)不可同时使用,如

<url-pattern>/blog/*.do</url-pattern>

是非法的,但是

<url-pattern>/blog/*/add</url-pattern>

是合法的。

(4)“/*”和“/”含义是不一样的,“/”属于路径匹配,并且可以匹配所有请求,由于路径匹配的优先级仅次于精确匹配,所以“/”会覆盖所有的扩展名匹配,故不推荐使用。“/”是servlet中特殊的匹配模式,优先
级最低(第(4)级),不会覆盖其他任何匹配模式,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有请求。

(5)tomcat在%CATALINA_HOME%\conf\web.xml文件中配置了默认的Servlet,对“/”和“.jsp|.jspx|jsp”这两种匹配规则进行了默认设定,
故开发人员配置“/”后,一种可能的现象是BlogServlet会拦截http://www.pghty.com/platform/blog/article/add.do等格式的请求,但是并不会拦截http://www.pghty.com/platform/blog/article/index.jsp,这是应
为servlet容器有内置默认的“*.jsp”匹配器,而扩展名匹配的优先级高于缺省匹配,所以jsp不被拦截,而servlet会被拦截。

(6)“/*”和“/”均会拦截静态资源请求

上一篇:2021-2-14 MybatisPlus自定义语句传入wrapper为null时错误


下一篇:Power Platform 低代码开发手机App(1)-Power Platform 试用账号注册