JavaRush /Java 博客 /Random-ZH /没有悲情。让我们来谈谈 Java EE、servlet 及其容器
eGarmin
第 41 级

没有悲情。让我们来谈谈 Java EE、servlet 及其容器

已在 Random-ZH 群组中发布
在这个主题中,我想坦白地谈谈我对 servlet 的理解,什么是 servlet 容器,大多数(如果不是全部)Web 前端框架是什么,并且还涉及到 servlet 容器和应用程序服务器如何关联的主题彼此,以及 servlet 和 Web 服务器容器。 没有悲情。 让我们来谈谈 Java EE、servlet 及其容器 - 1在开始对话之前,我想指出,我真的希望进行讨论,因为…… 这里我不想给出任何代码,只是想触及本质,而本质总是可以用语言来表达的。我将尝试概述我刚开始时不清楚的所有要点。当我在各种论坛上询问有关 Tomcat servlet 容器与任何应用程序服务器(例如 WebSphere 或 Geronimo)有何不同的问题时,唯一敢于回答的人都是混蛋,他们除了“看看 Wikipedia”或“很难说,服务器应用程序 - 这是企业应用程序的复杂基础设施,......”等等等等。我无法忍受这样的人,我猜你们大多数人也不能忍受。我们将纠正历史的不公正。去…

小服务程序

不管别人怎么说,Servlet 都是用 Java 编写的网页。有人会说我错了,Servlet 是一个 Web 应用程序,这些概念之间存在差异,但事实并非如此。现在没有区别了,用 PHP 编写的网站也可以安全地调用 Web 应用程序。现在这是完全自然的,因为…… php 完全支持 OOP,Joomla 等 CMS 也积极使用这一点。什么是代码级别的 Servlet?该类具有许多休眠方法,并查看是否有人通过 GET 或 POST HTTP 请求访问它们。那些。我们在浏览器中输入一些 GET 请求,servlet 类的相应方法接受它,然后以 HTML 页面的形式生成对其的响应。在传统意义上的 servlet 中,正如 Sun 所设想的那样,该页面被逐行发送到客户端,从行 <!DOCTYPE htm>> 开始,到行 </html> 结束。所以在Java中有一个基本的servlet类叫做Servlet. 此外,还有许多其他类继承自该基类,从而扩展了其功能。这就是 Servlet——仅此而已。它只是 PHP 代码的 Java 类似物,同样在服务器上执行,并且仅以网页形式对 Web 浏览器请求的响应发送到客户端。全部。

Web 前端框架

副标题很复杂,通常他们只写前端框架,甚至是Web 枪口,但我决定在这里强调,当我们谈论前端框架时,我们谈论的是通过 Web 浏览器使用 Java 的 GUI。那些。这里我们再次讨论 Java 中的网站,即 关于servlet。几乎任何前端框架都是什么,例如Apache Struts。它只是一组扩展基类的类Servlet。而已。那些。这只是创建相同常规 servlet 的不同方式。只是这个框架的开发者(或者换句话说,这个技术的开发者)认为他们在基类中添加Servlet一些方法对于程序员来说比Sun/Oracle的经典servlet的微薄功能更方便有。

JSP 页面

Java servlet 概念的开发人员几乎立刻就想到了另一个想法。由于我们正在编写一个servlet,其任务是发送一个html页面到客户端,那么立即编写这个html页面可能会更正确,而如果您需要Java中的某种逻辑,那么只需直接插入即可到 html 中。如果还没有变得更清楚,那么这句话可能会有所帮助:jsp 页面是 php 页面的类似物。难的?那我再解释一下。当我们用PHP编写页面时,我们要做什么?我们有静态 html,当我们需要在 PHP 中插入任何逻辑(例如循环和条件)时,我们将其插入到标记的主体中 <?php … ?>。对于jsp,一切都是一样的,只是逻辑是用纯Java编写的,其代码被插入到标签的主体中<% … %>。让我们再次回到 Servlet 的概念。本质上,JSP 页面是一个servlet,但编写方式略有不同。在常规 servlet 中,我们编写一个方法来执行一些逻辑,并根据其结果为客户端生成 HTML 页面。只是过了一段时间,servlet开发者开始思考:如果方法中几乎没有任何逻辑,几乎只发生html页面的形成,那么立即将html页面写入其中不是更容易吗?哪个可以使 Java 插入最少?代码。好吧,关于 jsp 页面的最后一件事。第一次访问这样的页面时,它会被编译成 servlet,然后执行。对该 jsp 页面的后续请求将会更快,因为 它已经被编译并且只需要执行。

小服务程序容器

