在myeclipse中,如果项目的web-context root设置为“/”,则项目在tomcat中发布时,会发布到在ROOT文件中。ROOT文件不需要子目录名,直接输入tomcat地址就可以访问。
例如,当项目A的web-context root属性设置为“/”,则A发布时会在tomcat的webapps文件夹下生成一个ROOT的文件夹,项目A会发布到该文件夹中。访问时,只需要输入localhost就可以访问。
此时有一个问题,如果项目A的目录中有一个文件B,那么我们访问localhost/B就可以访问到B文件。那么如果我们再发布一个路径是“/B”的项目,那么访问localhost/B是会访问项目A中的B文件还是访问到项目B呢?
根据实验,会访问到项目B,而不是项目A中的B文件。
再进一步实验,如果ROOT目录中有一个子目录a,子目录中有一个文件b;而与ROOT同级目录a中有一个文件b,访问localhost/a/b是会访问哪一个文件b呢?
根据实验结果,依旧还是会访问到项目a中的b文件,而不是ROOT子目录a中的b文件。
再进一步实验,如果ROOT目录中有一个子目录a,子目录中有一个文件c;而与ROOT同级目录a中没有c文件,访问localhost/a/c能不能访问到文件c呢?
根据实验结果,服务器包404 not available错误。可见依旧访问的是目录a
结论是:当ROOT目录下的文件(文件夹)与和ROOT同级的目录重名时,tomcat会将访问定位在后者。当有多级文件或文件夹同时重名时,由于tomcat已经将访问定位在后者,因此访问的是后者的文件或文件夹;前者被覆盖的文件,或者文件夹都无法再访问到。
百度了一下,这是tomcat的“最长匹配原则”。输入路径后,tomcat会首先定位工程目录(虚拟子目录),然后在工程目录中寻找资源。定位工程目录的时候,按照最长的路径定位。如果没有则进入上一级目录中,以此类推。最后定位ROOT目录。如果ROOT目录不存在则浏览器页面显示空白。