一、静态资源访问问题
当我们在 JSP 页面中引入 CSS 文件、JS 文件,但是却不能识别,这是为什么呢?
页面中引入资源:
// 引入的文件
<link rel="stylesheet" href="${pageContext.servletContext.contextPath }/css/index_work.css">
<script type="text/javascript" src="${pageContext.servletContext.contextPath }/js/jquery-1.8.2.min.js"></script>
直接从浏览器地址栏访问 jQuery 文件:
http://localhost:8080/js/jquery-1.8.2.min.js
发现 jQuery 库文件不起作用:

控制台报错:

二、分析
为什么会有这样的问题?
优雅的 REST 风格的资源 URL 不希望带 .html 或 .do 等后缀,若将 DispatcherServlet 请求映射配置为 /,则 SpringMVC 将捕获 WEB 容器的所有请求,包括静态资源的请求,而此时 SpringMVC 会将他们当成一个普通的请求处理,因为找不到对应处理器将导致报错。
三、解决方案
步骤一:在 SpringMVC 的配置文件中配置 <mvc:default-servlet-handler />
步骤二:配置上面的标签后,对控制器的请求就不好使了,还需要配置 <mvc:annotation-driver />
SpringMVC 的配置文件:
<!--
配置Tomcat中默认的servlet,DefaultServlet
注意:当DefaultServlet所设置的<url-pattern>的值和开发人员所配置的servlet的<url-pattern>相同,以开发人员所配置的servlet优先
作用:当客户端发送请求,由于DefaultServlet所设置的<url-pattern>的值和开发人员所配置DispatcherServlet的<url-pattern>都是/
因此先通过DispatcherServlet处理请求,找该请求是否有相对应的处理器,有则处理,无则交给DefaultServlet处理
-->
<!-- 默认前端控制器是拦截所有资源(除过jsp),js 文件就404了,要js文件请求是交给Tomcat来处理 -->
<!--告诉SpringMVC,自己映射的请求就自己处理,不能处理的请求直接交给 Tomcat-->
<!--静态资源能访问,动态映射的请求就不行-->
<mvc:default-servlet-handler/>
<!-- mvc驱动 SpringMVC 可以保证动态请求和静态请求都能访问-->
<mvc:annotation-driven />
四、关于 <mvc:default-servlet-handler /> 作用
<mvc:default-servlet-handler />
将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler
(Tomcat 中的默认的 Servlet),它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。
一般 WEB 应用服务器默认的 Servlet 的名称都是 default。
若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显示指定。
参考:CATALINA_HOME/config/web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
该标签属性 default-servlet-name 默认值是 "default",可以省略。
<mvc:default-servlet-handler/>
如果不是,需要指定:
<mvc:default-servlet-handler default-servlet-name="default"/>
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?