所以我们写了一个servlet类或者一个JSP页面。下一步是什么?如何将它们推送到 Web 服务器(例如 apache),以便将它们发送到用户的 Web 浏览器?Web服务器只能发送html,如果我们的页面有php代码,那么Web服务器首先将页面传递给解释器,将php翻译成html,然后将结果发送到客户端。Servlet 也会发生同样的事情 - 在发送之前,需要执行它们才能生成 HTML 页面,而 servlet 容器正是负责执行 servlet 和 jsp 页面代码的东西。那些。java servlet 容器类似于 Web 服务器中的 php 解释器模块。因此,当用户在 Web 浏览器中输入地址时,请求将发送到 Web 服务器,Web 服务器了解正在请求 Servlet,并将请求传递到 Servlet 容器。此后,servlet 容器执行 servlet,将生成的 HTML 页面发送到 Web 服务器,然后 Web 服务器将其返回给客户端。Servlet 容器可以独立运行吗?没有网络服务器?像 Tomcat 这样的东西绝对可以。如果我们想要创建一个除了基于 servlet 的页面之外没有任何其他 html 页面的站点,那么 servlet 容器对我们来说就足够了。但是,如果我们想要将 servlet 和 PHP 页面等站点结合起来,那么我们就必须安装 Web 服务器。此外,并非所有 Web 服务器都默认包含 servlet 容器,但几乎所有服务器都允许您将其作为插件安装。因此,如果我们想在 Internet 上的某个主机(Apache 最有可能运行的地方)上启动我们的网站,那么我们必须询问提供商 servlet 容器是否已连接。

JavaEE

有所谓的JavaSE(Java标准版)。这个概念包括所有类java,使用它们时我们只需要导入它们(例如,java.util.Date),甚至不需要这样做(例如,String因为它位于包中java.lang)。还有 Java EE(Java 企业版)。这些类也属于Sun/Oracle,但唯一的区别是它们更难在项目中开始使用。一条简单的线import…是不够的,因为...... 该项目将无法编译。为了纠正这种情况,您需要找到javaee.jar库文件并将其包含在项目中。这可以通过开发环境中的项目属性来完成。人们常说,这个连接过程被称为:在项目的 构建路径类路径中注册一个jar昵称。

应用服务器

现在假设我们已经编译了使用 Java EE 的 servlet 项目。一切都很棒,但我们现在需要将编译后的类放入 servlet 容器中。假设他们做到了。我们的应用程序会起作用吗?答案是不。当访问servlet时,会抛出异常,表明某些类没有找到。为什么?因为我们通过滑动“欺骗”了编译器javaee.jar в classpath,即 编译器看到 Java EE 中的类已就位并平静下来,但 servlet 容器看不到这些类,但它看到来自我们的 servlet 的到它们的链接。这种情况可以在 servlet 容器中解决吗?当然可以,只需要将javaee.jar库文件添加到servlet容器中我们的servlet所在的文件夹中即可。现在想象一下,会有很多这样的项目,并且它们都运行在一个 Tomcat servlet 容器中。这意味着您必须将此 jar 文件复制到每个 servlet 的文件夹中。这是不方便且错误的。通过引入应用程序服务器的概念解决了这种情况,其中该文件长期以来一直处于单个副本中,并且所有 servlet 都可以访问它,并且没有自己的副本。在我看来,这是非常方便和符合逻辑的。当然,所有的麻烦都不是由于一个 jar 文件(我以它为例)——有很多这样的文件。但这并不是应用程序服务器为我们提供的全部内容。应用程序服务器本身可以维护与许多资源(例如数据库)的连接。同时,我们的servlet本身可能不会打开这样的连接,而只是从应用程序服务器获取它。在 servlet 容器中,这是不可能的,因为...... 在某种程度上,容器是一个精简的应用程序服务器。在容器中,Servlet 必须始终创建与数据库本身的连接。像这样的东西... 战争档案 什么是战争档案?WAR 是网络存档。事实上,它只是一个 zip 文件,就像任何 jar 一样。基本上,这只是将我们的网站(包含许多网页、jsp 页面和 servlet 类)塞入一个 zip 文件的一种方法。 web.xml web.xml 就是所谓的部署描述符。这是一个文件,愚蠢地描述了哪个 Web 浏览器线路请求发送到哪个 servlet 类进行处理,以便 servlet 容器不会混淆,哪个 servlet 负责什么。一般来说,在 Java 中,在各种 xml 文件中描述设置是非常流行的,但最近出现了放弃这种传统的趋势。你问如何?并通过注释。注释类本身不执行任何操作;创建它们只是为了描述各种设置(元数据),而不是在单独的 xml 文件中,而是直接在代码中。非常舒服。然而,现在有一个中间阶段,有些设置是通过注释指定的,有些是通过 xml 指定的,这可能会令人困惑,因为 您查看 xml 并看到一个设置,但根据注释还有另一个设置。哪一个具有最高优先级?谁知道…

结论

写完这篇文章后,我认为如此快速的评论对任何人都没有帮助,因为...... 不包含任何细节,也没有示例,但另一方面,不要删除所写的内容,所以就这样吧。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION