【SpringMVC】关于classpath和contextConfigLocation

2017年11月16日 12:05:47 yongh701 阅读数:3624
 
 版权声明:本文为博主原创文章,未经博主允许,欢迎随意转载,标好作者+原文地址就可以了!感谢欣赏!觉得好请回个贴! https://blog.csdn.net/yongh701/article/details/78548506

众所周知,基本上javaee的配置文件都放在WEB-INF之下,javaee网页工程默认读取配置文件也只会在这个目录下面读,但经常看到一些javaee不知道是装逼,还是因为用myeclipse自动生成,还是为了好管理的原因,将工程的配置文件移到其它文件夹,他们基本利用了SpringMVC的contextConfigLocation去完成这件事,contextConfigLocation下面常常也伴随着classpath:这些东西。其实,这些也只是小小的玩意而已,你看懂就觉得这是无比简单的事情了。

一、classpath

一切都要从classes这个文件夹和classpath说起。

打开你工程所在的工程目录。你会发现有个.classpath在里面,而你在eclipse是看不到这玩意的。

默认的eclipse工程(不是myeclipse这些异端!)的.classpath是这样的:

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <classpath>
  3.  
    <classpathentry kind="src" path="src"/>
  4.  
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_71">
  5.  
    <attributes>
  6.  
    <attribute name="owner.project.facets" value="java"/>
  7.  
    </attributes>
  8.  
    </classpathentry>
  9.  
    <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v7.0">
  10.  
    <attributes>
  11.  
    <attribute name="owner.project.facets" value="jst.web"/>
  12.  
    </attributes>
  13.  
    </classpathentry>
  14.  
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
  15.  
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
  16.  
    <classpathentry kind="output" path="build/classes"/>
  17.  
    </classpath>

除了一些con指明加载的系统包的的等属性,主要是第三行,<classpathentry kind="src" path="src"/>,kind="src"这个节点指明将目录工程下的src编译。

至于编译的去向,所有javaee工程只有一个地方,那就是WEB-INF下的classes文件夹。

不信你可以打开tomcat所在目录的webapps下相应的javaee工程的WEB-INF看看,明显是多了个classes文件夹。当然你必须像《【Javaweb】于Eclipse for JavaEE中编译一个项目Tomcat下的webapps却没有的解决方法》(点击打开链接)先设置eclipse将javaee工程编译到tomcat,而不是eclipse自己的文件夹。

这里先说明一下,大家需要搞明白几个概念:你eclipse是显示你的工程目录,工程目录的东西经过编译会去到tomcat的webapps之下,tomcat的webapps下的东西才是最终运行的成果。

可以看到eclipse的workspace,也就是工程空间的src里面的所有东西除了.java包括.xml,因为有.classpath指引,都被搬到tomcat的webapps下的编译运行空间下的WEB-INF\classes,同时.java变成了编译了之后的.class。

而WebContent的东西自然是照搬的,反过来,WebContent以外的东西,要是没有.classpath是绝对不搬的,你绝对不会在tomcat的webapps下的编译运行空间找到build、conf(我自己乱建的)这两个在工程空间有的文件夹。

然而,我需要eclipse搬呢?那就对工程点右键->Properties->Java Build Path->Source->Add Folder...勾选Conf,即可。

你会发现Javaee的工程目录变成这个样子:

为了测试,在conf新建一个a.xml,你会发现编译之后a.xml也搬到tomcat下的webapps了。

同时再打开工程目录下的.classpath看看,你会发现变成在第4行,明显多了一个src节点,同时指明我们刚才自己添加的文件夹啊:

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <classpath>
  3.  
    <classpathentry kind="src" path="src"/>
  4.  
    <classpathentry kind="src" path="Conf"/>
  5.  
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.7.0_71">
  6.  
    <attributes>
  7.  
    <attribute name="owner.project.facets" value="java"/>
  8.  
    </attributes>
  9.  
    </classpathentry>
  10.  
    <classpathentry kind="con" path="org.eclipse.jst.server.core.container/org.eclipse.jst.server.tomcat.runtimeTarget/Apache Tomcat v7.0">
  11.  
    <attributes>
  12.  
    <attribute name="owner.project.facets" value="jst.web"/>
  13.  
    </attributes>
  14.  
    </classpathentry>
  15.  
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
  16.  
    <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
  17.  
    <classpathentry kind="output" path="build/classes"/>
  18.  
    </classpath>

