理论---<url pattern> 匹配规则

开始:


在web应用部署描述符中,用于映射的语法规定如下:

①以"/"字符开头,并以"/*"结尾的字符串用于路径映射

②以"*"开头的字符串被用于扩展名映射

③空字符串("")(?"" 和"  "相等吗 ?)是用于指定精确映射应用程序 context root 的URL 模式,比如从 http://host:port/<contextroot>/来的请求。

④字符串中仅有"/"字符时,表示应用程序"默认"的servlet。

在这种情况下servlet路径是请求url去掉context路径,

⑤其他的字符串仅用于精确匹配


<url-pattern>的三种写法

1.精确匹配。以"/"开头,加上servlet名称

    ◇/desc

2.路径匹配。以"/"开头,加上通配符"*"。

    ◇/*

3.扩展名匹配。以通配符"*"开头,加上扩展名

    ◇*。action                                                                                                                                                                 





在利用servlet或filter进行url请求的匹配时,

很关键的一点是匹配规则,

但是servlet容器中的匹配规则既不是简单的通配

也不是正则表达式

而是有自己的规则

比较容易混淆



●绝对路径和相对路径




当浏览器发起一个url请求后,该请求发送到servlet容器的时候,

容器会先将请求的url减去当前应用上下文的路径作为servlet的映射url,

比如url是

http://localhost:8080/myapp/demo/detail.jsp

其应用上下文是myapp,容器会将http://localhost:8080/myapp去掉,剩下的/demo/detail.html部分拿来做servlet的映射匹配


这个映射过程是有优先顺序的(具体的优先顺序规则后面介绍)

而且当有一个servelt匹配成功以后,就不会去理会剩下的servlet了


Filter的匹配规则和servlet一样,但对于filter,不会像servlet那样只匹配一个servlet

因为fileter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter

Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同




下面介绍各种匹配规则


一.精确匹配

<url-pattern>中的配置的项必须与url完全精确匹配

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/kata/detail.html</url-pattern>
    <url-pattern>/demo.html</url-pattern>
    <url-pattern>/table</url-pattern>
</servlet-mapping>
当在浏览器中输入如下几种url时,都会被匹配到该servlet
http://10.43.11.143/myapp/kata/detail.html
http://10.43.11.143/myapp/demo.html
http://10.43.11.143/myapp/table


注意:

http://localhost:8080/myapp/demo/是非法的url,不会被当作

http://localhost:8080/myapp/demo识别


上述url后面跟任意的查询条件,都会被匹配,如

http://localhost:8080/myapp/demo?hello?xxx  这个请求就会被匹配到MyServlet


二.扩展名匹配

匹配规则如下

<servlet-mapping>
	<servlet-name>MyServlet</servlet-name>
	<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
则任何扩展名为 jsp(文件名和路径任意)的url请求都会匹配,

比如下面的url都会被匹配

http://localhost:8080/myapp/demo/demo.jsp

http://localhost:8080/myapp/demo/test.jsp


三.路径匹配

如果匹配规则如下

<servlet-mapping>
	<servlet-name>MyServlet</servlet-name>
	<url-pattern>/demo/*</url-pattern>
</servlet-mapping>

则请求的url只要前面(myapp之后)的路径是/demo,而后面的路径可以任意

比如下面的url都会被匹配

http://localhost:8080/myapp/demo/demo.html

http://localhost:8080/myapp/demo/test.jsp

http://localhost:8080/myapp/demo/test/detail.html

http://localhost:8080/myapp/demo/action

http://localhost:8080/myapp/demo/action/


注意:路径和扩展名匹配无法通时设置,比如下面的三个<url-pattern>都是非法的,如果设置,启动tomcat服务器会报错


四,匹配任意的url

如果<url-pattern>配置成如下两种的任意一种

<url-pattern>/</url-pattern>
<url-pattern>/*</url-pattern>
则所有的url都可以被匹配上。其中/*是路径匹配,只是路径就是/。


五,优先顺序:

当一个url与多个servlet的匹配规则可以匹配时,则按照"精确路径>最长路径>扩展名"这样的优先级匹配到对应的servlet

举例如下:



总结: 本文介绍了servlet的匹配规则,总的来说就是分为 精确,路径和扩展名三种匹配方式,并且介绍了优先级





 

java web中servlet、jsp、html 互相访问的路径问题。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值