【SpringMVC】关于classpath和contextConfigLocation

【SpringMVC】关于classpath和contextConfigLocation众所周知,基本上javaee的配置文件都放在WEB-INF之下,javaee网页工程默认读取配置文件也只会在这个目录下面读,但经常看到一些javaee不知道是装逼,还是因为用myeclipse自动生成,还是为了好管理的原因,将工程的配置文件移到其它文件夹,他们基本利用了SpringMVC的contextConfigLocation去完成这件事,contextConfigLocation下面常常也伴…

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

 

一、classpath

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

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

【SpringMVC】关于classpath和contextConfigLocation

默认的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下的东西才是最终运行的成果。

【SpringMVC】关于classpath和contextConfigLocation

可以看到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,即可。

【SpringMVC】关于classpath和contextConfigLocation

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

【SpringMVC】关于classpath和contextConfigLocation

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

【SpringMVC】关于classpath和contextConfigLocation

同时再打开工程目录下的.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文件夹,这样好看点。

【SpringMVC】关于classpath和contextConfigLocation

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

【SpringMVC】关于classpath和contextConfigLocation

但这个时候要是不做任何配置,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】关于classpath和contextConfigLocation

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

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

以上转自http://www.cnblogs.com/moxiaotao/p/9306216.html

当然也可以创建时就让Conf文件夹下的文件在classpath下,方法如下:

选中项目右击->New->Other

【SpringMVC】关于classpath和contextConfigLocation

输入source Folder并选中点击Next。

【SpringMVC】关于classpath和contextConfigLocation

然后

【SpringMVC】关于classpath和contextConfigLocation

点Finish。这样conf下文件就和src文件一样会发布在Tomcat\工程根目录\WEB-INF\classes文件夹下了

今天的文章【SpringMVC】关于classpath和contextConfigLocation分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/10141.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注