• SpringMVC <url-pattern/>解读


    1. < url-pattern/>的值

    (1).使用拓展名的方式,语法*.xxx,xxx是自定义的拓展名,常用的方式*.do,*.action,不能使用*.jsp.
    (2).使用斜杠 "/"
    	当项目中使用了 / ,他会替代tomcat中的default。
    	导致所有的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力,没有控制器对象能处理静态资源的访问,
    	所以静态资源(html,js,图片,css) 都是404。
    	
    	动态资源可以正常访问。
    	
    	tomcat中的default这个servlet的作用:
    	1.处理静态资源
    	2.处理未映射到其他servlet的请求
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2. 测试两种写法

    2.1 测试*.xxx

    在webapp目录下创建images文件夹,并且添加图片
    
    • 1

    在这里插入图片描述

    web.xml文件中DispatcharServlet配置如下
    
    • 1
    	<servlet>
            <servlet-name>dispatcherServletservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc.xmlparam-value>
            init-param>
            <load-on-startup>1load-on-startup>
        servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServletservlet-name>
            <url-pattern>*.dourl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    index.jsp页面
    
    • 1
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>index</title>
    </head>
    <body>
    <img src="images/th.jpg" alt="我是spring的logo"/>
    </body>
    </html>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    启动服务器
    
    • 1

    在这里插入图片描述

    可以看出,可以正常访问,< url-pattern>*.do< /url-pattern>,会去找 *.do对应的servlet,找不到的时候会使用tomcat的default(默认 servlet,
    该servlet有能力处理静态资源,所以图片会正常显示。
    
    • 1
    • 2

    2.2 测试 /

    将*.do 改为/,再次启动服务器
    
    • 1

    在这里插入图片描述

    图片访问失败
    原因解释:修改为/之后,它会把匹配所有请求都当做是对控制器的访问,去掉后缀进行匹配。例如你访问/main.css会变成/main,这也是造成你引入的.css,
    .js等静态资源无法访问的原因,因为他们都被当做控制器的路径了。
    
    • 1
    • 2
    • 3

    2.3 解决问题

    的值并不是说写为/后,静态资源就无法访问了。经过一些配置后,该问
    题也是可以解决的。
    
    • 1
    • 2

    2.3.1 使用< mvc:default-servlet-handler/>

    声 明 了  后 , springmvc 框 架 会 在 容 器 中 创 建
    DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet
    的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的
    Servlet 处理。一般的服务器都有默认的 Servlet。
    
    只需要在 springmvc.xml 中添加标签即可。
    
    声 明 了  后 , springmvc 框 架 会 在 容 器 中 创 建
    DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet
    的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的
    Servlet 处理。一般的服务器都有默认的 Servlet。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3.2 使用< mvc:resources/>(常用)

    第一种解决方案,依赖服务器,第二种解决方案则不依赖服务器,加入该标签之后,框架会创建ResourceHttpRequestHandler这个对象,
    并且添加了标签,专门用于解决静态资源无法访问问题。需要在 springmvc 配置文件中添加如下形式的配置:
    
     
     location 表示静态资源所在目录。当然,目录不要使用/WEB-INF/及其子目录。
     mapping 表 示 对 该 资 源 的 请 求 ( 以 /images/ 开 始 的 请 求 , 如 /image/beauty.jpg , /images/car.png 等)。注意,后面是两个星号**。 
     
     小技巧:有时候静态资源有很多种,比如html,js,图片,这个时候我们需要写几个标签,我们也可以将所有的静态资源文件夹放入一个
     大的文件夹(比如static文件夹),这样我们在写标签的时候就可以写成。
     
     
     问题:< mvc:resources/>和@RequestMapping存在一定冲突,需要加入< mvc:annotation-driven/>来解决冲突。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    40道JAVA经典算法面试题(答案)
    网页大作业代码自取【HTML+CSS制作美味糖果网站】
    2023牛客暑期多校训练营7 CI「位运算」「根号分治+容斥」
    大模型提示工程之Prompt框架和示例
    使用 Rust 和 cURL 库下载程序
    【Shell 系列教程】Shell printf 命令( 六)
    Completed 404 NOT_FOUND,Whitelabel Error Page
    【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(5月26日论文合集)
    低代码维格云甘特视图入门教程
    iOS——present相关属性以及dismiss多级的方法
  • 原文地址:https://blog.csdn.net/qq_63524487/article/details/132697191