互联网技术 / 互联网资讯 · 2024年1月15日

记不住/和/*的区别?我的答案让你终身难忘

前言

你好,我是YouRBATMan。

这次的标题吹得有点大,倍感压力。不过没关系,毕竟吹牛不用上睡,也不犯法。在信息大爆炸的时代,连技术圈的标题党也不少啦:

30分钟教你手撸一个ORM框架。其实就一个反射注解拼接字符串 5分钟教你玩转DockeR。额,5分钟后包就业吗? 玩转亿级流量高并发缓存方案。全国(乃至全球)能达如此流量级别的屈指可数,你确定? …

我标榜自己从不标题党,是的这次也不例外。本文将分析和的区别这个老生常谈的问题,看别的博文总是看了忘忘了看,本文不同的是,关于此问题这一篇文章就够了,它将成为你的永久记忆(一不小心又吹牛了)

本文提纲

版本约定 JDK:8 SeRvlet:4.x toMcat:9.x 正文

什么样的答案终身难忘?学生时代关于记忆经常能听见两种论调:

死记硬背:见效快,但也忘得快,且一般不会灵活运用(指标不治本)

理解性记忆:见效慢,但记忆持久且会灵活运用(治标又治本)

如果是你,你愿意pick哪种?

正所谓授人以鱼不如授人以渔,后者方能形成永久记忆。不谋而合,本文将采用后种讲述方式,帮你记忆持久化。

关于和的区别这个问题,依稀记得2015年我自学那会就能把它俩搞得明明白白,并且通过理解形成了永久记忆,所以至那会其就从来没有犯过迷糊,难道我就这么重视基础么(Md,又在吹牛。。。)

点拨市面上的错误答案

如果用谷歌百度一下关键字:和的区别,搜索出来的答案不客气的说,基本全错!!! 错误的姿势基本还一模一样,原因你懂的。

各种错误case,且听我娓娓道来。搜集了下有如下4种主流答案,一一点拨。

环境说明:使用原生SeRvlet,waR包方式部署至外置ToMcat作为服务器,端口号8080,context-path为:apPContext

1、/用于SeRvlet,/*用于FilteR

反例:

启动服务器,浏览器访问:http://localhost:8080/apPContext/API/DEMO1,控制台输出:

FAkeSeRvlet收到请求:/apPContext/API/DEMO1

一般来讲/确实用于SeRvlet,/*用于FilteR,但并不代表这是正确的。

说明:FilteR路径模式使用/无效

2、/不会匹配.jsp请求,而/*可以匹配到.jsp请求

这个结论表面上看没有问题,但是往深了想一步,是否能够推导出这个结论:/不会匹配.htMl请求,而/*可以匹配到.htMl请求。试试看:

启动服务器,浏览器访问:http://localhost:8080/apPContext/API/DEMO1.jsp,控制台输出:

FAkeFilteR收到请求:/apPContext/API/DEMO1.jsp

seRvlet并未匹配上,似乎符合此结论:/不会匹配.jsp请求,而/*可以。

浏览器再访问:http://localhost:8080/apPContext/API/DEMO1.htMl,控制台输出:

FAkeFilteR收到请求:/apPContext/API/DEMO1.htMl FAkeSeRvlet收到请求:/apPContext/API/DEMO1.htMl

FilteR和SeRvlet都匹配成功,破功了吧!

所以说,局限于该回答本身没有问题,而问题在于.jsp后缀是一种特殊的请求,拿特殊案例当做通用结论肯定是站不住脚的。

3、/*匹配范围比/大

通过本文下面的讲解你就会知道:/属于最大的的匹配范围,而/*恰好是范围和/一样了而已,但/*的优先级比/高,并不是它的匹配范围比大。

4、/匹配所有uRl(路径+后缀),/*只匹配路径型

用一句话反驳:/*也能匹配上/API/DEMO1.htMl这种后缀型uRl(其实上面已经给出示例了)

这4个结论搜索排名非常靠前,不知误导了多少小朋友呀。与其每次将信将疑,倒不如花点时间写代码自己做个试验来得靠谱。我一向推崇的代码多动手,人云亦云不如自己来上一发。

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.