博客

不晓得大家在应用Tomcat时,有没有遇到过运行或者启动我的项目时,页面被执行了两次的问题。

可能产生过,然而你没有发现。

首先看一下问题是怎么样的。

问题演示

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

咱们定义一个全局变量ii = 0

咱们定义一个无参无返回值办法,void add(),这个办法中应用i++来自加。

咱们在下一句,add()调用这个办法。

而后将i的值输入在页面。

我刚开始感觉答案必定是1,也必须是1

然而,当我运行起来发现。

????竟然是2?

我甚至狐疑是代码的问题......

于是我在add()办法外面输入一下日志。

我发现,这不是之间将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的配置做了一次无用功,导致运行了两次。

如何解决?

首先,咱们有三种办法,咱们一个个说。

先记住这两个是啥:

docBase是web利用和本地门路,pathTomcat拜访这个利用的URL门路。

第一个办法

方法1、不要将 hello 利用放在Tomat的默认webapp目录下,把它移出去,而后在server.xml批改docBase的值为我的项目所在位置的绝对路径就能够了。

在Tomcat中的conf目录中,在server.xml中的,<host/>节点中增加:

<Context path="我的项目的URL门路" docBase="Web利用和本地门路" debug="0" privileged="true"> </Context>

第二个办法

删除掉server.xmlContext 的手动配置,这样就不会加载两次,因为我的项目在webapp下,所以在拜访时,就只能是:http://ip:port/我的项目地址 这样来拜访了。

如果说,你我的项目曾经移入了webapp目录,然而还是一样,那你IDEA配置应该还是映射状态。

就像这样:

这样依然处于映射状态,至于怎么配置请自行钻研,我是间接去Tomcatbin外面启动的。

第三个办法

Tomcatconf目录中,新建 Catalina(留神大小写)\localhost目录,在该目录中新建一个xml文件,名字能够随便取,只有和以后文件中的文件名不反复就行了,该xml文件的内容为:

<Context path="我的项目的URL门路" docBase="Web利用和本地门路" debug="0" privileged="true"> </Context>

尾述

jsp是一个很老的技术,我不是特地喜爱,然而找到一个问题是对本人很好的一个晋升,所以我感觉这个工夫很值,只管这个技术不是特地重要。

好的程序是改进去的,好的bug是找进去的。