SpringMVC静态资源配置

SpringMVC静态资源配置


我是java小白,第一次发博客,写得不好的地方请多指教!!
今天在IDEA新建了一个SpringMVC项目,由于第一次用SpringMVC框架,不太熟悉其中控制器拦截器的机制和IDEA编译器对war_explode包的编译机制,在搭建和配置项目中遇到了静态资源加载失败的问题。

下面描述一下我的问题:
工程名称:xx

在这里插入图片描述
我的工程目录
在这里插入图片描述
web.xml配置
在这里插入图片描述
控制器拦截器配置
在这里插入图片描述
之所以直接在服务器中访问图片,是因为我想检验login.jsp要引用静态图片xiaoyuan.jpg做背景图失败的原因是不是因为访问路径问题。然而发现,无论是相对路径还是绝对路径,图片放web根目录、WEB-INF目录还是我新建的assets子目录下,怎么也访问不了。

通过查阅资料,确定了这应该是SpringMVC控制拦截器的问题,它限定只接收Controller类里有Request Mapping的url,拦截了你诸如“.jpg”、“.css”的Controller控制器里没有的请求,返回404。
网上尝试了在控制器bean配置文件中添加资源映射mvc:resource的方法:

    <resources mapping="/assets/**" location="/assets/" />

在这里插入图片描述mapping:映射
location:本地资源路径,注意必须是webapp根目录下的路径。
两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)
我是用assets文件夹来放静态资源文件,我看到网上一般以“resources”命名

不知是何原因,结果也是不行,访问也是404。甚至影响到其他本来正常url的访问。所以我把这个改回来了。
后来,我还在网上找到一个方法——改web.xml的Servlet配置
在web.xml中加了几个servlet映射来拦截后缀为jpg、js、css的url

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>

        <!--  <url-pattern>*.form</url-pattern>  -->
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>
</web-app>

加了之后再执行,还是访问404。
然后我觉得应该是源文件编译时没有把静态文件加载到Tomcat中?
那我们查查编译后的文件里有没有原工程里的静态资源文件不就可以了吗?以前我用eclipse Tomcat部署应用,编译后的文件在Tomcat的webapp目录里有。但是IDEA的编译部署后的文件是在哪里呢?通过百度查找,原来,IDEA的编译部署机制跟Eclipse略有不同。IDEA一般打包成war_exploded包。顾名思义,这种包打包的底层原理应该跟打war包差不多,但是它打完包之后是个文件夹,因为它为了方便让开发人员看到打包编译后的web结构。而且,这种包默认放在你原工程的output目录中,如果是maven项目的就是target目录。那为什么部署运行后Tomcat的webapp目录(一般编译部署后的项目都自动装配到这个目录)上没有这个war_expoloded包,这个我也搞不清楚,可能是因为IDEA内核里服务器部署的特殊机制?使得项目编译后,不自动加载到Tomcat的webapp目录而是加载到原工程的output目录下,也能部署运行。
回到正题,我看到编译后的文件目录里果然没有原工程的静态资源文件,怎么样弄进去呢?从原工程里把图片.jpg复制粘贴到output里?其实是可以的,因为war_exploded是个可操作的目录。但是这样每次增加新的静态资源文件都要复制一遍很麻烦。所以必须得配置一下。但是我对IDEA的编译配置并不熟悉,于是我看了这篇博文https://www.cnblogs.com/JMLiu/p/6020959.html
才略懂一点编译配置。
(如果看完上面链接那条博文,再看后面可能更好理解一些哈哈)
我大概找到了编译后output中没有自动装配源文件的静态资源文件的原因。是因为下图这些没有设置:
在这里插入图片描述
在这里插入图片描述
于是,你就可以看到artifacts中有xx项目的resources了:
在这里插入图片描述
然后测试编译了一下,访问也是404。
后来捣鼓摸索了很久,都失败了。直到有一次我尝试xiaoyuan.jpg放到跟index.jsp同级的根目录下,然后访问,居然成功了。
就是说:静态资源文件不要放在WEB-INF目录下
我原本的错误的文件目录结构
在这里插入图片描述
访问目录 localhost:8181/xx/WEB-INF/assets/image/xiaoyuan.jpg
出现404
正确的文件目录结构应该是:
在这里插入图片描述
正确的访问目录是:localhost:8181/xx/assets/image/xiaoyuan.jpg
不过按理来说,如果资源文件放外面,xx/assets/image/xiaoyuan.jpg能访问,为什么资源文件放里面,xx/WEB-INF/assets/image/xiaoyuan.jpg不能访问了呢?难道URL有长度限制??这个问题后来也没管了,没深究下去了。
总之,静态资源文件不要放在WEB-INF目录下就好了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值