文章目录

  • 概述
  • 静态资源映射问题
  • 路径匹配问题

概述

今天把一个尘封已久的项目拿出来跑发现访问其中一个静态页面的时候显示如下错误:

先开始我想的是不是路径写错了,但是经过排查发现不是。然后查了一堆资料也没有解决。最后发现是静态资源映射的代码被我注释掉了,直接裂开:

接下来就说说这种问题的两种解决思路:

  • 静态资源映射导致的问题
  • 路径匹配不上导致的问题

静态资源映射问题

首先我们知道Tomcat在运行SpringMVC的web项目时,存在着以下几个步骤:

也就是根web上下文,MVC上下文,初始化DispatcherServlet,初始化Servlet的bean

我这里没有使用MVC上下文,直接使用的spring根上下文所以没有显示

而DispatcherServlet负责总的调度,我们一般会让Dispatcher拦截所有请求:

@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}

也就是说这个时候所有的项目请求都会被交给SpringMVC处理。但是我们如果要访问静态资源,同样也会被拦截。

所以这个时候我们要配置静态资源映射,让我们能顺利访问。

代码如下:

@Configurationpublic class SpringMVCSupport extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");}}
  • addResourceHandler添加访问路径
  • addResourceLocation添加映射后的真实路径
  • 映射的真实路径末尾必须加/,不然映射不到适用于 windows和linux

路径匹配问题

有的时候可能是路径问题:

如果实在是弄不懂文件的路径,我们可以对照着文件夹写,例如我们找到项目编译之后的target文件夹在里面我们可以看到一个和项目同名的文件夹:

这个文件夹就是当前项目在tomcat或者其他服务器上运行时的文件夹结构,我们对照着写就可以了。

然后还要注意静态资源不能放在WEB-INF文件夹中。因为WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。

如果想在页面中直接访问其中的文件,必须通过 web.xml 文件对要访问的文件进行相应映射才能访问。