Spring MVC访问静态资源总出错?看这里,原理给你讲清楚

之前文章讲到Spring MVC的基础概念,基本开发流程,和如何在Spring MVC中传值接受参数以及Spring MVC的跳转(重定向和转发)

之前文章链接
Spring MVC从0到1,推荐新手收藏(超详细)

这篇文章文章讲Spring MVC访问静态资源

静态资源

  • 静态资源(内容不会改变的资源):HTML,js文件,css文件,图片文件等都是静态资源

  • 或者换一句话说:在所有的客户访问同一页面时,获取到的内容是相同的,不会因为用户的不同而改变

静态文件没有url-pattern,所以默认是访问不到的,之所以可以访问,是因为,tomcat中有一个全局的servlet:org.apache.catalina.servlets,DefaultServlet,它的url-pattern是"/"是全局默认的Servlet.

所以每个项目中不能匹配的静态资源的请求,有这个Servlet来处理

Tomcat中的web.xml中有默认的全局的servlet
image-20200624175845591
image-20200624175854436

那我们直接在Spring MVC中来写html,结果:

令人愤怒的404
image-20200624175503374

image-20200624180230532

这是为什么?

因为我们的项目的web.xml中也配置了一个servlet,且路径也是"/" ,这就导致了原本的tomcat中的全局servlet失效

我们配置的DispatcherServlet
image-20200624181437473

我们配置的DispatcherServlet也采用"/"作为url-pattern,而我们配置的DispatcherServlet是用来拦截控制器的,而不是静态资源

最终导致了静态资源的无法访问

如何解决静态资源无法访问的问题?

解决方案一

既然找到了原因,是因为我们配置了DispatcherServlet而导致静态资源无法访问,那么只能委屈DispatcherServlet另外换一个路径

image-20200624181326859

DispatcherServlet采用其他的url-pattern ,比如: *.action

此时,所有访问handler(也就是控制器中具体的方法)的路径都要以action结尾!

    <!-- 配置前端控制器-->
    <servlet>
        <servlet-name>mvc_leiyu</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 将后端控制器的配置给前端(核心)控制器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc.xml</param-value>
        </init-param>
        <!-- 可选配置 懒汉式加载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc_leiyu</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
该handler的访问路径:http://localhost:8080/data/test1.action
image-20200624181706459

解决方案二

我和DispatcherServlet商量了一下,让它换一个路径访问,它说这样访问太麻烦了,而且凭什么要它改路径,并给我扔过来衣蛾图片让自己体会

image-20200624182153245

既然,商量无果,不愿意改路径还要静态资源正常访问

那么只能追加配置了

    <!-- 解决无法访问静态资源的问题
    额外增加一个handler,且其RequestMapper为"/**"  可以匹配到所有的请求,但是优先级最低
    所以如果其他所有的handler都匹配不上,请求会转向"/**"  ,恰好,这个handler就是处理静态资源的
    处理方式:将请求转会到tomcat中名为dafault的Servlet,让tomcat处理
    -->
    <mvc:default-servlet-handler/>

解决方案三

当争吵不休时,最终还是静态资源让了步,静态资源愿意约束自己,给自己访问时路径发生一点变化

在webapp目录下创建html目录,用来放静态的html资源,其他的静态资源同理

配置

<mvc:resources mapping="/html/**" location="/hhh/" />
  • mapping是访问路径,location是静态资源的存放路径(建议同名,见名知意,为了讲述原理,这里不同名)
  • 将/html/** 中/**匹配到的内容,拼接在/hhh后就是资源的实际的路径
  • http://…/html/a.html 访问的资源时/hhh/a.html
  • http://…/page/b.html 访问的资源时/page/b.html

我是雷雨,一个普本科的学生,主要专注于Java后端和大数据开发

如果这篇文章有帮助到你,希望你给我一个大大的赞
如果有什么问题,希望你能留言和我一起研究,学习靠自觉,分享靠自愿

转载注明出处
https://blog.csdn.net/qq_40742223

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章