用tomcat执行web应用

Posted

技术标签:

【中文标题】用tomcat执行web应用【英文标题】:Executing web application with tomcat 【发布时间】:2012-09-06 13:02:45 【问题描述】:

我已经开始使用 tomcat 7 几天了。我试过用它执行许多基于 JAVA 的 Web 应用程序。我实际上想检查基于 java 的 Web 应用程序的流程。这意味着 Web 应用程序的方法按什么顺序执行。为此,我使用 java profiler 分析 tomcat 服务器。

我的分析器是这样工作的:

    我将应用程序的 war 文件部署到 tomcat 的 web Apps 目录中。 我通过./startup.sh启动服务器 我在浏览器中访问应用程序并执行它。 我通过./shutdown.sh 停止服务器。

在我停止服务器后,分析器以 xml 格式转储输出(它将方法的层次结构显示为调用上下文树)。(我的分析器基本上分析了 java 类的方法。)

如您所知,可能是因为 Tomcat 基于 servlet,对于应用程序的 2 次完全相同的运行(我按照上述 4 步操作 2 次,对于 2 次相同的运行有 2 个不同的输出),分析器给出不同的输出。 Q.1)我不知道为什么会发生这种情况,很想知道背后的原因。

即使对于简单的应用程序,输出也非常大(大约 200 MB)。为了限制输出的大小并为 2 次完全相同的运行提供相同的输出,我从分析中排除了 org.apache.* 的方法。因为我最终对了解 Web 应用程序本身的流程感兴趣。(了解 Web 应用程序的哪些顺序方法被执行)。对于这种情况,我有以下问题。

Q.2) 通过部署 war 文件运行应用程序并通过从目录本身获取它来运行它可以对分析器的输出产生影响?还是会影响它们在这两种情况下执行的一系列方法?

Q.3) 我想知道当我执行一个应用程序的jsp页面时会发生什么?我的意思是tomcat如何执行它们?请逐步明智....

Q.4) 在执行应用程序后检查分析器的输出时,我看到 org/eclipse/jdt/internal/... 中的大量方法没有被执行。那么这些类实际上是做什么的呢?为什么我的输出中有它们?

如果我未能解释我的问题,请告诉我。我搜索了很多,但找不到非常准确的问题答案。

非常感谢您的回复..

谢谢。

【问题讨论】:

关于 Q4:org.eclipse.jdt... 类是 Tomcat 用来编译它从 JSP 文件生成的 Java 代码的。 【参考方案1】:

我强烈建议阅读一些关于 tomcat 工作的内容。总之

Q.2应该没什么区别。

Q.3 JSP 在被调用时被编译为 servlet 类。如果 JSP 中没有 Servlet 类,则 tomcat 制作一个。如果有对应的servlet类,tomcat看哪个更年轻,是JSP还是servlet。如果 JSP 更年轻,它会进行新的编译,否则使用 servlet。

Q.1不确定。可能是多线程/定时的事情,也许这是您的分析器的工作方式。

Q.4不确定。可以是您的 servlet 代码使用的分析器或库中的类吗?

编辑:对于Q.4,请查看 Ian Roberts 对该问题的评论。

您使用什么分析器?如何通过调试逐步完成代码?

【讨论】:

感谢您的回复。您能否建议一些很好的资源来解释 tomcat 的工作原理? Q-4:它们肯定不是来自我的分析器。伊恩·罗伯茨可能是真的。我使用 jp2-2.1 分析器,它根本没有被广泛使用,因此互联网上没有关于它的信息。和调试它,是一种差异,我猜。只是一个问题,在回答 Q-3 时,年轻班是什么意思。你的意思是最新编译的课程吗? 我的意思是,tomcat 会检查后来更改的内容 - JSP(源代码)或 Servlet(编译代码)。如果后来tomcat知道JSP改了,就需要重新编译,否则可以重新使用编译好的servlet类。当然,伊恩·罗伯茨是对的。如果你愿意,你可以谷歌它。 要了解 servlet/servlet 容器,请从以下***条目开始:en.wikipedia.org/wiki/Java_Servlet 其他一切都将在 google 的帮助下进行。

以上是关于用tomcat执行web应用的主要内容,如果未能解决你的问题,请参考以下文章

实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署

Tomcat简介

Tomcat 部署Web应用

如何在Linux下使用Tomcat部署Web应用

在 tomcat 容器中具有多个 Web 应用程序的 Spring Boot 执行器引发 javax.management.InstanceAlreadyExistsException 异常