当前位置:首页 > 问答 > 正文

/和/到底有啥区别?我这方法一说你肯定记得牢,绝不忘!

把你的Web服务器想象成一家大公司前台。

  • 你的Web应用(比如一个叫“myApp”的项目):就是公司里的一个部门,销售部”。
  • Servlet(或者Spring MVC的DispatcherServlet):就是这个部门的话事人,张总,所有找这个部门办事的请求,理论上都应该先经过他。
  • URL路径(/user/login, /product/detail:就是具体要找张总办的业务,申请报价”、“查询订单”。
  • URL后缀(.jsp, .html, .css:就是文件的类型,合同文件(.pdf)”、“宣传图片(.jpg)”。

我们来聊聊“/”和“/*”这两个配置,就像是给前台小姐下达的两套完全不同的指令。


*第一种情况:映射为 `/` (星号模式)**

前台指令: “听着,所有要来找我们‘销售部’的人,不管他手里拿的是啥、嘴里说的是啥,你好’的,都统统先给我带到张总那儿去!一个都不许漏!”

具体表现: 当你在web.xml里这么写时:

<url-pattern>/*</url-pattern>

这意味着:任何以你的Web应用上下文路径(/myApp)开头的请求,无论是:

  • /myApp/user/login (正经的业务请求)
  • /myApp/index.html (一个静态页面)
  • /myApp/css/style.css (一个样式表文件)
  • /myApp/hello.jsp (一个JSP页面)
  • 甚至是 /myApp/ 或者 /myApp(根路径)

全部!无一例外! 都会被拦截下来,扔给你的那个核心Servlet(张总)处理。

/和/到底有啥区别?我这方法一说你肯定记得牢,绝不忘!

会有什么后果?(坑在哪里?)

  1. 张总累瘫了:张总本来是处理业务逻辑的,现在连有人要张宣传图片(.jpg)、要个样式文件(.css)这种小事都得他亲自过问,他根本处理不了这些静态文件,结果就是直接给客户返回一个404错误或者500错误,你会发现你的网站图片全挂了,样式全乱了,因为浏览器请求不到这些静态资源。
  2. JSP页面失效:更麻烦的是,如果有人直接访问 /myApp/hello.jsp,这个请求也会被张总截胡,张总不认识.jsp啊,他没法把JSP编译成页面显示给用户,又会报错,这就导致你无法直接通过链接访问JSP页面。

*`/是个非常“霸道”的配置,它像一张密不透风的大网,捞起所有请求,包括那些它本不该处理的静态资源。** 这通常只在你要用Servlet实现全站统一的特殊过滤(比如超级严格的权限校验)时才会考虑,在Spring MVC等现代框架中,**几乎永远不会**给你的主DispatcherServlet配成/*`。


第二种情况:映射为 (默认或缺省模式)

前台指令: “听着,所有要来找我们‘销售部’的业务请求,都先带到张总那儿,如果人家明确说了是来取‘合同文件’(.pdf)或者‘宣传图片’(.jpg)的,你就直接带他去档案室或宣传架拿,别麻烦张总了。”

具体表现: 当你在web.xml里这么写时(这也是Spring MVC的推荐配置):

/和/到底有啥区别?我这方法一说你肯定记得牢,绝不忘!

<url-pattern>/</url-pattern>

这意味着:它会拦截所有没有被其他Servlet明确声明的请求。

它是如何工作的?(聪明之处)

  1. 拦截“业务请求”:对于像 /myApp/user/login/myApp/product/detail 这样的路径,因为没有哪个Servlet专门声明“我负责处理 /user/login”,所以它们全都会被这个“/”映射捕获,交给张总(DispatcherServlet)处理,完美!
  2. 放行“静态资源”:对于像 /myApp/index.html/myApp/css/style.css 这样的请求,Web容器(比如Tomcat)自己有一个叫DefaultServlet的默认服务员,这个服务员早就声明了它负责处理诸如 *.html*.css*.js*.jpg 这样的文件,因为 DefaultServlet 的映射路径( 或者更具体的后缀映射)比你的“/”更具体或优先级更高,所以容器会优先把这些静态资源请求交给 DefaultServlet 处理,让它直接从硬盘上读取文件并返回给浏览器,你的张总(DispatcherServlet)根本看不到这些请求,乐得清闲。

是个“补漏”的角色。 它的逻辑是:“凡是没人认领的请求,都归我管。” 这就巧妙地避免了拦截静态资源的问题,让专业的“人”做专业的事。


让你永生难忘的方法

你就记住这两句话:

  • *配成 `/`:相当于在公司门口大喊一声:“关门!放张总!**” 所有活物,格杀勿论,结果就是静态资源全死,网站面目全非。
  • 配成 :相当于张总稳坐办公室,只处理需要他亲自决策的重要业务,那些领个文件、看个图片的杂事,由公司的默认流程(DefaultServlet)去办,井井有条,一切正常。

下次再配置Spring MVC或者类似框架时,脑子里浮现出这个“公司前台”的场景,你就绝对不会再选错了,99.9%的情况下,你都应该用 ,而不是 ,这个方法是不是特别形象,想忘都难?