SpringMVC中放行静态资源的方式和原理

目录

  • SpringMVC中放行静态资源的方式和原理
  • 1. Servlet的访问路径: url-pattern标签
  • 2. Servlet访问路径的分类
  • 3. DispatcherServlet的访问路径以及静态资源放行

SpringMVC中放行静态资源的方式和原理

1. Servlet的访问路径: url-pattern标签

  • 该标签用来指定servlet的访问路径, 这个路径又被叫做"虚拟路径"或"映射路径", 这个路径必须以"/"开头, 否则服务器启动失败.

  • 一个中能配置多个标签, 这多个路径都映射到同一个Servlet,例如:

        <servlet>
            <servlet-name>BServletservlet-name>
            <servlet-class>cn.king.servlet.BServletservlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>BServletservlet-name>
            <url-pattern>/BServleturl-pattern>
            <url-pattern>/bServleturl-pattern>
            <url-pattern>/bservleturl-pattern>
        servlet-mapping>
    

    我们访问
    http://localhost:8080/webapp/BServlet
    http://localhost:8080/webapp/bServlet
    http://localhost:8080/webapp/bservlet
    访问的都是cn.king.servlet.BServlet.
    由于早期没有过滤器, Servlet就充当了Filter, 因此可以给一个Servlet配置多个url-pattern, 用来拦截多条请求.

2. Servlet访问路径的分类

  • Servlet的访问路径有4种配置方式: 精确匹配, 路径匹配, 扩展名匹配, 缺省匹配.

    
    <url-pattern>/BServleturl-pattern>
    
    
    <url-pattern>/user/*url-pattern>
    
    <url-pattern>/*url-pattern>
    
    
    <url-pattern>*.dourl-pattern>
    
    
    <url-pattern>/url-pattern>
    
  • 注意, 通配符要么为前缀,要么为后缀,不能出现在URL中间位置,也不能只有通配符。例如:"/*.do" 就
    是错误的,因为星号出现在URL的中间位置上了。"."也是不对的.

  • 注意,通配符是一种模糊匹配URL的方式,如果存在更具体的 ,那么访问路径会优先去匹配
    更具体的 例如:

    <servlet>
        <servlet-name>hello1servlet-name>
        <servlet-class>cn.king.servlet.Hello1Servletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>hello1servlet-name>
        <url-pattern>/servlet/hello1url-pattern>
    servlet-mapping>
    
    <servlet>
        <servlet-name>hello2servlet-name>
        <servlet-class>cn.king.servlet.Hello2Servletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>hello2servlet-name>
        <url-pattern>/servlet/*url-pattern>
    servlet-mapping>
    
    
    

3. DispatcherServlet的访问路径以及静态资源放行

  • %tomcat%/conf/web.xml中, 有一个DefaultServlet, 她的配置的就是"/".

    <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-mapping>
    	<servlet-name>defaultservlet-name>
    	<url-pattern>/url-pattern>
    servlet-mapping>
    

    “/“这个访问路径的匹配优先级最低, 用户发送一个请求, 进行精确匹配->路径匹配->后缀名匹配后 如果还没有与之对应的Servlet, 那么就会进行缺省匹配, 就会匹配”/”, 就会执行tomcat的web.xml中配置的这个DefaultServlet. 这个Servlet的作用就是根据用户请求, 读取web项目根目录下的静态资源, 然后将静态资源输出到浏览器, 如果找不到这个静态资源, 就在页面上显示404.

    注意, %tomcat%/conf/web.xml 文件是我们编写的所有web项目的web.xml文件的"父文件", web项目启动, 先读取%tomcat%/conf/web.xml文件, 再读取我们项目中的web.xml文件, 共同作为该web项目的配置. 我们的web.xml中的配置, 可以覆盖%tomcat%/conf/web.xml中的配置.

    那么, 我们自定义的Servlet的如果也设置为"/", 那么就会覆盖DefaultServlet.
    SpringMVC的前端控制器DispatcherServlet就是这样做的! 我们经常将DispatcherServlet的 设置为"/", 由于SpringMVC项目中, 在web.xml中只配置了一个Servlet, 那就是DispatcherServlet, 并且DispatcherServlet的为"/", 因此即便"/“的优先级最低, 所有的请求也都会匹配到”/", 这就保证了所有的请求都会执行DispatcherServlet.

    初学者经常将SpringMVC的前端控制器的DispatcherServlet的访问路径配置为" /* “, 实际上这属于上述说的路径匹配. 如果我们将自定义的Servlet的访问路径配置为” /* “, 那么访问任意路径都能访问到这个Servlet. 但是在DispatcherServlet中, 我们不能将访问路径配置成” /* ", 否则请求"xxx.jsp"不会进入DispatcherServlet.

    在SpringMVC中, 无论是把DispatcherServlet的访问路径配置成" / “还是配置成” /* ", 都会拦截静态资源, 也就是说静态资源(js,img,js,css,mp3…)都会走DispatcherServlet, 我们需要单独配置放行静态资源, 即让用户发送的静态资源请求不走DispatcherServlet. 在SpringMVC中放行静态资源有两种方式, 我们常用的一种是在SpringMVC的配置文件spring-mvc.xml中添加这条配置: . 添加了这条配置后, 会在Spring MVC上下文中定义一个
    org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器(tomcat)默认的Servlet即DefaultServlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

    另外, 在SpringMVC中, 还有一种放行静态资源的方式, 如下:

    
    <mvc:resources mapping="/js/" location="/js/**"/>
    
    <mvc:resources mapping="/css/" location="/css/**"/>
    

    实际上标签的功能比mvc:default-servlet-handler/>标签的功能更强大, 上述的例子只是最基本的用法. (具体参考这位大佬的文章: https://www.cnblogs.com/dflmg/p/6393416.html )

你可能感兴趣的:(SpringMVC,java,spring,后端,web)