本地 Web 应用程序中 Web 服务器的用途是什么?
What is the purpose of web server in a local web application?
我敢肯定这听起来很傻,但对于像我这样的新手来说,这让我的大脑很虚弱,如果不清除它我就无法继续我的任务。
假设我正在构建一个简单的 java 命令行计算器应用程序,它接受 2 个数字和一个运算符作为输入,returns 将运算结果返回给用户。现在,我想在它之上构建 GUI(类似于在线计算器)。为此,我决定构建一个 Web 应用程序,以便我可以在浏览器上打开该应用程序并无缝使用它。它导致我脑海中出现以下问题
- 我是否必须在 java 中构建 Web 服务器以允许前端 end/GUI 和后端之间进行通信?没有与任何其他网络的通信,它是严格本地的;然而我不得不创建一个网络服务器来完成这项工作,这让我很困惑。还是我需要一个是因为我决定构建一个要在网络浏览器中打开的 web 应用程序?或者完全是其他原因?
- 如果我转而决定构建一个 windows/android/mac/ios 应用程序,我是否仍需要构建一个用于通信的 Web 服务器?或者我可以使用类似 swings 的东西(我知道它真的很原始)来做到这一点,这基本上允许 GUI 直接与业务逻辑通信?
- 我知道像 javascript 这样的前端语言允许我自己编写整个计算器的代码,从而消除了对网络服务器的需要。但是,如果我使用后端数据库(如 spotify)构建相对复杂的应用程序怎么办? (在应用程序不需要与其他应用程序通信并且所有数据都存储在本地的相同约束下)这个解决方案仍然有效吗?
简而言之,我无法理解构建整个客户端-服务器基础架构的目的,即使整个事情都是本地和离线的(如果这有意义吗?)。还是我对客户端-服务器的基本理解有缺陷?
即使您可以使用嵌入式 tomcat 应用程序来托管您的应用程序,也并非完全需要烘焙 Web 服务器来托管您的应用程序。但是,使用网络服务器的主要目的是设置您的反向代理,这样您的应用程序就不会暴露,并且您的网络服务器将充当外部请求的端点。
如果在本地网络服务器中托管应用程序根本不需要,当您的应用程序在生产环境中托管时,网络服务器会派上用场。
如果您想使用网络浏览器作为与您的 Java 应用程序交互的工具,那么您需要一个网络服务器。浏览器只是一个应用程序,它尝试与另一个应用程序建立网络连接,并传递一些由 HTTP 协议定义的文本。
为此,您可以选择三种方案:
- 编写接受网络连接、处理 HTTP 并发回响应的应用程序。
- 编写一个 Java 应用程序,使用 Java 18 及更高版本中内置的 very basic web server。请注意,此 Web 服务器并非旨在成为功能丰富或商业级服务器。
- 编写一个 Jakarta Servlet class 运行在带有 Web 服务器的 Servlet 容器之上。根据您的需要,Apache Tomcat 或 Eclipse Jetty 都可以很好地用作 Servlet 容器和 Web 服务器。
对于您的情况,使用 Java JEP 408 的中间选项似乎最合适和最简单。
你说:
There is no communication with any other networks, its strictly local; yet I am having to create a web server to make this work and that is confusing me.
一只Border Collie狗群羊。这是它最基本的基本核心使命。这些绵羊可以在农场的田地里放牧,也可以在您自己的后院就地放牧。
Web 浏览器建立网络连接。这是它最基本的核心使命。这些网络连接可以通过实际网络建立,也可以在单台计算机中本地建立(“localhost”)。
你说:
Or do I need one because I decided to build a web application meant to be opened in a web browser?
是的,根据定义,通过网络浏览器访问的网络应用程序需要网络服务器。
你说:
If I instead decided to build a windows/android/mac/ios application, would I still to bake a web server for communicating?
Or can I use something like swings (I know its really primitive)
Swing 没有任何“原始”之处。它是一个完全开发的功能丰富的 GUI 框架。每个 JDK 都内置了 Swing。 Swing 将在未来许多年内得到支持。
但是,Swing 的设计和功能可能适合也可能不适合您的口味。 Swing 现在处于维护模式。
另一种选择是 JavaFX,现在作为 OpenJFX 库积极开发。
要使用 JavaFX,您必须将 OpenJFX 库添加到您的项目中,或者部署到与 OpenJFX 库(ZuluFX、LibericaFX 等)捆绑在一起的 JDK。
to do this which essentially would allow the GUI to directly communicate with the business logic?
是的,GUI 和您的计算器业务逻辑都是简单的 Java classes,所有对等体,所有 运行 都在同一个 JVM 中。
你说:
I know front-end languages like javascript allow me to code the entirety of the calculator in itself, and as a result eliminate the need of a web server.
是的。您可以编写 Java 脚本代码来实现您的小计算器。此 Java 脚本可以放在带有网页 HTML 的文件的文本中。该网页文件可以通过网络浏览器在本地打开。您的 HTML 和 Java 脚本将呈现。在这种情况下不需要 Web 服务器。
但是这种情况排除了 Java,并且您说您想 (a) 在 Java 中编写计算器,并且 () 使用网络浏览器。所以我们回到上面列出的三个选项。
你说:
However, what if I was building relatively complex application with a backend database, like spotify? (within the same constraint that the application doesn't need to communicate with other applications and all data is stored locally) Would this solution still work?
是的,您可以在本地计算机上部署数据库服务器。然后您可以找到并使用 Java 脚本绑定工具来与该数据库对话。
但是那样的话您就不会使用 Java 及其所有优点了。对于这种情况,我会选择编写一个 JavaFX 应用程序,其中包含一个基于 Java 的嵌入式数据库引擎,例如 H2。这将产生一个单一的一体式可双击应用程序解决方案。
但这将是我根据自己的喜好和技能选择的。其他人可能会选择其他解决方案。
the purpose of building an entire client-server infrastructure even though the entire thing is local and offline
“离线”部分可能会分散您的注意力。
装有 macOS、BSD、Linux、Windows 等现代操作系统的传统计算机始终“在线”,因为它们都维护着一个网络堆栈。一台计算机内的进程可以在本地使用该网络堆栈来相互通信。无论您碰巧插入了以太网电缆,还是打开了 WiFi,对计算机来说都没有什么区别。 OS 中的网络堆栈仍然可用并处于活动状态,无论外部网络访问如何。
因此,客户端-服务器体系结构在在 一台计算机内和在 台计算机之间同样有效。 (实际上,它在本地工作 更快 ,因为跳上跳下网络非常慢。)
为什么要为本地应用选择客户端-服务器架构?或者:
- 您精通并喜欢客户端-服务器架构的工具。
- 您想最终从仅本地移动到联网。
如果这两个都不成立,那么我提到的 JavaFX with H2 解决方案可能更适合 Java 程序员。
顺便说一下,让我为 Vaadin Flow 添加一个插件,这是一个用于在纯 Java 中构建 Web 应用程序的 GUI 框架。
我敢肯定这听起来很傻,但对于像我这样的新手来说,这让我的大脑很虚弱,如果不清除它我就无法继续我的任务。
假设我正在构建一个简单的 java 命令行计算器应用程序,它接受 2 个数字和一个运算符作为输入,returns 将运算结果返回给用户。现在,我想在它之上构建 GUI(类似于在线计算器)。为此,我决定构建一个 Web 应用程序,以便我可以在浏览器上打开该应用程序并无缝使用它。它导致我脑海中出现以下问题
- 我是否必须在 java 中构建 Web 服务器以允许前端 end/GUI 和后端之间进行通信?没有与任何其他网络的通信,它是严格本地的;然而我不得不创建一个网络服务器来完成这项工作,这让我很困惑。还是我需要一个是因为我决定构建一个要在网络浏览器中打开的 web 应用程序?或者完全是其他原因?
- 如果我转而决定构建一个 windows/android/mac/ios 应用程序,我是否仍需要构建一个用于通信的 Web 服务器?或者我可以使用类似 swings 的东西(我知道它真的很原始)来做到这一点,这基本上允许 GUI 直接与业务逻辑通信?
- 我知道像 javascript 这样的前端语言允许我自己编写整个计算器的代码,从而消除了对网络服务器的需要。但是,如果我使用后端数据库(如 spotify)构建相对复杂的应用程序怎么办? (在应用程序不需要与其他应用程序通信并且所有数据都存储在本地的相同约束下)这个解决方案仍然有效吗?
简而言之,我无法理解构建整个客户端-服务器基础架构的目的,即使整个事情都是本地和离线的(如果这有意义吗?)。还是我对客户端-服务器的基本理解有缺陷?
即使您可以使用嵌入式 tomcat 应用程序来托管您的应用程序,也并非完全需要烘焙 Web 服务器来托管您的应用程序。但是,使用网络服务器的主要目的是设置您的反向代理,这样您的应用程序就不会暴露,并且您的网络服务器将充当外部请求的端点。
如果在本地网络服务器中托管应用程序根本不需要,当您的应用程序在生产环境中托管时,网络服务器会派上用场。
如果您想使用网络浏览器作为与您的 Java 应用程序交互的工具,那么您需要一个网络服务器。浏览器只是一个应用程序,它尝试与另一个应用程序建立网络连接,并传递一些由 HTTP 协议定义的文本。
为此,您可以选择三种方案:
- 编写接受网络连接、处理 HTTP 并发回响应的应用程序。
- 编写一个 Java 应用程序,使用 Java 18 及更高版本中内置的 very basic web server。请注意,此 Web 服务器并非旨在成为功能丰富或商业级服务器。
- 编写一个 Jakarta Servlet class 运行在带有 Web 服务器的 Servlet 容器之上。根据您的需要,Apache Tomcat 或 Eclipse Jetty 都可以很好地用作 Servlet 容器和 Web 服务器。
对于您的情况,使用 Java JEP 408 的中间选项似乎最合适和最简单。
你说:
There is no communication with any other networks, its strictly local; yet I am having to create a web server to make this work and that is confusing me.
一只Border Collie狗群羊。这是它最基本的基本核心使命。这些绵羊可以在农场的田地里放牧,也可以在您自己的后院就地放牧。
Web 浏览器建立网络连接。这是它最基本的核心使命。这些网络连接可以通过实际网络建立,也可以在单台计算机中本地建立(“localhost”)。
你说:
Or do I need one because I decided to build a web application meant to be opened in a web browser?
是的,根据定义,通过网络浏览器访问的网络应用程序需要网络服务器。
你说:
If I instead decided to build a windows/android/mac/ios application, would I still to bake a web server for communicating?
Or can I use something like swings (I know its really primitive)
Swing 没有任何“原始”之处。它是一个完全开发的功能丰富的 GUI 框架。每个 JDK 都内置了 Swing。 Swing 将在未来许多年内得到支持。
但是,Swing 的设计和功能可能适合也可能不适合您的口味。 Swing 现在处于维护模式。
另一种选择是 JavaFX,现在作为 OpenJFX 库积极开发。
要使用 JavaFX,您必须将 OpenJFX 库添加到您的项目中,或者部署到与 OpenJFX 库(ZuluFX、LibericaFX 等)捆绑在一起的 JDK。
to do this which essentially would allow the GUI to directly communicate with the business logic?
是的,GUI 和您的计算器业务逻辑都是简单的 Java classes,所有对等体,所有 运行 都在同一个 JVM 中。
你说:
I know front-end languages like javascript allow me to code the entirety of the calculator in itself, and as a result eliminate the need of a web server.
是的。您可以编写 Java 脚本代码来实现您的小计算器。此 Java 脚本可以放在带有网页 HTML 的文件的文本中。该网页文件可以通过网络浏览器在本地打开。您的 HTML 和 Java 脚本将呈现。在这种情况下不需要 Web 服务器。
但是这种情况排除了 Java,并且您说您想 (a) 在 Java 中编写计算器,并且 () 使用网络浏览器。所以我们回到上面列出的三个选项。
你说:
However, what if I was building relatively complex application with a backend database, like spotify? (within the same constraint that the application doesn't need to communicate with other applications and all data is stored locally) Would this solution still work?
是的,您可以在本地计算机上部署数据库服务器。然后您可以找到并使用 Java 脚本绑定工具来与该数据库对话。
但是那样的话您就不会使用 Java 及其所有优点了。对于这种情况,我会选择编写一个 JavaFX 应用程序,其中包含一个基于 Java 的嵌入式数据库引擎,例如 H2。这将产生一个单一的一体式可双击应用程序解决方案。
但这将是我根据自己的喜好和技能选择的。其他人可能会选择其他解决方案。
the purpose of building an entire client-server infrastructure even though the entire thing is local and offline
“离线”部分可能会分散您的注意力。
装有 macOS、BSD、Linux、Windows 等现代操作系统的传统计算机始终“在线”,因为它们都维护着一个网络堆栈。一台计算机内的进程可以在本地使用该网络堆栈来相互通信。无论您碰巧插入了以太网电缆,还是打开了 WiFi,对计算机来说都没有什么区别。 OS 中的网络堆栈仍然可用并处于活动状态,无论外部网络访问如何。
因此,客户端-服务器体系结构在在 一台计算机内和在 台计算机之间同样有效。 (实际上,它在本地工作 更快 ,因为跳上跳下网络非常慢。)
为什么要为本地应用选择客户端-服务器架构?或者:
- 您精通并喜欢客户端-服务器架构的工具。
- 您想最终从仅本地移动到联网。
如果这两个都不成立,那么我提到的 JavaFX with H2 解决方案可能更适合 Java 程序员。
顺便说一下,让我为 Vaadin Flow 添加一个插件,这是一个用于在纯 Java 中构建 Web 应用程序的 GUI 框架。