当前位置: 首页 > 后端技术 > Java

踩坑-Tomcat(servlet)在启动时执行了两次(loading)

时间:2023-04-01 23:42:09 Java

博客不知道大家在运行或者启动项目的时候是否遇到过使用Tomcat时页面被执行两次的问题。它可能已经发生,但你没有意识到。先看看是什么问题。问题演示这是一段jsp代码。说实话,这东西有点老了。如果你不懂jsp,请听我解释这段代码。我们定义一个全局变量i,i=0。我们定义一个无参数无返回值的方法voidadd(),它使用i++来添加自身。我们在下一句中称这个方法为add()。然后在页面输出i的值。我刚开始认为答案必须是1,它必须是1。但是,当我运行它时,我发现了。???其实是2?我什至怀疑是代码的问题……于是我在add()方法中输出日志。我发现不是将i更改为2,而是调用了两次add()方法!但是代码明明只调用了一次?我去浏览器搜索相关案例,发现有几个案例,哈哈哈,浏览器无所不能。经过一系列排查,发现Tomcat为你的项目跑了两次。为什么要运行两次?因为你的项目本来是放在Tomcat默认的webapp目录下的(tomcat启动的时候肯定会加载一次),然后在server.xml里面配置一下。再加载一次即可),结果Tomcat会加载两次。你可能没有把项目放在webapp目录下,但是你的IDEA工具已经给了你一个项目映射,将你的项目映射到webapp。也可以说,Tomcat启动时,先加载appBase配置的webapps目录下的item,然后再加载docBase配置的item,因为docBase的相对路径(/xxx)在webapps目录下,所以将被加载两次。总的来说,Tomcat的sever.xml的配置做了一个无用功,导致运行了两次。怎么解决?首先,我们有三种方法,我们一一说。首先记住这两个是什么:docBase是web应用和本地路径,path是Tomcat访问应用的URL路径。第一种方法:1、不要把hello应用放在Tomat默认的webapp目录下,将其移出,然后修改server.xml中docBase的值为项目所在位置的绝对路径。在Tomcat的conf目录下,在server.xml的节点中添加:第二种方法把server.xml里面手动配置的Context去掉,这样就不会加载两次,因为项目在webapp下,所以访问的时候只能是:http://ip:通过这种方式访问??端口/项目地址。如果说你的项目已经移动到webapp目录下了,但还是老样子,那你的IDEA配置应该还是映射状态。就这样:这个还是映射状态,至于怎么配置请自行研究,我是直接到Tomcatbin启动的。第三种方法是在Tomcat的conf目录下新建Catalina(注意大小写)\localhost目录,并在该目录下新建xml文件。名字可以随意取,只要和当前文件中的文件名不一样即可。xml文件的内容是:最后的jsp是一个非常古老的技术。不是特别喜欢,但是发现问题对自己来说是一个很好的提升,所以我觉得这次是值得的,虽然这个技术不是特别重要。好的程序被修改,好的错误被发现。