踩坑-Tomcat(servlet)在启动(加载)是执行两次

博客
不知道大家在使用Tomcat时,有没有遇到过运行或者启动项目时,页面被执行了两次的问题。
可能发生过,但是你没有发现。
首先看一下问题是怎么样的。
问题演示
踩坑-Tomcat(servlet)在启动(加载)是执行两次
文章图片

这是一段jsp代码,说实话这玩意有点老了,不懂jsp的请听我解释这一段代码。

我们定义一个全局变量ii = 0
我们定义一个无参无返回值方法,void add(),这个方法中使用i++来自加。
我们在下一句,add()调用这个方法。
然后将i的值输出在页面。
我刚开始觉得答案肯定是1,也必须是1
但是,当我运行起来发现。
踩坑-Tomcat(servlet)在启动(加载)是执行两次
文章图片

????居然是2?
我甚至怀疑是代码的问题......
于是我在add()方法里面输出一下日志。
踩坑-Tomcat(servlet)在启动(加载)是执行两次
文章图片

我发现,这不是之间将i变成了2,而是add()方法被调用了两次!
可是代码里面明明只调用一次啊?
我去浏览器搜索相关案例,发现还真有几例,哈哈哈,浏览器万能。
经过一系列排查,发现是Tomcat针对你的项目运行了两次。
原因
为什么会运行两次呢?
因为你的项目本来就放在Tomcat的默认webapp目录下(tomcat在启动时肯定会加载1次),然后又在server.xml中做了配置,为了达到访问根就可以访问你的项目(这样Tomcat就又加载1次),结果,Tomcat就会加载两次。
你可能也并没有将项目放到webapp目录下,但是你的IDEA工具给你了个项目映射,将你的项目映射到了webapp下。
也可以这样说,Tomcat启动时,先加载appBase中配置的webapps目录下的项目,然后再去加载docBase中配置的项目,因为docBase的相对路径(/xxx)是在webapps目录下,所以会被加载两次。
总的来说,就是Tomcatsever.xml的配置做了一次无用功,导致运行了两次。
如何解决?
【踩坑-Tomcat(servlet)在启动(加载)是执行两次】首先,我们有三种方法,我们一个个说。
先记住这两个是啥:
docBase是web应用和本地路径,pathTomcat访问这个应用的URL路径。
第一个方法
办法1、不要将 hello 应用放在Tomat的默认webapp目录下,把它移出去,然后在server.xml中修改docBase的值为项目所在位置的绝对路径就可以了。
在Tomcat中的conf目录中,在server.xml中的,节点中添加:

第二个方法 删除掉server.xmlContext 的手动配置,这样就不会加载两次,因为项目在webapp下,所以在访问时,就只能是:http://ip:port/项目地址 这样来访问了。
如果说,你项目已经移入了webapp目录,但是还是一样,那你IDEA配置应该还是映射状态。
就像这样:
踩坑-Tomcat(servlet)在启动(加载)是执行两次
文章图片

踩坑-Tomcat(servlet)在启动(加载)是执行两次
文章图片

这样仍然处于映射状态,至于怎么配置请自行研究,我是直接去Tomcatbin里面启动的。
第三个方法 在Tomcatconf目录中,新建 Catalina(注意大小写)\localhost目录,在该目录中新建一个xml文件,名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为:

尾述
jsp是一个很老的技术,我不是特别喜欢,但是找到一个问题是对自己很好的一个提升,所以我觉得这个时间很值,尽管这个技术不是特别重要。
好的程序是改出来的,好的bug是找出来的。

    推荐阅读