tomcat加载项目原理解惑

今天新遇到一个问题,同样是在启动startup.bat的时候,       

最后得出的结论居然是java_home这个环境变量的值后面加了个";(分号)"的原因.得出的解释是加上分号代表有两个值以上,java_home不能有两个值.


 在tomcat的webapps下加入了一个文件夹,希望通过启动tomcat来访问文件夹下面的文件.然而在启动startup.bat和在eclipse下面启动tomcat都没能成功.

        在startup.bat的最后加入了一个"pause",于是看到提示说缺少JDK_HOME和JRE_HOME,于是在startup.bat中加入了

SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_20
SET JRE_HOME=C:\Program Files\Java\jre6

再启动startup.bat就可以成功的访问webapps下面的所有项目了.

        我们再回过头来分析eclipse下面的tomcat问题.在eclipse中新建Server时都需要Add and Remove Projects,所以我们可以想象在我没有为tomcat添加任何项目的情况下不可以访问项目是理所当然的.也就是添加了哪一个或几个项目才可以访问哪些项目下的资源.这和直接启动tomcat有区别.在网上查到了一篇"链接:浅谈Eclipse调用Tomcat服务的原理"有详细的解释.如下:

    首先,在Eclipse中新建一个Hello工程,Workspace的位置在c:\eclipse\workspace,所以hello工程的位置就是在%Workspace%\hello\这个文件夹中。
    然后在hello工程中添加一个hello.jsp或者index.jsp都可以(index.jsp会方便一点),内容随便写点,如在body标签之间中就一个Hello Eclipse and Tomcat6.0!然后Run as中选择“Run on server”,这是就会调用已经配置好的Tomcat服务器(此时把你的Tomcat服务关闭,让Eclipse来调用就可以了,否则会有小小的冲突),这时在浏览器(Eclipse当中的Web Browser)中就有了我们想看到的东西,其中url=http://localhost/hello/(隐含index.jsp)!


Hello Eclipse and Tomcat6.0!


    !重点来了,Eclipse这期间干了什么?Tomcat的虚拟目录中,你没有设置Hello,怎么能运行?
    1.在MyEclipse的做法(MyEclipse有,Eclipse没有的方法)是:将你的工程拷贝一份到Tomcat目录中的webapps\目录当中(这个目录中,不需设置,tomcat就会把文件夹下当做一个站点,但是webapps\这个目录下的html文件是不会解析的,根目录URL\解析的是ROOT文件夹下的网页文件),这样Tomcat就多了一个站点,自然可以访问。
    2.在Eclipse中的做法不太一样,Eclipse调用了JDK中的JAVAw.exe,并且指定了许多参数,如:

%JAVA_HOME%\bin\javaw.exe -Dcatalina.base=C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1 "-Dcatalina.home=c:\Tomcat 6.0" -Dwtp.deploy=C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps "-Djava............."

如果你的windows任务管理器有印象路径(或者其他任务管理工具)你就会看到这行命令行,而此时,任务列表中没有Tomcat.exe这个服务进程,但是你却可以访问Tomcat服务器的hello工程的页面。
    此时,打开文件夹:C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1
你可以看到的是类似Tomcat目录下的结构,在wtpwebapps中就有你所有的工程拷贝(即Workspace目录下的project)。如果你访问http://localhost可能提示你404找不到页面,但是在你的Tomcat下的ROOT里确实有文件,并且现在你用Tomcat的webApps下的站点都无法使用,原因就在于Eclipse更改了(使用参数,临时更改,关闭Eclipse中的Tomcat服务,Tomcat恢复原样)Tomcat的webapp主目录(我想就是-Dcatalina.base=...)
    以下用%tmp1%代替C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1;
    用记事本打开%tmp1%\conf\web.xml(和tomcat文件夹下的结构一样),这是配置虚拟目录的文件,我们可以找到host标签,没什么不同(这里appBase依旧是webapps,但是已经映射到了%tmp1%\wtpwebapps了),其实这些文件应该是先从Tomcat的conf文件夹里拷贝到这里,然后根据Eclipse的工程进行了修改,我们看。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
    在下面就有了两个Context的虚拟目录项;是三个哦。。第一个指定了ROOT(这里面什么文件也没,所以无法访问http://localhost/),和工程没关系,第二个和第三个是我的hello和helloworld工程,看看,都有了docBase和相对url的path了吧。所以在浏览器中才能访问到hello和helloworld的jsp页面。

<Context docBase="C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ROOT" path="" reloadable="false"/>


<Context docBase="C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\HelloWorld" path="/HelloWorld" reloadable="true" source="org.eclipse.jst.jee.server:HelloWorld"/>


<Context docBase="C:\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\hello" path="/hello" reloadable="true" source="org.eclipse.jst.jee.server:hello"/></Host>



 

 


---------------------------------------------------------------------------------------------------------------------------------
copyright:http://www.cnblogs.com/anee/
原文地址:https://www.cnblogs.com/anee/p/2675821.html