不知不觉学习javaweb相关知识也快一年时间了,时间还是很长的哈,但是相关的基础知识还是很差,要不然也不会写一篇关于这个主题的博客总结了,哈哈。
不知道有没有小伙伴和我一样,在学习的过程中其实是很功利的,一味的图块,却没有夯实好基础。我学习java的历程就是跟着培训班视频走的,关于javaweb方面的知识我只看了2天,哈哈,实在有点太短了,因为当时我急着看spring相关的,想快点做出点东西出来啊。现在回头看,确实学地很急躁,而且培训班讲的也很粗浅,他们教学万事基于的原则就是,能够成功的启动项目。所以,跟着他们的步伐,对于各种技术的成功启动还是很熟悉的哈哈,但由于不懂为什么这么做,常常稍微变化下环境,就有点摸不着头脑了。但是程序员最重要的还是要熟悉各种配置环境是吧!难受香菇!!
说了那么多废话,下面进入正文吧。我想讲讲idea是怎么启动tomcat的,以及为什么我们用idea写完代码后一启动tomcat服务器,web应用就能够正确的部署运行。
正文
我从两个方面来说明一下这篇文章的主要内容,第一是怎么把tomcat集成到idea中,第二是idea是怎么把程序部署到tomcat上去的。
idea使用tomcat的基本步骤
网络上关于这个部分的教程其实有很多了,但我还是想搬运过来记录下,哈哈。
我说两个方法吧,我的idea的版本是ultimate这个版本,也就是最高级的那种。
第一种方法:直接使用idea创建java ee项目
如果直接使用idea来创建Javaee项目,那么idea会先去检测本地存在的web服务器,并显示出来,就如上图的右上角区域。因为我本身安装了tomcat的8.5版本,所以也被检测出来了。idea基于检测出来的这个web服务器会静默地为开发者配置启动相关的配置,关于这点后续再截图说明。
创建好项目,进入idea后就如上图所示。idea帮我们做了太多的事了,包括服务器的启动配置和相关的目录结构、必要文件(web应用相关的)、基于web的应用构件等等,所以难怪这么多人喜欢idea这个软件开发工具,哈哈。
这种方式创建web项目到此就结束了,直接编写代码,然后启动tomcat就足够了。
第二种方法:基于普通的java项目创建一个web项目
直接创建一个最普通的java项目其实也是可以使之成为web项目的,只是麻烦了点。前面第一种idea替我们做的工作这时候都得由我们自己完成了,哈哈。不过这样可以体会下idea到底做了啥。
最普通的java项目的结构大概就和上图所示,既没有启动配置,也没有web项目相关的目录结构。接下来就把必要的东西给手撸出来吧。
我们先点击进入项目结构窗口,这是一个很重要的窗口,里头的所有配置我认为都应该要很熟悉。我把它详细介绍下吧。
上图是项目结构中关于项目的相关配置,图中的1是项目的名称,2是项目用到的sdk,也就是编译用的sdk,这个是针对整个项目的。一个项目可能由多个模块组成,如果子模块没有特别指定sdk,那么都会从项目中继承得到sdk的版本。3说的是这个项目的语言级别,因为java不同版本的语法有些许不同,这个选项应该是提供给idea来进行智能纠错的,务必保证和sdk的版本对应。4是项目编译后的输出目录,如果有多个模块则会将编译结果生成在这个目录的对应子目录下。
上图显示的是项目结构中的模块菜单项,因为这个项目没有子模块,所以只显示了一个项目名称的模块。右边部分的长方形方框中的选项都值得一看,图中的paths选项下显示的是编译的输出,可以看出其默认的输出路径就是继承自前面介绍过的项目的输出路径的。
为了让这个项目成为一个web项目,我们在模块菜单下添加web模块
上图里头1指的是这个web应用描述符,我们知道tomcat应用的启动一般要一个web.xml这个文件,这个就是为了配置这个。2里头可以配置针对不同web服务器的特定描述符,比如tomcat、jetty、weblogi等等的啊。3是指定web资源在的目录,比如web应用需要的静态资源html、js等等,动态资源jsp等等的,都放在这里设置的目录下,这个到后面是会被打包到最终的编译目录下的。还有一点可以注意下,web资源目录相对于发布目录的路径。这个怎么理解呢?web资源最终是会被打包到发布目录下的,为了web程序可以访问是的吧!这里默认的是根路径,也就是直接放到到时候发布、部署的那个目录下的根路径下,再说通俗点,项目中的web文件夹到时候会被拷贝到部署目录的根目录下。
看到4其实有个警告是吧!这个是idea的善意的提醒,它表示还需要我们创建一个构件(artifact),下面截图再说明为什么吧。
我们跟随提示进行构件的创建。
idea随之帮我们创建出对应于web应用的构件,首先看1,这是构建的类型,是一个web应用,这里表达的意思应该就是war包的解压缩形式吧。2是这个构件的输出位置,3是这个构件的布局,也可以理解成这个构件的组成吧。我们详细看一下,这个构件有一个web-inf目录,是不是很熟悉,哈哈,其实就是war包下的web-inf目录。这个目录下的classes目录相信大家也一定很熟悉,就是放web应用的字节码文件的,所以这里也一样,它会将这个项目编译输出的结果给放进来。然后下面还有一个,指的是web的资源文件都会被放入到web-inf这个文件夹下,其实就是之前定义web模块的时候指定的那个web文件夹下的所有资源文件到最后打包的时候都会被放到这个构件里头。好了,最后再啰嗦一下构件在做什么,首先构件定义了这个构件的组成,最后bulid(构建)的时候把构件需要的东西全部打包到编译输出目录下。可以发现其实最终生成的构件就是一个可以运行的web应用了,到最后tomcat其实就是去运行这个构件的哈。
接下来,我们配置一下tomcat服务器。
按照上图的顺序可以配置出一个本地的tomcat服务器,图中关于tomcat的选项其实都很重要,涉及到了一些配置设置啊,更新应用代码、资源时触发的事件啊,是否自动打开浏览器这类的操作,等等。最后,点击4,把web应用给部署到tomcat上
点击加号,就可以添加刚刚写的那个web应用构件了。请注意看2,2规定了在启动服务器之前要做的事,包括构建整个项目、构建web构件和激活工具窗口,了解这点是十分重要的。到此,可以大致的梳理出idea是如何启动web服务器和发布项目的了。首先把整个项目的源码进行编译,然后输出到了编译输出目录下。然后进行组件的构件,如何构建前面已经讲过,在这一切都准备就绪后tomcat服务器启动,打开浏览器就可以访问了。
第二种idea使用tomcat的步骤到此也介绍完毕了,我相信很多人大致明白了idea到底在做什么事了:idea把web应用视为一个构件,在启动web服务器之前生成构件发布到web服务器中。好的,现在只剩下最后的一个问题了,idea是如何将构件发布到tomcat服务器中的??
idea是怎么把程序部署到tomcat上去的。
我们启动之前配置好的tomcat服务器。
这是启动服务器时tomcat输出的一段日志,可以看到idea指定的Catalina_base目录是比较特殊的,这是idea自动生成的基于不同项目的一个文件夹。对tomcat比较熟悉的朋友应该知道base这个环境变量,在tomcat的配置中其实是用于配置多tomcat实例的,通俗的讲,idea在这里其实是配置了一个新的tomcat实例,实例所需文件的位置就在base指向的那个文件夹中。idea巧妙的使用这种多实例的方式来启动服务器,使得每个项目都可以独立拥有一个tomcat的实例。
接着,谈谈idea是怎么把web应用放上去的吧。将应用部署到tomcat的方式有很多种,比如直接将war包放到webapps目录下,这种是最简单粗暴的了。还有一种更好的方式就是,在conf/catalina/localhost目录下配置xml文件,xml文件的名字是项目名称,内容是访问web应用的虚拟路径和web应用的所在路径。其实idea就是基于这种方式来进行项目的部署的。
总结
洋洋洒洒地叙述了idea是如何启动tomcat的哈哈,最后再总结下吧。首先在idea中创建一个web应用的构件,然后配置本地的tomcat的服务器,在启动服务器之前idea会把构件生成放到编译输出的out目录下。启动tomcat服务器时idea实际是生成了一个基于项目的tomcat实例,这个实例项目部署的方式是通过配置文件的方式配置的。文件中描述的web应用的所在路径也自然而然写的是编译输出的那个目录。最后tomcat服务器启动,web应用也得以成功的部署。
不得不说idea这种设计方式很巧妙,它默默地为程序员做了好多事,哈哈。
不足
idea这个工具中涉及到的很多概念,直到现在还是一知半解,哈哈。比如module、artifact、facet,以及他们之间的联系。idea是一个强大的工具,俗话说,磨刀不误砍柴工,对这个工具的熟悉还有很长的路要走呢!大家共勉吧。