我有一个用JavaFX实现的应用程序,它将被迁移到Web平台,但是要花一些时间。
同时,我在使用方面遇到一些问题。一些用户需要从网络驱动器启动jar,因为他们的计算机无法访问数据库。只有jar所在的驱动器可以访问数据库。
我的疑问是从允许的网络驱动器运行jar是否可以解决此问题。另外,JNLP可以解决此问题吗?
非常感谢您对此的任何帮助。
最佳答案
一些用户需要从网络驱动器启动jar,因为他们的计算机无法访问数据库。只有jar所在的驱动器可以访问数据库。我的疑问是从允许的网络驱动器运行jar是否可以解决此问题。
它不会直接起作用。
JavaFX是一种客户端技术,它在客户端PC上运行。如果客户端PC无法直接访问数据库,则该客户端PC上运行的JavaFX应用程序也不会。
另外,JNLP可以解决此问题吗?
不可以,如果您的网络体系结构不允许从客户端直接访问数据库,那么除了基于JNLP的客户端之外,您还需要一个中间层。
讨论此问题的一些解决方案
通常,您所描述的架构将构建为multi-tier app。
客户端层,它是在客户端计算机上运行的JavaFX应用程序或HTML javascript应用程序。
处理服务器逻辑的应用程序服务器层。
承载DBMS的数据库层。
有一个合理的high level overview of such an architecture here。
如今,应用服务器通常会提供JSON数据的REST API,基于HTML的JavaScript Web应用程序可以轻松使用这些REST API。使用嵌入REST客户端的JavaFX应用程序也可以轻松使用此类API。应用服务器为REST API提供服务,并在适当时通过JPA或JDBC与数据库进行通信。但是,与客户端/服务器通信的许多替代技术相比,您可以选择适合自己的应用程序,开发风格和组织的任何方式。
春季产品特定讨论
在陈述使用Spring的偏好时,请考虑JavaFX SpringBoot application。
Spring还包括一种称为spring remoting的技术,用于促进客户端/服务器访问。 Spring Remoting提供了多种通信技术。我建议坚持使用直接的基于HTTP REST的技术,而不要使用RMI或AMQP等其他技术,因为基于HTTP REST的后端也可以用作标准HTML / JavaScript Webapp的后端,您可能还会提到您的应用程序的目标客户端。
如果在客户端和服务器上使用Spring,请检出Spring的AsyncRestTemplate,并在其余模板的成功和失败回调中调用JavaFX的Platform.runLater API。或者,使用Spring RestTemplate并通过JavaFX concurrency mechanisms控制对服务器的调用。不确定哪个最适合您,可能是包装在JavaFX Task中的标准RestTemplate。
以正确的方式执行此操作将允许您的应用程序UI在执行网络活动时保持响应(不阻止UI线程),并确保您不违反JavaFX线程规则(不要访问控件或修改绑定到JavaFX的数据)场景控件脱离JavaFX应用程序线程)。