二、contextConfigLocation

那么这和SpringMVC的contextConfigLocation有什么关系呢?拿《【SpringMVC】Helloworld》(点击打开链接)作为例子说这件事。

我觉得WEB-INF下太多的xml很碍眼,觉得就应该一个web.xml,要将SpringMVC-servlet.xml移到Java Resources的Conf文件夹,这样好看点。

那就先像上面的操作在整个工程下先建一个conf文件夹,将SpringMVC-servlet.xml移到conf,同时要求eclipse编译这个文件夹呗。工程目录变成这样:

但这个时候要是不做任何配置,SpringMVC还是只会搜索WEB-INF下的xml文件啊,根本无法完成工程目录的初始化,于是contextConfigLocation就派上用场了,web.xml要改成这个样子:

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xmlns="http://java.sun.com/xml/ns/javaee"
  4.  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  5.  
    version="3.0">
  6.  
    <!-- 要求初始化ContextLoaderListener设置的contextConfigLocation才能生效 -->
  7.  
    <listener>
  8.  
    <listener-class>
  9.  
    org.springframework.web.context.ContextLoaderListener
  10.  
    </listener-class>
  11.  
    </listener>
  12.  
    <!-- 设置contextConfigLocation的参数,指明路径 -->
  13.  
    <context-param>
  14.  
    <param-name>contextConfigLocation</param-name>
  15.  
    <param-value>
  16.  
    classpath:SpringMVC-servlet.xml
  17.  
    </param-value>
  18.  
    </context-param>
  19.  
    <!-- 要求SpringMVC按照contextConfigLocation的设置的内容初始化 -->
  20.  
    <servlet>
  21.  
    <servlet-name>SpringMVC</servlet-name>
  22.  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  23.  
    <init-param>
  24.  
    <param-name>contextConfigLocation</param-name>
  25.  
    <param-value>
  26.  
    classpath:SpringMVC-servlet.xml
  27.  
    </param-value>
  28.  
    </init-param>
  29.  
    <load-on-startup>1</load-on-startup>
  30.  
    </servlet>
  31.  
    <servlet-mapping>
  32.  
    <servlet-name>SpringMVC</servlet-name>
  33.  
    <url-pattern>/</url-pattern>
  34.  
    </servlet-mapping>
  35.  
    </web-app>

要利用contextConfigLocation,你首先要在web.xml利用一个监听器,启动org.springframework.web.context.ContextLoaderListener这个SpringMVC这个自带的公有类,然后再设置contextConfigLocation的要指明的初始化路径,其中这里classpath:指的就是编译之后,在Tomcat\工程根目录\WEB-INF\classes文件夹,因为SpringMVC-servlet.xml被编译之后,就会被放到classes文件夹啊。最后,还要要求,SpringMVC按照上面的设置的contextConfigLocation设置的内容启动,格式就是这样,基本等于将<context-param>节点的东西,在<init-param>照抄一次。

最后运行结果还是一模一样的,证明上面设置生效:

这就是你在网上看到一大堆SpringMVC的所谓的“示例工程”,尤其靠MyEclipse配出来的SpringMVC,在web.xml写一大堆,读起来非常绕的的原因之一。

让人绕了半天,tomcat启动也慢了,还要让人理解什么是classpath什么是contextConfigLocation,然后的目的就是为了将那堆,.xml移到conf文件夹!这不是装逼是什么?什么好管理,个人看起来就是借口!明明人家的web.xml看起来可以很简练,同时将SpringMVC-servlet.xml也作为SpringMVC核心的配置文件之一,放在WEB-INF我觉得根本就没什么不好看的!你让SpringMVC默认读WEB-INF下的所有内容就是了!

