Servlet原理
1. Servlet运行原理
2. Mapping问题
1. 一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2. 一个Servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
......
3. 一个Servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
4. 一个Servlet可以指定后缀或前缀映射路径
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>*.yg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/yg*</url-pattern>
</servlet-mapping>
指定后缀时,前面不能有斜杠
5. 优先级问题
如果指定了固定的路径映射,它的优先级会高于通配的路径映射。
严格来讲会根据"精确优先"进行匹配:
- 路径模式包含的路径变量越少、通配符越少,SpringMVC认为它越精确。例如
/hotels/{hotel}/*
只包含一个路径变量和一个通配符,它会被认为比/hotels/{hotel}/**
更精确,因为后者包含一个路径变量和两个通配符- 如果两个路径模式包含的路径变量和通配符数量相同,长度更长的路径模式会被认为更精确。例如
/foo/bar*
和foo/*
两个路径模式都只包含一个通配符,但/foo/bar/*
更长,因此它会被认为更精确- 当两个路径模式包含的路径变量和通配符总数相同时,通配符较少的路径模式会被认为更精确。例如
/hotels/{hotel}
和/hotels/*
都只包含一个路径变量和通配符,但是前者只包含路径变量,没有包含通配符,因此他被认为更精确此外,还有以下的匹配规则:
/**
路径模式几乎可以匹配任何请求地址,因此其它任何路径模式都比它更精确。例如.api/{a}/{b}/{c}
虽然包含三个路径变量,但是依然比/**
更精确。
乎可以匹配任何请求地址,因此其它任何路径模式都比它更精确。例如.api/{a}/{b}/{c}
虽然包含三个路径变量,但是依然比/**
更精确。/public/**
几乎可以匹配/public/
路径下的任何请求地址,因此任何不包含**
通配符的路径模式都比它更精确。例如/public/{a}/{b}/{c}
虽然包含了三个路径变量,但它依然比前者更精确。