gpt4 book ai didi

java - 基于java的网站架构

转载 作者:行者123 更新时间:2023-12-01 05:29:40 28 4
gpt4 key购买 nike

我刚刚开始使用 Java 编程,所以可能看起来是一个愚蠢的问题,但我无法在互联网上找到简单的答案。这是我在深入开发之前必须回答的“大”问题,因此您可以帮助我节省大量尝试不同方法的时间。

我目前正在使用 Java 创建一个网站。该网站的重要功能将通过单独的 Java 线程(如守护进程)来实现,只要用户在网站上,该线程就必须在后台运行。同时,网站小程序必须有与该线程通信的手段。

我看到了三种可能的解决方案:

  1. 创建传统的多页面网站,在每个单独的页面中使用独立的 Java 小程序。我不确定是否可能,出现以下问题:

    • 在用户导航到另一个网页(在同一网站上)后,java小程序创建的java线程是否可以继续执行?我想是的。
    • 新启动的java小程序是否可以与已经在后台运行的java线程进行通信? (我已经看过部分文档介绍了通过 JavaScript 在 Java 小程序之间进行通信,不确定这是否可以用于我的情况。还有其他选择吗?)
  2. 创建单页网站,使用一个 Java 小程序,负责所有导航和呈现所有页面。这解决了后台守护程序的问题,作为单个小程序的一部分,后台守护程序变得易于实现和通信,但又提出了一个问题:

    • 我知道小程序可以修改当前网页。利用这个功能来模拟不同页面之间的导航是否可行?
  3. 创建 Java Webstart 应用程序,基本上是通过从第 2 页获取单个 Java 小程序并将其转换为独立应用程序。

我希望整个内容具有网站的外观和感觉,因此我更喜欢选项 3,而不是选项 2,更喜欢选项 1,而不是选项 2。

感谢您分享的任何想法。

更新:有谁知道p1下两个问题的具体答案吗?是否可以按照描述的方式使用 java 线程?

现在我很可能会选择制作 Java Webstart 应用程序。这应该是最不痛苦的方法。

更新2:我最终决定开发单个 java applet,如果需要,它可以轻松转换为 JWS 应用程序。我的项目的性质是我需要给人留下与网站合作的印象,这就是为什么我付出额外的努力让它看起来像一个网站。对于知识渊博的人来说,很明显,它更像是本地应用程序。我选择的解决方案在我的情况下有以下好处:- 可以轻松地在 JWS 应用程序和 Java 小程序之间转换。- 运行后台线程并与之通信没有问题。- 更可靠的安全性(这意味着我不需要使用任何机制将 session ID 从一个小程序传递到另一个小程序)

对比:- 如果尺寸变大,启动会很慢 - 我希望避免这种情况。- 安全问题 - 我尝试签署该小程序,它有很大帮助。- 浏览器中导航按钮的工作(来回) - 我希望能够在小程序中复制它。认为小程序应该能够捕获这个事件。

最佳答案

Java thread [...] which must be run in background for as long as the user is on the website

如果 fork 的线程是在客户端登录时保留状态,那么我将使用数据库、内存缓存或其他持久层来保存客户端 session 状态。这是一个更典型的模型。您还可以拥有多个通过网络共享 session 信息的前端。

如果您不与浏览器对话,那么创建独立的 Web 应用程序可能是最佳选择。您仍然可以使用 HTTP 作为传输协议(protocol),在这种情况下,我建议使用 Java Web 实现,例如 Jetty 。这将大大减少技术和复杂性。

如果您需要实现网页,我当然会使用适当的前端模型和技术。您应该将页面分成多个小程序 - 或 MVC 模型中的多个 Controller / View 。使用小程序应该没问题。他们(或 Controller )应该调用一个集中式服务,该服务根据信息流启动、通信和停止后台线程。

我当然还会运行另一个后台线程,以使客户端线程超时,以防客户端永远不会返回。您的工作线程可能会在等待一定时间后退出。

希望这有帮助。

<小时/>

is it possible for java thread created by java applet to continue execution after user navigated to another webpage (on the same website)? I assume that yes.

是的。 fork 的线程将继续运行,直到它们终止或(如果是守护进程)进程终止。

is it possible for newly launched java applet to communicate with java thread already running in background?

当然。他们需要的是某种能够共享数据的机制。例如,您的后台线程服务可以保存线程对象的 Map,其键是某种客户端ID。每当一个线程想要与其后台线程对话时,它就可以调用该服务通过 id 查找该线程。类似于:

BackgroundStream thread = threadService.getThread(clientId);
thread.callMethod(...);

如果有某种同步问题/响应,那么您需要有一个条件变量或其他东西。阅读Java threads了解更多信息。

关于java - 基于java的网站架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9177020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com