【SpringMVC】关于classpath和contextConfigLocation的更多相关文章

  1. 【SSM框架】Spring + Springmvc + Mybatis 基本框架搭建集成教程

    本文将讲解SSM框架的基本搭建集成,并有一个简单demo案例 说明:1.本文暂未使用maven集成,jar包需要手动导入. 2.本文为基础教程,大神切勿见笑. 3.如果对您学习有帮助,欢迎各种转载,注 ...

  2. SpringMVC+FreeMarker

    前言: 最近在学习SpringMVC,模板引擎用的是FreeMarker,之前没有接触过.利用SpringMVC开发其实还有许多的步骤,比如控制层,服务层,持久化层,实体等等,先弄了一个小demo来总 ...

  3. SpringMVC学习(三)整合SpringMVC和MyBatis

    工程结构 导入jar包 配置文件 applicationContext-dao.xml---配置数据源.SqlSessionFactory.mapper扫描器 applicationContext-s ...

  4. 8.SpringMVC参数传递

    页面参数传递到controller, 可被同名(与页面标签上的name名对应)的参数接收,用request设值,页面再取出来. 注意乱码解决办法: ①如果是get提交,则在tomcat的server. ...

  5. 6.SpringMVC注解启用

    SpringMVC注解可以帮助我们快速地注入 属性和参数 提高开发效率. 由于 有相当一部分人讨厌xml配置方式 注解可以覆盖 xml则不能 使用注解比xml规范化,因为很多注解都是java的规范的范 ...

  6. 5.SpringMVC静态文件的访问

    我们在进行springMVC开发时,必定会在jsp页面引入js文件.img文件和css文件.大多数人会将这些分类存放在WebRoot文件下新建的文件夹下面.同时,会在web.xml文件中配置拦截所有请 ...

  7. 3.SpringMVC修改配置文件路径和给界面传递数据

    1.修改配置文件路径  达到  配置多文件的目的 web.xml文件中基础配置有springMVC配置的servlet路径 <servlet-name>SpringMVC</serv ...

  8. spring+springmvc+mybatis整合

    1.web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  9. springMVC第一课--配置文件

    刚学springMVC,记录下学习过程,供以后查阅(githup源码). 1,新建一个web工程.(其他按常规来) 如下:添加applicationContext.xml,webmvc-servlet ...

随机推荐

  1. R语言学习笔记(五)绘图(1)

      R是一个惊艳的图形构建平台,这也是R语言的强大之处.本文将分享R语言简单的绘图命令.   本文所使用的数据或者来自R语言自带的数据(mtcars)或者自行创建.   首先,让我们来看一个简单例子: ...

  2. .net敏捷开发框架 力软(learun) 让开发变的更简单

    版本:6.1.6.2 体验地址:www.fishcmonkey.com 联系QQ:6539471

  3. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    WebService中发布之后出现这个错误, 解决方法: web.config文件中的 <system.web> 节点下加入:<webServices>    <prot ...

  4. ActiveReport系列报表开发随笔收集

    转自:博客园 http://www.cnblogs.com/dahuzizyd/archive/2007/04/11/ActiveReport_All.html 使用ActiveReport for ...

  5. ORM框架EF

    应用程序和数据库采用Tcp协议通讯 ORM框架有: NHibernate ,Dapper ,Mybatis 底层是 ADO.Net 好处: 1.面向对象 2.没有sql减少学习成本,快速开发 3.编译 ...

  6. Java中的集合迭代器

    集合的迭代器 任何集合都有迭代器. 任何集合类,都必须能以某种方式存取元素,否则这个集合容器就没有任何意义. 迭代器,也是一种模式(也叫迭代器模式).在java中它是一个对象,其目的是遍历并选中其中的 ...

  7. css兼容问题(一)

    开头语:不用就忘,还是自己乖乖的记笔记吧! 正文开始:    (一)如果你的页面对IE7兼容没有问题,又不想大量修改现有代码,同时又能在IE8中正常使用,微软声称,开发商仅需要在目前兼容IE7的网站上 ...

  8. 免费工资总额管控系统-JXHR2016

    •工资总额是指按照国家统计局规定的统计口径或企业规定,在一定时期内支付给各类用工的劳动报酬总额 •工资总额,即基本工资,包括岗位工资.各项津补贴 •JXHR2016以薪酬管控为核心,结合人力资源规划. ...

  9. JavaScript按IP地址排序

    JavaScript按IP地址列表排序,主要思路就是分割每个点号部分,然后ip1和ip2分别对不够三位数的进行补0操作,然后转换为数字类型进行一一比较. 上代码: 正序: var arr=[ {ip: ...

  10. Angular2 富文本编辑器 ng2-ckeditor 的使用

    本文介绍如何在 Angular 中使用 ng2-ckeditor 控件,示例代码基于 angular 6.0.2,node 8.11.2,  ng2-ckeditor 4.9.2 环境   1. 安装 ...