• SpringMVC集成静态资源


    集成静态资源

    静态资源&jsp是被谁处理的

    tomcat是一个servlet容器,servlet容器中通常有servlet来处理各种请求,那么当访问静态资源或者jsp的时候,当然也是有servlet来处理这些请求的,但是并未在web.xml中配置哪个servlet来处理这些请求,是因为tomcat中自动配置了一些默认的servlet来处理这类的请求

    tomcat的安装目录中有个web.xml文件,apache-tomcat-8.5.82\conf\web.xml,这个文件相当于对发布到tomcat中的所有web项目的默认配置,

        <servlet>
            <servlet-name>defaultservlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
            <init-param>
                <param-name>debugparam-name>
                <param-value>0param-value>
            init-param>
            <init-param>
                <param-name>listingsparam-name>
                <param-value>falseparam-value>
            init-param>
            <load-on-startup>1load-on-startup>
        servlet>
    
     <servlet>
            <servlet-name>jspservlet-name>
            <servlet-class>org.apache.jasper.servlet.JspServletservlet-class>
            <init-param>
                <param-name>forkparam-name>
                <param-value>falseparam-value>
            init-param>
            <init-param>
                <param-name>xpoweredByparam-name>
                <param-value>falseparam-value>
            init-param>
            <load-on-startup>3load-on-startup>
        servlet>
    
    <servlet-mapping>
        <servlet-name>defaultservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>
    
    
    <servlet-mapping>
        <servlet-name>jspservlet-name>
        <url-pattern>*.jspurl-pattern>
        <url-pattern>*.jspxurl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    配置中主要定义了2个servlet

    1. JspServlet用来处理jsp文件
    2. DefaultServlet会处理/开头的请求,它会处理所有其他servlet不匹配的请求,当一个请求过来之后,会先去匹配其他的servlet,当找不到匹配的servlet的时候,才会走DefaultServlet
    3. 可以在项目中的web.xml中对tomcat/config/web.xml中的配置进行覆盖,即项目中的web.xml相对于tomcat中的web.xml有更高的优先级

    如何让SpringMVC处理所有的请求

    如果想让SpringMVC来处理所有的请求,只需要修改web.xml中的配置,将springmvc这个servlet的url-pattern的值设置为*/*就可以了,此时所有的请求都会被SpringMVC处理,即所有的请求都会被DispatcherServlet处理

    在这里插入图片描述

    SpringMVC如何处理静态资源

    当我们将上面的SpringMVC的url-pattern改为/时,此时在访问静态资源的时候,会报404,这请求被DispatcherServlet接收了,但时这个Servlet默认情况下并没有处理静态资源的能力,即找不到资源,所有才会报404
    在这里插入图片描述

    SpringMVC处理静态资源的2中方法,区别,原理详细

    方案1:使用mvc:default-servletHandler/

    在SpringMVC的配置文件中添加配置

    <mvc:annotation-driven/>
    <mvc:default-servlet-handler/>
    
    • 1
    • 2

    在这里插入图片描述

    原理:

    1. 加入< mvc:default-servlet-handler/>配置后,框架会创建DefaultServletHttpRequestHandler对象,这个对象会将请求转发给tomcat的default这个servlet处理,所以静态资源就可以访问了
    2. 配置中的第一行< mvc:annotation-driven/>也必须加上,如果不加,@RequestMapping的请求就无法处理了
    3. 这个用法的前提时,web容器中需要有default这个servlet,且servlet可以处理静态资源
    方案二:使用mvc:resources

    从Spring3.0版本后,spring定义了专门处理静态资源访问请求的处理器,ResourceHttpRequestHandler,并且添加了mvc:resources/标签来处理静态资源无法访问的问题

    需要在SpringMVC配置文件中添加如下配置

    
    <mvc:annotation-driven/>
    <mvc:resources mapping="/updateFile/**" location="/updateFile/"/>
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/jsp/**" location="/jsp/"/>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • mvc:resource:标签用来指定请求的静态资源的url和本地地址的映射关系
    • mapping:用来指定请求的地址的比如/updateFile/**,可以匹配任何的以updateFile开头的url,比如/updateFile/1.jgp
    • location:用来指定静态资源所在项目中的目录
    • 配置中的第一行必须加上,如果不加,@RequestMapping的请求就无法处理
    • 这种用法不依赖于web容器,所以比第一种方案要好一下,

  • 相关阅读:
    【Mysql】主从一致
    这4款浏览器必装插件,让浏览器使用体验上升100%
    ThreadLocal 原理
    网络标准之:永远是1.0版本的MIME
    答疑(蓝桥杯)
    【mindspore】【算子执行】执行Exception
    小目标检测:基于切图检测的yolov5小目标检测
    STM32单片机—定时器产生PWM波
    343. 整数拆分 96.不同的二叉搜索树
    Verilog 函数
  • 原文地址:https://blog.csdn.net/qq_44715376/article/details/127950250