1、关于IDEA对tomcat服务器的整合
在IDEA中整合tomcat服务器,其实是将tomcat的一些文件夹进行了拷贝,主要拷贝了三个文件夹的内容:
- conf文件夹存放tomcat运行实例对应的配置;
- log文件夹存放tomcat运行时产生的日志信息;
- work文件夹是tomcat运行时的工作目录,用于存放部署的项目在运行过程中jsp翻译为servlet的源码,及session的保存。说白了,存放的是部署在服务器的项目运行时产生的数据,其中,每个项目都有自己的文件夹,对应的目录名与项目对外提供的访问路径“/工程路径”中的工程路径同名。

补充:整合后的被拷贝的tomcat文件夹的路径查看方式:
运行Tomcat后,最开始的黑字信息,下面划横线的对应的属性值:
在IDEA中,默认一个web工程配备一只Tomcat?运行实例;彼此工程的Tomcat设置互不影响。而这所谓的Tomcat运行实例,实际上就是上面截图的那一组文件。
每给一个web工程创建一个Tomcat运行实例,就会拷贝上图的文件资源做副本。
注意:重点来了,我们知道tomcat中的webapps文件夹的作用就是用来存放部署的项目,而IDEA中整合tomcat时并没有将webapps拷贝过来。为什么呢?其实很简单,因为IDEA部署项目采用了第二种部署方式,即通过在/tomcat/conf/Catalina/localhost中指定配置文件的方式进行部署。
至于为什么是采用第二种呢?我想大概是因为,实际开发过程中的项目很大,如果好几个项目全都存放在tomcat/webapps中,会让这个文件夹显得过度臃肿。因此,通过配置文件方式进行部署,自然而然就成了最佳的选择。
2、配置文件中到底有些啥?
这是从/tomcat/conf/Catalina/localhost中的一个配置文件打开后截取出来的信息如下:
其中:
- path:是部署在服务器上的项目对外提供的访问路径,即通过浏览器的输入栏 http://ip:port/工程路径 访问工程时,输入的那个“工程路径”。可以自定义。
- docBase:即部署的这个项目在该服务器所在的电脑的硬盘上的具体位置,可以在硬盘的任何位置。图中指向的是在IDEA中部署的项目编译后存储的具体位置。
ps:补充一点,IDEA中部署的项目,编译后该项目存储在IDEA工作区下的out/artifacts/ 文件夹下,并且对应的目录名是固定格式的,IDEA根据工作区的web工程的目录名加上后缀“_war_exploded”自动生成。
3、部署的项目跟IDEA编写的模块的关系是啥?
根据上文,打开配置文件中的docBase所指向的文件路径,截图如下:
再看下我在IDEA的工作区所编写的模块:
我们可以发现,IDEA工作区的模块的文件资源与docBase所指向的文件夹下的资源一一对应,唯一缺少的是IDEA模块中的src资源。
那么src中的资源就没有部署到项目吗?怎么可能!
src中存放的是我们编写的java源代码,而项目部署前会对源代码进行编译,编译后的将class文件存放在WEB-INF/classes中,这下子就一一对应起来了兄弟们!
综上三点所述,IDEA中编写项目并整合tomcat进行部署时,IDEA工作空间硬盘存储的是还没部署的web项目,tomcat利用配置文件对项目进行部署,通过docBase属性链接具体的 IDEA编译后存储在out文件夹下的web项目。
4、利用ServletContext获取指定参数在电脑磁盘中的具体物理位置的思考:
先上问题:
//获取ServletConfig对象
ServletConfig servletConfig = getServletConfig();
//获取ServletContext对象
javax.servlet.ServletContext servletContext = servletConfig.getServletContext();
//作用一:获取 web.xml 中配置的上下文参数 context-param
System.out.println("context中的username: " + servletContext.getInitParameter("username"));
System.out.println("context中的password: " + servletContext.getInitParameter("password"));
//作用二:获取当前工程路径
//工程路径指的是该web工程部署到tomcat服务器上后提供的访问路径,该访问路径IDEA中部署项目后在tomcat的conf下的配置文件中指定的项目的path值(tomcat中的work下该项目的运行时信息存储文件夹也同名)
System.out.println("当前工程路径为:" + servletContext.getContextPath());
//作用三:获取到当前工程在部署后,处于服务器硬盘区域中的绝对路径
System.out.println("处于服务器硬盘中的绝对路径:" + servletContext.getRealPath("/"));
主要研究最后一个方法的测试,即获取 “/” 在电脑磁盘中的绝对路径,获取到的是个啥?
先放运行结果:
可以看到,最后一行,输出的绝对路径,与我们一开始查看的该项目在tomcat中的配置文件的docBase属性值相同,因此,“/” 指向的就是我们已经部署的项目的根目录,也就是IDEA编写的模块中的web站点目录。
看到这里,相信很多小伙伴刚接触JavaWeb时的一个疑惑就已经解开了:
问:就是为什么我们通过浏览器访问http://ip:port/工程名/资源文件名,就可以直接访问到项目的web/资源文件名?
答:因为http://ip:port/后的工程名,其实就是我们的工程路径,也就是配置文件中的path值。那么它可以帮我们定位到docBase指向的具体的文件目录,即工程的根目录。而我们也知道,项目的根目录,其实就是我们IDEA模块中的web站点目录,那么工程名/资源文件名,不就是我们IDEA模块中的web站点目录下的资源文件了嘛?所以工程名/资源文件名,即访问到IDEA项目模块中的web/资源文件名。
★ 坐下喝杯茶,送上全文总结与各个对应关系:
- IDEA中整合了Tomcat,会拷贝tomcat的三个文件夹做副本,三个文件夹分别是,conf,work,log,没有webapps,因为IDEA部署项目用了方式二,即在conf中增添项目的配置文件来部署
- servletContext.getContextPath()获取到的是配置文件中的path值,即该项目部署后对外提供的访问路径
- servletContext.getRealPath("/")获取到的是配置文件中的docBase值,即被部署的这个项目在电脑磁盘中的物理位置(不一定在tomcat文件夹下,可以在任意位置,IDEA中部署的项目都在D:\IDEA_workspace\JavaWeb\out\artifacts\位置下,其中D:\IDEA_workspace\JavaWeb是博主的IDEA工作空间,即存放源代码的地方)
- 综上所述,"/" 就是 对应该项目工程在电脑磁盘中的物理位置,又因为 "/"被服务器解析为 http://ip:port/工程路径/ ,所以通过http://ip:port/工程路径/ 是直接访问到项目在磁盘中的物理位置
- 在IDEA中,模块下的src中的源代码,编译后会存放在web/WEB-INF/classes下,部署时是将web文件夹进行部署(其中包括src的源代码编译形成的class文件),源代码没部署
- "/"对应 http://ip:port/工程路径 , 工程路径(即配置文件的path值) 对应 配置文件的docBase指向的物理位置 , 物理位置下的文件夹 对应 IDEA编写的模块中的web目录下的资源 , 因此,"/"(即http://ip:port/工程路径) 对应IDEA模块下的web目录.
一条龙服务如下:(其中 -> 代表对应或联系)
- “/” -> 服务器解析为 http://ip:port/工程路径
- 工程路径 -> 配置文件的path值
- 配置文件的path -> 配置文件的docBase
- docBase指向的物理位置 -> IDEA模块中部署的web目录
- 综上, “/” -> IDEA模块中的web目录
以上是个人学习JavaWeb时的小思考,对于初学者而言,在JavaWeb的学习生涯中最难的点莫过于对路径的理解,希望这篇文章可以帮到大家!奥里给xdm!