servlet-mapping中的url-pattern的理解

本文详细解析了Servlet中的URL-Pattern映射规则,包括精确匹配、路径匹配、扩展名匹配及默认匹配四种方式,并阐述了每种匹配方式的优先级与使用场景。

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标签的时候,如果以/开头,不会加上应用的上下文,注意奥~ ,得自己加上 “/上下文/请求路径”

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ppt</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.doc</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.docx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xls</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xlsx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.rar</url-pattern> </servlet-mapping> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>wangzhan/index.jsp</welcome-file> </welcome-file-list> </web-app>
09-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值