/和/*的区别记不住?我的答案保你终身难忘
前言
你好,我是YourBatman。
这次的标题??吹得有点大,倍感压力。不过没关系,毕竟吹牛不用上睡,也不犯法。在信息大爆炸的时代,连技术圈的标题党也不少啦
30分钟教你手撸一个ORM框架。其实就一个反射注解拼接字符串 5分钟教你玩转Docker。额,5分钟后包就业吗? 玩转亿级流量高并发缓存方案。全国(乃至全球)能达如此流量级别的屈指可数,你确定? ...
我标榜自己从不标题党,是的这次也不例外。本文将分析/和/的区别这个老生常谈的问题,看别的博文总是看了忘忘了看,本文不同的是,关于此问题这一篇文章就够了,它将成为你的永久记忆(一不小心又吹牛了??)
本文提纲
版本约定 JDK8 Servlet4.x tomcat9.x 正文
什么样的答案终身难忘?学生时代关于记忆经常能听见两种论调
死记硬背见效快,但也忘得快,且一般不会灵活运用(指标不治本)
理解性记忆见效慢,但记忆持久且会灵活运用(治标又治本)
如果是你,你愿意pick哪种?
正所谓授人以鱼不如授人以渔,后者方能形成永久记忆。不谋而合,本文将采用后种讲述方式,帮你记忆持久化。
关于/和/的区别这个问题,依稀记得2015年我自学那会就能把它俩搞得明明白白,并且通过理解形成了“永久记忆”,所以至那会其就从来没有犯过迷糊,难道我就这么重视基础么(md,又在吹牛。。。)
点拨“市面上”的错误答案
如果用谷歌百度一下关键字/和/的区别,搜索出来的答案不客气的说,基本全错!!! 错误的姿势基本还一模一样,原因你懂的。
各种错误case,且听我娓娓道来。搜集了下有如下4种主流答案,一一点拨。
环境说明使用原生Servlet,ar包方式部署至外置Tomcat作为服务器,端口号8080,context-path为appcontext
1、/用于Servlet,/用于Filter
反例
@WebFilter(urlPatterns = {"/"}) public class FakeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) thros ServletException, IOException { System.out.println("FakeServlet收到请求" + req.getRequestURI()); } }
启动服务器,浏览器访问http://localhost:8080/appcontext/api/demo1,控制台输出
FakeServlet收到请求/appcontext/api/demo1
一般来讲/确实用于Servlet,/用于Filter,但并不代表这是正确的。
说明Filter路径模式使用/无效
2、/不会匹配.jsp请求,而/可以匹配到.jsp请求
这个结论表面上看没有问题,往深了想一步,是否能够推导出这个结论“/不会匹配.html请求,而/可以匹配到.html请求”。试试看
@WebServlet(urlPatterns = {"/"}) public class FakeServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) thros ServletException, IOException { System.out.println("FakeServlet收到请求" + req.getRequestURI()); } } @WebFilter(urlPatterns = {"/"}) public class FakeFilter extends HttpFilter { @Override protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) thros IOException, ServletException { System.out.println("FakeFilter收到请求" + req.getRequestURI()); super.doFilter(req, res, chain); } }
启动服务器,浏览器访问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个结论搜索排名非常靠前,不知误导了多少小朋友呀。与其每次将信将疑,倒不如花点时间写代码自己做个试验来得靠谱。我一向推崇的代码多动手,人云亦云不如自己来上一发。
人工智能培训
- 真正能和人交流的机器人什么时候实现
- 国产机器人成功完成首例远程冠脉介入手术
- 人工智能与第四次工业革命
- 未来30年的AI和物联网
- 新三板创新层公司东方水利新增专利授权:“一
- 发展人工智能是让人和机器更好地合作
- 新春贺喜! 经开区持续推进工业互联网平台建设
- 以工业机器人为桥 传统企业如何趟过智造这条河
- 山立滤芯SAGL-1HH SAGL-2HH
- 2015国际智能星创师大赛火热报名中!
- 未来机器人会咋看人类?递归神经网络之父-像蚂
- 成都新川人工智能创新中心二期主体结构封顶
- 斯坦德机器人完成数亿元人民币C轮融资,小米产
- 到2020年,智能手机将拥有十项AI功能,有些可能
- 寻找AI机器人的增长“跳板”:老龄化为支点的产
- 力升高科耐高温消防机器人参加某支队性能测试