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

简介: 不知道大家在使用Tomcat时,有没有遇到过运行或者启动项目时,页面被执行了两次的问题。

不知道大家在使用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是找出来的。

相关文章
|
7月前
|
前端开发 应用服务中间件 C++
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(二)
|
8月前
|
安全 Java 应用服务中间件
【JavaWeb】Tomcat底层机制和Servlet运行原理
网络通信:Tomcat使用Java的Socket API来监听特定的端口(通常是8080),接收来自客户端的HTTP请求。 线程池:Tomcat使用线程池来处理并发的请求。当有新的请求到达时,Tomcat会从线程池中获取一个空闲线程来处理该请求,这样可以提高处理效率。 生命周期管理:Tomcat负责管理Servlet和其他Web组件的生命周期,包括初始化、请求处理和销毁等阶段。(init(), run())
|
6月前
|
缓存 JavaScript 应用服务中间件
Nginx+Tomcat代理环境下JS无法完全加载问题
Nginx+Tomcat代理环境下JS无法完全加载问题
|
4天前
|
XML 前端开发 Java
Tomcat和Servlet
Tomcat和Servlet
6 0
|
7月前
|
JSON 前端开发 JavaScript
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。(一)
使用Servlet实现表白墙网站(前后端互联)小项目,Mac的M1(没有setting)在哪里找到Setting页面,下载smart tomcat及smart tomcat的配置。
|
4月前
|
前端开发 Java 应用服务中间件
HTTP&Tomcat&Servlet
HTTP&Tomcat&Servlet
59 0
|
7月前
|
Java 应用服务中间件 Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
HTTPS && Tomcat && Servlet && 博客系统 && 软件测试的概念 && Linux
29 0
|
8月前
|
Java 数据库连接 应用服务中间件
java-初识Servlet,Tomcat,JDBC
我们在此文章知道了servlet 是基于Java语言编写的服务器端程序,可以处理Web容器(如Tomcat)发送过来的HTTP请求,也写了实例代码,另外servlet的过滤器,可以用来处理请求前与请求后的一些逻辑。;接着简单了介绍了tomcat,知道Tomcat 作为一个 Web 服务器,可以通过 Servlet 容器来管理和运行 Servlet;最后介绍jdbc,以及jdbc连接数据库的实例代码。
54 0
|
8月前
|
Oracle Java 关系型数据库
Jsp/Servlet中tomcat基础配置
Jsp/Servlet中tomcat基础配置
59 0
|
9月前
|
XML Java 应用服务中间件
【计算机网络】Tomcat和Servlet基础知识汇总
【计算机网络】Tomcat和Servlet基础知识汇总