• SpringMVC中静态资源的处理


    web项目中web.xml配置

    在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet

    <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern> <!--注意这里-->
    </servlet-mapping>
    

    这里的url-pattern有两种配置方式

    1. .扩展名,比如.do,古老的方式,不会导致静态资源文件被拦截的问题,但 是不支持RESTful编码风格
    2. /,支持RESTful风格,但是会导致静态资源文件被拦截

    还有一种错误的配置方式

    /*,错误的方式,可以请求到Controller方法,但是跳转到JSP时会被拦截,JSP不能正常显示 XX

    一般来说,企业中更多的是采用第二种配置方式,但这导致了静态资源被拦截


    静态资源为什么会被拦截??

    我们知道,我们的web项目最终要部署到服务器上,以我们熟悉的Tomcat服务器为例进行说明。

    当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:work_folderjava_studyingjava_toolsapache-tomcat-9.0.12confweb.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成 <url-pattern>/</url-pattern>

    会覆盖掉全局web.xml中对于静态资源的处理,具体可以参考全局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>
    
    
        <!-- The mapping for the default servlet -->
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    

    这就是默认的servlet,发现与我们配置的url-pattern一样了,导致静态资源也被我们自定义的dispatcherServlet所拦截,那这个类就会去找controller里面的映射了,比如我们访问http://localhost:8080/springmvc/img.png,显然是Controller里面是没有这个映射路径的。


    如何处理静态资源被拦截

    有三种方式:

    • 方式一:手动排除法

    在我们的web.xml添加如下配置

    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.jpg</url-pattern>
        </servlet-mapping>
    

    其他地方保持不变,这个粒度显然是比<url-pattern>/</url-pattern>更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。

    当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用

    • 方式二:在springmvc的配置文件中加入<mvc:default-servlet-handler/>
    <mvc:default-servlet-handler/>
    
    • 方式三:在springmvc配置文件中手动指定静态资源路径
        <!-- 设置静态资源不过滤 -->
        <mvc:resources location="/css/" mapping="/css/**" />
        <mvc:resources location="/img/" mapping="/img/**" />
        <mvc:resources location="/js/" mapping="/js/**" />
        <mvc:resources location="/plugins/" mapping="/plugins/**" />
    

    ,这种方式更灵活,功能更丰富,也是可以的


    注意 springmvc配置文件中这个配置<mvc:annotation-driven />推荐每次都加
    以上就上springmvc中处理静态资源的三种方式

    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    Java Web之Tomcat
    Java Web之HTML5
    Java 读取propertoes文件
    SQL Server 触发器
    通过关闭 UseDNS和GSSAPIAuthentication选项加速 SSH登录
    数据库创建索引有什么优点和缺点
    修改查看MYSQL字符集(charset)
    MySQL 数据类型
    远程连接mysql数据库提示:ERROR 1130的解决办法
    怎么快速了解自己的MySQL服务器?
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11405986.html
Copyright © 2020-2023  润新知