Poseiden - 三叉戟

静若处子,动则猛虎

0%

浅谈MyEclipse和Idea中Tomcat的部署方式以及在项目中设置上下文的相关

年底终于可以在繁重的开发任务上喘一口气,决定用一些新东西来重构老项目。有些平时没有追究的细节问题在一个人开发时,由于没有了别人的参考,被坑的还是很惨的,现在特此记录下来,希望给同样有疑惑的人一个参考吧。

开发工具:IDEA14 +Tomcat7(其他的和本文无太大关系,故不介绍….)
开发环境:struts2(其他的和本文无关,故不介绍)

(看本文前如果有不知道Tomcat几种部署方式的请自行谷歌。)

Tomcat部署项目有三种方式,这种讲解说明的教程在网上一抓一大把。而MyEclipse和Idea分别采用了不同的部署项目方式。

MyEclipse部署项目。

  • 从目录结构上看,MyEclipse部署项目就是用了最简单粗暴的一种。如果用MyEclipse关联了本地的Tomcat,那么部署就是直接将解压后的war包目录扔到了webapps里,然后启动。这种方式最简单直接,对于一开始使用的初学者来说也比较容易懂。

Idea部署项目

大家已经都清楚,Tomcat有一种部署方式是在服务器目录下的conf/Catalina/localhost(如果你使用了这个地址访问你的项目)下生成一个xml文件,文件的名称可以随意指定,但是里面的内容决定了你访问项目的上下文名称以及项目的物理地址。
而Idea正是用了这种方式,当你在ide中给服务器指定了项目的物理地址以及访问上下文并启动服务器之后,在你的idea安装目录下(一般是主目录下的隐藏文件夹IntelliJIdea14)的system/tomcat/xxx(你的项目或者模块名称)/conf/Catalina/localhost下也生成一个xml文件。(如果你没有设置上下文,那么这个xml就叫ROOT.xml,否则,就叫你设置的那个名字。)里面通过节点记录了你刚才设置的相关值。这种方式会比较绕,但是在后期便于管理,尤其是像idea这种模块概念分明的ide。

Web项目目录结构

在标准的MVC模型的建议中,把页面文件(jsp或者freemarker或者其他)放在web-inf下是安全的行为。但是这只是规范,或者一种标准,要是不遵守也没有逻辑上的问题。下面就来说说放在web-inf中的情况下,实际访问的目录结构是什么样的。

如果你放到webinf中,是通过struts2等方式请求的。那在访问项目后服务器端的结构就变成了/project/namespace/xxxxx.do。(读者要是不明白可以自行打开浏览器的debugger看)。project是我设置的上下文根,你要不设置就没有这一层,namespace/xxxxx.do是你通过struts2访问页面的请求路径。也就是说,目录结构并不像你在开发环境看到的,其实已经没有了web-inf这一层,(这也是一直我在页面引用js引用不到的原因)。所以你当你在页面使用相对路径引用css文件时,就用../跳出上一级目录就能引用到。(前提是你把css或者js文件别放在webinf中)。
如果你使用的是以/开头的绝对路径,那么在你设置了上下根之后,引用时需要加上你的上下文名称,因为jsp等页面在写/时实际上引用到了服务器根路径下,所以你的写法应该是/project/xxx.js。如果你没有设置上下根,那么直接就写/xxx.js就好。

总结

其实在这次问题中主要绊倒我的就是在页面放到webinf之后,不知道怎么写外部js的引用路径问题。最后通过浏览器的调试得知项目的目录,问题才得以解决。