【问题标题】:Difference between Tomcat and my JSP/Servlet app?Tomcat 和我的 JSP/Servlet 应用程序之间的区别?
【发布时间】:2018-11-24 02:47:16
【问题描述】:
我正在学习 JSP 和 Servlet,我是初学者。我试图了解服务器、应用程序服务器、Tomcat 和我的 Servlet 应用程序之间的区别。
例如,我在教程中找到了以下信息:“Web 浏览器可能是客户端,而托管网站的计算机上的应用程序可能是服务器。客户端(浏览器)提交 HTTP向服务器请求;然后服务器向客户端返回响应。”
服务器到底是谁? Tomcat是服务器吗?还是我的 Servlet/JSP 应用程序是服务器?我知道我的 JSP/Servlet 应用程序将响应发送回客户端,然后我认为它是服务器……而 Tomcat 是谁,它到底是做什么的?
提前致谢!
【问题讨论】:
标签:
java
jsp
tomcat
servlets
【解决方案1】:
服务器是一个在调用时提供响应的程序。 Tomcat 是一个服务器,它侦听 http 请求,将它们路由到负责的应用程序,然后当应用程序处理完响应后,服务器将其发送回客户端。
Tomcat 被称为 servlet 容器,因为它提供了一个 servlet 可以运行的地方;它提供了应用程序完成工作所需的基础设施。它侦听特定套接字上的请求并处理与客户端通信所需的 I/O。 Web 应用程序实现指定的接口,以便 servlet 容器可以知道调用它们。 Web 应用程序通常将 servlet 作为其使用的任何 Web 框架的一部分,其中 servlet 将请求分派给处理请求的控制器对象。必须为任何事情编写自己的 servlet 应该很少见。
JSP 是一种用于创建已过时多年的视图的遗留技术。
【解决方案2】:
Tomcat 基本上是一个 servlet 容器 和一个 Web 服务器(因为它能够使用其内部 Coyote HTTP 服务器处理 HTTP 请求)。
这意味着它管理您的 servlet、JSF 和 JSP(后者也隐式转换为 servlet)。它实现了Java Servlet API,也可以用作HTTP服务器来处理对静态WEB页面的调用。
通过在 Tomcat 上部署 servlet,您可以将它们放在容器中,然后容器将管理其功能的所有边缘,包括生命周期。在您的问题上下文中,Tomcat 和您的应用程序都可以被视为“服务器”。
Tomcat 还用作 JBoss 和 GlassFish 应用服务器中的参考 servlet 容器。
可能更清楚的现实场景:
您购买了一张 DVD 并想观看它。 DVD(一个 servlet)本身不能用于直接观看电影(它没有显示器、扬声器或其他任何东西,它只是一个数据载体)。因此,您需要一个合适的 DVD 播放器(根据我们的上下文是一个容器)来播放它。您将 DVD 插入播放器(部署您的 servlet)并观看电影(使用您的 Web 应用程序)。在这种情况下,您不必担心它是如何工作的,只需将磁盘放入播放器中,然后让它处理其余的事情。
【解决方案3】:
在现实世界中,服务器(也称为 Web 服务器)和应用程序服务器是两个不同的东西,但可以协同工作:
关于Servlet/JSP,它们既不是服务器也不是网络应用程序。这些是 Web 应用程序的基本部分(WAR 文件或目录中的分解 WAR)。
Web 应用程序(Java 中的 WAR)部署在应用服务器(Java 中的 Servlet 容器)上。 Tomcat 和 Jetty 代表了这种服务器。
这些服务器通常出于多种原因依赖 Web 服务器:提供 HTTP 静态资源(图像、css、js...)、代理优势、SSL 等等...
这是请求及其响应如何通过不同节点传输的架构(括号中的数字表示序列中的顺序):
网页浏览器 |网络服务器 |雄猫 |以网络应用为目标
http请求:req (1) -> req (2) -> req (3) -> req (4)
http响应:res (8)
请注意,在本地环境中,您可能没有使用 tomcat 配置的 Web 服务器。因此,您可以将此节点视为架构中的可选节点。
附带说明一下,在 Java 世界中,您还拥有真正不同的 Java EE 服务器。他们必须实施 JEE 服务器标准。 JBoss、Glassfish 或 Weblogic 就是其中的示例。
这些是 Servlet Container 的替代品,但越来越少地使用较重。
【解决方案4】:
一个servlet-container只支持servlet API(包括JSP、JSTL)。
应用服务器支持整个JavaEE - EJB、JMS、CDI、JTA、servlet API(包括JSP、JSTL)等。
可以在 servlet 容器上运行大多数 JavaEE 技术,但您必须安装特定技术的独立实现。