BOB(中国)官方入口-BOB官方下载地址

BOB注册首页你的位置:BOB(中国)官方入口-BOB官方下载地址 > BOB注册首页 > BOB注册首页 /和/*的区别记不住?吾的答案保你终身健忘
BOB注册首页 /和/*的区别记不住?吾的答案保你终身健忘

发布日期:2021-10-14 18:48    点击次数:166

  

BOB注册首页

本文转载自微信公多号「BAT的乌托邦」,作者YourBatman。转载本文请有关BAT的乌托邦公多号。

序言

你益,吾是YourBatman。

这次的标题??吹得有点大,倍感压力。不过能够,毕竟吹牛不必上睡,也不作恶。在新闻大爆炸的时代,连技术圈的标题党也不少啦:

BOB注册首页30分钟教你手撸一个ORM框架。其实就一个逆射注脚拼接字符串 5分钟教你玩转Docker。额,5分钟后包就业吗? 玩转亿级流量高并发缓存方案。全国能达这样流量级别的屈指可数,你确定? ... BOB注册首页

吾标榜本身从不标题党,是的这次也不破例。本文将分析/和/*的区别这个老生常谈的题目,望别的博文总是望了忘忘了望,本文迥异的是,关于此题目这一篇文章就够了,它将成为你的长期记忆

本文挑纲

版本约定 BOB注册首页JDK:8 Servlet:4.x tomcat:9.x BOB注册首页正文

什么样的答案终身健忘?门生时代关于记忆频繁能听见两栽论调:

物化记硬背:奏效快,但也忘得快,且清淡不会变通行使

理解性记忆:奏效慢,但记忆持久且会变通行使

倘若是你,你情愿pick哪栽?

正所谓授人以鱼不如授人以渔,后者方能形成长期记忆。不谋而相符,本文将采用后栽讲述手段,帮你记忆持久化。

关于/和/*的区别这个题目,依稀记得2015年吾自学那会就能把它俩搞得明清新白,并且议定理解形成了“长期记忆”,以是至那会其就从异国犯过迷糊,难道吾就这么偏重基础么

点拨“市面上”的舛讹答案

倘若用谷歌百度一下关键字:/和/*的区别,搜索出的答案不客气的说,基本全错!!!舛讹的姿势基本还一模相通,因为你懂的。

各栽舛讹case,且听吾娓娓道。收集了下有如下4栽主流答案,逐一点拨。

环境表明:行使原生Servlet,war包手段安放至外置Tomcat行为服务器,端口号8080,context-path为:appcontext

1、/用于Servlet,/*用于Filter

逆例:

@WebFilter;     } } 

启行服务器,涉猎器访问:http://localhost:8080/appcontext/api/demo1,限制台输出:

FakeServlet收到乞求:/appcontext/api/demo1 

清淡讲/实在用于Servlet,/*用于Filter,但并不代外这是准确的。

表明:Filter路径模式行使/无效

2、/不会匹配.jsp乞求,而/*能够匹配到.jsp乞求

这个结论外观上望异国题目,但是去深了想一步,是否能够推导出这个结论:“/不会匹配.html乞求,而/*能够匹配到.html乞求”。试试望:

@WebServlet;     } } 

启行服务器,涉猎器访问: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个结论搜索排名特意靠前,不知误导了多少幼良朋呀。与其每次将信将疑,倒不如花点时间写代码本身做个试验得靠谱。吾一向爱戴的代码多脱手BOB注册首页,随声赞许不如本身上一发。

带着这几个?结论,接下最先发大招啦:从根本上带你理解Servlet规范的URL匹配机制,从而理解到/和/*的区别,授之以渔让你终身健忘。

Servlet的urlPatterns路径映射

表明:本文所指的Servlet是广义的,以是也包含Filter的urlPatterns

Servlet/Filter是服务端的一段幼程序,用于处理Http乞求。每个Servlet能够映射1个or多个路径,在xml时代这么写:

<servlet-mapping>  <servlet-name>Demo1Servlet</servlet-name>  <url-pattern>/api/demo1</url-pattern>  <url-pattern>/api/demo2</url-pattern> </servlet-mapping> 
BOB注册首页

@WebServlet注脚手段这么写:

@WebServlet public class Demo1Servlet extends HttpServlet { ... } 

此时,该Servlet就能处理这两栽URL了。

题目了,倘若期待本Servlet处理某一类乞求,该怎么破呢?

一类乞求隐微是无法逐一枚举出的,这时就必要用到Servlet的模式匹配了。urlPatterns除了写字面量的字符串,还声援pattern模式的字符串。

接下聚焦于Servlet的匹配手段睁开详细讲解,这是本文的核心内容。

Servlet四栽匹配手段

在Servlet规范中统统约定了四栽匹配手段,无一破例,每栽手段都特意主要和常用,下面逐一介绍。

1.准确匹配

顾名思义,BOB注册首页urlPatterns是个无通配符的准确字符串如:

@WebServlet;     } } 

打印里输出servletPath和pathInfo新闻让日志更具对比性

涉猎器访问http://localhost:8080/appcontext/api/demo1和/api/demo2均能收到该乞求限制台别离打印:

收到乞求:/appcontext/api/demo1 ServletPath:/api/demo1 PathInfo:null 收到乞求:/appcontext/api/demo2 ServletPath:/api/demo2 PathInfo:null 

2.路径匹配

pattern规则:以/起头且以/*末了。如:

@WebServlet throws ServletException IOException {      // 同上     } } 

涉猎器访问http://localhost:8080/appcontext/api/demo1限制台输出:

收到乞求:/appcontext/api/demo1 ServletPath:/api PathInfo:/demo1 

访问http://localhost:8080/appcontext/apiapi/demo1限制台输出(匹配的/*:

收到乞求:/appcontext/apiapi/demo1 ServletPath: PathInfo:/apiapi/demo1 

关注点:当匹配上/*模式时ServletPath的值为空串但PathInfo的值更为“雄厚”了。

3.后缀名匹配

patten规则:以*.起头。如:

@WebServlet throws ServletException IOException {      // 同上     } } 

访问http://localhost:8080/appcontext/api/demo1效果404由于异国后缀嘛;访问http://localhost:8080/appcontext/api/demo1.jsp限制台输出:

收到乞求:/appcontext/api/demo1.jsp ServletPath:/api/demo1.jsp PathInfo:null 

访问http://localhost:8080/appcontext/api/demo1.servlet效果404由于urlPatterns里异国匹配.servlet后缀的模式;访问http://localhost:8080/appcontext/api/demo1.效果404因为同上访问http://localhost:8080/appcontext/api/demo1.*限制台打印:

收到乞求:/appcontext/api/demo1.* ServletPath:/api/demo1.* PathInfo:null 

发现没这栽匹配手段还蛮“稀奇”的必要仔细这两点:

该模式以*.起头后面的均是常量即使是*也是常量。比如*.*匹配的后缀必须是.*而不克是其它

该匹配手段下pathInfo永久是nullservletPath永久是“通盘”

4.缺省匹配

pattern规则:固定值/。如:

想一想这不就是吾们熟识的DispatcherServlet的匹配路径么?

@WebServlet throws ServletException IOException {      // 同上     } } 

这个时候匹配肆意路径。

访问http://localhost:8080/appcontext限制台打印:

收到乞求:/appcontext/ ServletPath:/ PathInfo:null 

访问http://localhost:8080/appcontext/api/demo1限制台打印:

收到乞求:/appcontext/api/demo1 ServletPath:/api/demo1 PathInfo:null 

访问http://localhost:8080/appcontext/api/demo1.html限制台打印:

收到乞求:/appcontext/api/demo1.html ServletPath:/api/demo1.html PathInfo:null 

此匹配规则下pathInfo永久是nullservletPath永久是“通盘”。

关于pathInfo:pathInfo只有当Servlet是路径匹配时才有值。其它情况永久为null

URL匹配仔细事项

Servlet对URL的匹配既不是Ant风格也不是Regex。稀奇符号只有单个的*且行使位置有强收敛切忌想自然的肆意拼集。

举例两栽典型的舛讹理解答该能协助到你:

BOB注册首页/api/*.jsp:该urlPatterns是作恶的启行时会报错“IllegalArgumentException:servlet映射中的[/api/*.jsp]无效”。缘故于: BOB注册首页若当路径匹配/*后面不克再有任何东西 若当后缀名匹配*.必须是最前线 BOB注册首页 /api/*/demo:这个urlPatterns是相符法的。只不过它属于准确匹配也就是说别望它中间有*照样有且仅能匹配/api/*/demo这个乞求路径 BOB注册首页匹配挨次

未必候一个URL会被多个urlPatterns所匹配这时谁优先呢?

Servlet同样按照“国际通例”:越准确越优先越暧昧越靠后。站在pattern模式的角度换句话讲就是:周围越幼越优先周围越大越靠后。

因此Servlet四栽匹配手段挨次按周围从幼到大排序为:准确匹配>路径匹配>后缀名匹配>缺省匹配。

/和/*的区别

终于到了今天的主菜。

从上至下的涉猎到这边再望这个题目是不是觉得答案已经浮出水面?那么末了吾照样总结一下它俩的异同点:

相通点

绝大片面场景下具有相通的外现:匹配一切。

迥异点

就是由于它们的相通点以是才让吾们难以区分。

关于/:

BOB注册首页servlet中稀奇的匹配模式 由于是缺省匹配代外匹配一切路径以是只能够存在一个实例 优先级最矮内建的DefaultServlet BOB注册首页

关于/*:

BOB注册首页属于4中匹配模式中的路径匹配可用于Servlet和Filter 优先级很高。以是它会遮盖一切的后缀名匹配从而很容易引首404题目以是这栽模式的“迫害性”是特意强的清淡有且仅用在Filter上 BOB注册首页DispatcherServlet不阻截.jsp乞求根因分析

/只能用于Servlet上/*清淡只用于Filter上。

行家熟识的SpringMVC的DispatcherServlet的匹配路径默认就是/它会阻截各栽各样的乞求诸如下面这栽乞求都会阻截:

BOB注册首页/api/demo1 /html/demo1.html /static/main.js BOB注册首页

但是它不会阻截/api/demo1.jsp这栽以.jsp末了的乞求。据此形象就展现了:/不拦.jsp乞求而/*阻截这栽“舛讹”言论。

下面通知你此形象的根因:Servlet容器内置有特意匹配.jsp这栽乞求的Servlet处理器如下图所示:

而后缀名匹配优先级高于缺省匹配以是.jsp末了的乞求不会被DispatcherServlet所“截胡”而是交给了JspServlet处理。

有了这波分析后就问你是不是就不必物化记答案了?是不是就终身健忘啦?

总结

Servlet的urlPatterns匹配手段是学习JavaWeb的主要一环也是深入理解SpringMVC原理的大门毕竟SpringMVC照样是做营业开发的首选而且还会不息很久、很久。

本文对Servlet的匹配手段做了全遮盖讲解包括:

BOB注册首页四栽匹配手段 匹配挨次 Servlet和Filter匹配的区别 模式匹配中/和/*区别的根本因为 BOB注册首页

议定本文期待能让你不再被Servlet的模式匹配所困扰更不要被一些似可非可的结论所疑心摇曳不准时大不了码验证一下嘛。

本文议定授人以渔的手段道出/和/*的区别憧憬能成为你的长期记忆BOB注册首页吾做到了吗?

BOB注册首页

Powered by BOB(中国)官方入口-BOB官方下载地址 @2013-2021 RSS地图 HTML地图