zoukankan      html  css  js  c++  java
  • SpringMVC中url-pattern /和/*的区别

    1、src不是classpath, WEB-INF/classes,lib才是classpath,WEB-INF/ 是资源目录, 客户端不能直接访问。

    2、WEB-INF/classes目录存放src目录java文件编译之后的class文件,xml、properties等资源配置文件,这是一个定位资源的入口。

    3、引用classpath路径下的文件,只需在文件名前加classpath:

    <param-value>classpath:applicationContext-*.xml</param-value>
    <!-- 引用其子目录下的文件,如 -->
    <param-value>classpath:context/conf/controller.xml</param-value>
    <param-value>classpath:applicationContext-*.xml</param-value>
    <!-- 引用其子目录下的文件,如 -->
    <param-value>classpath:context/conf/controller.xml</param-value>

    4、lib和classes同属classpath,两者的访问优先级为: lib>classes。

    5、classpath 和 classpath* 区别:

    classpath:只会到你的class路径中查找找文件;
    classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。


    =============================================
    SpringMVC中url-pattern /和/*的区别

    ①:<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
    ②:<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
    1
    2
    ①:地址为 localhost:8088/login , /login 返回login.jsp
    访问去Controller下的/login 跳转到相应的视图login.jsp
    ②:访问的地址为 localhost:8088/login/ ,/login 返回login.jsp
    访问去Controller下的/login,跳转到login.jsp ,然后进过dispatchservlet的时候,由于是/* ,有会以localhost:8088/login/login.jsp 去请求Controller ,那么如果Controller没有 /login/login.jsp 的Mapping映射,则会报404 错误!

    (4):总结
    < url-pattern > / < url-pattern > /* 能匹配所有请求URL,会匹配到*.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。

    当映射规则为 /* 时,最后返回xx.jsp也经过DispatcherServlet,它又会去找相对应的处理器,这也是控制台打印noHandlerFound,也就导致了404错误,页面更别想看到。当改成 / 后,servlet不会匹配到.jsp的URI,当然就能正常返回页面了


    ========================================

    三、下面是对配置文件的说明。

    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    ContextLoaderListener是Spring的监听器,它的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <!-- <param-value>classpath*:config/applicationContext.xml</param-value> -->
    <param-value>/WEB-INF/classes/config/applicationContext.xml</param-value>
    </context-param>
    这段配置是用于指定applicationContext.xml配置文件的位置,可通过context-param加以指定:

    这里需要搞清楚classpath是什么,以及classpath:和classpath*有何区别:

    1. 首先 classpath是指 WEB-INF文件夹下的classes目录

    2. classpath 和 classpath* 区别:
    classpath:只会到你的class路径中查找找文件;
    classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.

    如果applicationContext.xml配置文件存放在src目录下,就好比上面的代码结构中的存放位置,那么在web.xml中的配置就如下所示:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    如果applicationContext.xml配置文件存放在WEB-INF下面,那么在web.xml中的配置就如下所示:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext*.xml</param-value>
    </context-param>
    需要注意的是,部署到应用服务器后,src目录下的配置文件会和class文件一样,自动copy到应用的 classes目录下,spring的 配置文件在启动时,加载的是web-info目录下的applicationContext.xml, 运行时使用的是web-info/classes目录下的applicationContext.xml。因此,不管applicationContext.xml配置文件存放在src目录下,还是存放在WEB-INF下面,都可以用下面这种方式来配置路径:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/applicationContext*.xml</param-value>
    </context-param>
    当有多个配置文件加载时,可采用下面代码来配置:

    复制代码
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath*:conf/spring/applicationContext_core*.xml,
    classpath*:conf/spring/applicationContext_dict*.xml,
    classpath*:conf/spring/applicationContext_hibernate.xml,
    ......
    </param-value>
    </context-param>
    复制代码
    也可以用下面的这种方式:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:**/applicationContext-*.xml</param-value>
    </context-param>
    "**/"表示的是任意目录;

    "**/applicationContext-*.xml"表示任意目录下的以"applicationContext-"开头的XML文件。

    Spring配置文件最好以"applicationContext-"开头,且最好把所有Spring配置文件都放在一个统一的目录下,也可以分模块创建。

    ==============================================================================================

  • 相关阅读:
    如何将 Python 程序打包成 .exe 文件?
    无穷滚动(Infinite scroll)的实现原理
    图片延迟加载(lazyload)的实现原理
    Java 基础 -- 泛型、集合、IO、反射
    Ubuntu on win10
    让自己少走点弯路
    使用MongoDB 记录业务日志
    19个JavaScript数组常用方法总结
    Kubernetes 使用Nginx-Ingress实现蓝绿发布/金丝雀发布/AB测试
    官方golang包管理神器
  • 原文地址:https://www.cnblogs.com/konglxblog/p/10049228.html
Copyright © 2011-2022 走看看