url-pattern映射的规则
首先,要明白一点,“*”在这里不代表通配符,也不代表表达式,他就是约定好的规则;
那么何为映射,即请求路径url减去当前的应用上下文,剩下的字符串则为映射
为了很好说明下列例子;在此规定应用上下文是:http://127.0.0.1:8080/myapplication
-
精确匹配
精确匹配,就是映射必须和配置的映射是完全相等;
例如我现在请求一个路径是http://127.0.0.1:8080/myapplication/addUser/addAdmin
那么请求的映射则为 /addUser/addAdmin
如此,在servlet-mapping中的配置url-pattern则设置为/addUser/addAdmin即可
注意:优先级最高,且必须url-pattern配置的是和请求过来的等值;
-
路径匹配
路径匹配,就是使用“*”符号来进行路径描述
例如我现在请求的路径是http://127.0.0.1:8080/myapplication/updateUser/updateAdmin
则我的请求映射是**/updateUser/updateAdmin**
假设,我现在配置了两个url-pattern
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> <!-- 匹配 /updateUser/ancd ,/updateUser/a.jsp /updateUser/abc/def/aaa.do 等等 and so on! --> <url-pattern>/updateUser/*</url-pattern> <url-pattern>/updateUser/updateAdmin</url-pattern> </servlet-mapping>
猜想一下会匹配到哪一个?
其实,它只会匹配到第三个映射,因为优先级最高,其他的两个url-pattern都会被忽略(注意:虽然我写的servlet-name是同一个,但是在不同的servlet-name下,道理是一样的)
注意:优先级次高,url-pattern里的后置可以使用,且之后不能再有字符串,否则被当成普通字符处理;*
<servlet-mapping> <servlet-name>hello</servlet-name> <!--正例,只要是/updateUser/开头的 后面可以匹配扩展名(后面会讲),也可以匹配路径--> <url-pattern>/updateUser/*</url-pattern> <!-- 这里当作精确匹配处理了,“*” 只是普通的字符而已 --> <url-pattern>/updateUser/*/updateAdmin</url-pattern> </servlet-mapping>
-
扩展名匹配
扩展名匹配,url-pattern的内容只能是**“*.扩展名”**的形式
<servlet-mapping> <servlet-name>hello</servlet-name> <!-- 非法的例子 --> <url-pattern>/updateUser/*.action</url-pattern> <!-- 合法的例子,且匹配所有*.do的请求 记住是所有的 *.do --> <url-pattern>*.do</url-pattern> </servlet-mapping>
注意:优先级第三,且不能和路径匹配同时存在;
-
默认匹配
最最最低了,实在是找不到匹配的映射了就会以它为准,且只有一个实例
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
注意:优先级最低,只能有一个实例,不要加任何东西,只用 “/” ;
无敌巨坑
使用a标签的时候,如果以/开头,不会加上应用的上下文,注意奥~ ,得自己加上 “/上下文/请求路径”