做java web开发的,经常和tomcat的配置打交道,你今天不费点时间搞清楚,你会发现早晚还要继续浪费时间
上下文:
windows环境下,eclipse开发web项目
D:\workspace下有一web工程dafan,里面就一个index.jsp欢迎页面(在web.xml的<welcome-file-list>中)D:\pro\apache-tomcat-7.0.62是tomcat的位置
用eclipse添加删除发布web工程就不讨论了,有问题一会删一会加一会clean,慢而且不知道问题出在哪
以下说说手动配置的方式:
在D:\pro\apache-tomcat-7.0.62\conf下server.xml中</Host>之前加入以下配置:
<Context path="/" docBase="D:/workspace/dafan/WebContent" debug="0" />
看来Context path docBase就是一行配置。。。
启动tomcat(用eclipse配置并启动,控制台查看相关信息),
成功后直接浏览器http://localhost:8080成功访问web工程的欢迎页面。
下面问题来了:
http://localhost:8080/
http://localhost:8080/dafan
http://localhost:8080/dafan/index.jsp
A:第一个访问docBase指向的资源能,后面两个从webapps下找不到不能
Q:如果把dafan这个工程copy到webapps下面会怎样?
A:那上面的方式都能够访问,"/"或""通过path对应到docBase指向的资源去了,最后访问到index.jsp
/dafan或者/dafan/index.jsp没有path都到tomcat的webapps下去找,最后访问到index.jsp
加.jsp表示直接去寻找某个jsp文件,不加依然会通过web.xml中的<welcome-file-list>找到
其实你试试让两个地方的jsp内容不一致就明白了。
Q:那这样呢 <Context path="/" docBase="D:/workspace/dafan/WebContent/" debug="0" />
A:这个配置在/WebContent后面又多了个"/",答案是一样的,不要纠结,docBase="D:/workspace/dafan/WebContent//"一样能,明白?
Q:那要是这样呢<Context path="" docBase="D:/workspace/dafan/WebContent" debug="0" />
A:一样的,没有差别
Q:靠,那如果这样呢:
<Context path="" docBase="D:/workspace/dafan/WebContent" debug="0" />
<Context path="/" docBase="D:/pro/apache-tomcat-7.0.62/webapps/dafan/" debug="0" />
A:tomcat说java.lang.IllegalArgumentException: addChild: Child name '' is not unique,
看来他把""和"/"都当作zero length String 了,可参考源码
这里也说明,path不能相同,有两个/xxx是不行的,每个path会对应到相应的资源位置Q:那我要是在webapps下面建立ROOT文件夹,把dafan这个工程下面的资源全部放进ROOT会怎样?
注:server.xml当前的配置为<Context path="" docBase="D:/workspace/dafan/WebContent" debug="0" />
A:ROOT表示当访问不带前缀时,指向ROOT下面的资源,但是这里docBase已经将不带前缀的访问占用了,localhost:8080依然会访问到docBase指向的资源而不是webapps中ROOT下的资源
Q:如果去掉上面的Context配置呢?
A:此时不带前缀的访问就会指向webapps中ROOT下的资源,
但是/dafan,/dafan/index.jsp都不行,因为webapps根目录中并无对应资源。。
累,下次继续说说以下情况:
1、使用war发布的情况(生产环境常用)
2、apache-tomcat-7.0.62\conf\Catalina\localhost\***.xml这个是怎么回事