关于java:踩坑Tomcatservlet在启动加载是执行两次

3次阅读

共计 1496 个字符,预计需要花费 4 分钟才能阅读完成。

博客

不晓得大家在应用 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 是找进去的。

正文完
 0