带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序

标签 java jakarta-ee web-applications

Java EE 应用程序是否需要具有 Web 服务器(例如 SUN Java Web Server)来处理 servlet/jsp 请求并转发到应用程序服务器(例如 IBM WebSphere 或 BEA WebLogic)?

既然应用服务器也能够处理这样的 servlets/jsp?

这种服务器架构的优点/缺点是什么?

最佳答案

Apache TomcatJettySun Java System Web Server 只是 Java Web (Servlet) 容器,这意味着它们只能执行 Servlets/JSP - 它们不提供完整的 Java EE API 堆栈。

因此,他们只能部署 .war 文件,不能部署 .ear(这也包括带有 EJB 的 .jar 模块),并且不支持开箱即用的某些 Java EE API,例如 JSF 或 CDI。或其他功能/API。 重要的是要注意,自 Java EE6 以来,.war files may contain EJBs . More info on differences about .war and .ear .


每个 Java EE 服务器都有一个 Web 容器 + EJB 容器。 (你可以看到 herehere Tomcat 和 Jetty 没有声称是 JavaEE 服务器,只是 servlet (web) 容器。)

JBoss Application Server 使用 JbossWeb(Apache Tomcat 分支)作为其 Web 容器。它的 EJB 容器就是 JBoss(除了“JBoss EJB 容器”之外,它们没有单独的名称)。

其他的(IBM WebSphere、Oracle/BEA WebLogic、TomEE、Glassfish)也有他们的 web 容器 + EJB 容器。

TomEE 显然使用 Apache Tomcat 作为其 Web 容器。 Glassfish 还使用 Apache Tomcat 分支。 (是的,Apache Tomcat 似乎很流行:)

在下面的讨论中,您可以随时将 Tomcat 更改为“Web Container”,将 JBoss 更改为“Fully capable Java EE Server”。 (为清楚起见,我使用了产品名称。)

JavaEE Server Containers

图片:Java EE 服务器和容器 - 来源:Java EE 教程。

What are the (dis)advantages of having Java Web Servers (such as Tomcat) handling the Servlet/JSP calls and forwarding more complex requests to Application Servers such as JBoss (or IBM WebSphere or BEA WebLogic)?

从功能的角度来看,没有有效的增益

如果您将 Tomcat 放在 JBoss 之前,您实际上是将 Tomcat 放在 JBossWeb(Web 容器,因此是每个 Web 应用程序的入口)它总是在 JBoss 的 EJB 容器之前。如果我们谈论的是功能,那只是多余的,因为我们有两次提供相同的服务。

切换实现者或集群功能

如果他们仅将 JBoss 用于其 EJB 容器,则在 JBoss 之前放置 Tomcat 是有意义的:那么,此处的选择将是 Web 容器实现程序中的简单切换。

此外,如果 Tomcat 位于不同的网络节点(或多个 Tomcat/节点),则可以应用集群功能(否则不能,因为 JBossWeb 和 JBoss 通常被视为一个节点,因此进入同一台机器)。

提供静态内容和安全问题

非常常见的是将 Web 服务器(例如 Apache HTTPD 或 IIS)放在 Java Web 容器之前。这样做的主要动机有两个:

  • 使 HTTPD 提供静态内容(例如图像)并将其余内容转发给 Java 网络容器。这样做是因为 Web 服务器通常在交付静态内容的任务上得到了更好的优化。
  • 安全性:仅在 DMZ 中公开 HTTPD。可以在 DMZ 中设置 Apache HTTPD,并使其简单地将所有内容转发到 Web 容器(Tomcats 等)和 JavaEE 服务器(JBosses 等)。

如果想要增加安全性,在 DMZ 中使用 Web 容器是没有意义的:如果它正在为应用程序提供服务(即,将 .war 文件部署到其中),则应用程序是仍然“脆弱”;如果它只是转发请求/响应,那么 Apache HTTPD 是更好的选择!

关于带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15997202/

相关文章:

java - 将资源包读取为 UTF-8。 getString() 方法似乎将编码更改为 ISO-8859

java - 防止 Java 插件尝试下载 pack.gz 版本的存档

java.net.UnknownHostException : <<hostname>> : unknown error

Java EE 6 程序安全性、glassfish 和 JDBC 领域

android - 将 Web 应用程序连接到 mysql 数据库

java - Hibernate:无法加载在 Hibernate 配置 <mapping/> 条目中声明的类

java web 应用程序架构,很多 war 在耳朵里,或者一场 war 有很多 jar

java - 访问servlet时出现HTTP错误503

javascript - 如何在移动页面末尾自动显示 "load more"

java - 来自 javax.print 库的不一致结果