移植java桌面应用程序以在浏览器中运行的最佳方法是什么?

时间:2014-01-02 09:30:05

标签: java web applet port

我是一名非常熟练的java程序员,曾涉足网络开发,但我发现我在做基于桌面的东西方面要比在Web开发方面做得更好。我一直试图找到一种 easy 方式来移植我的桌面应用程序,以便在浏览器中运行,但似乎找不到任何东西。我想我正在寻找的东西类似于小程序,但它们在很大程度上没有得到支持,并且在白天变得越来越多。是否有类似的东西可以让我保持我的桌面风格思维并仍然在浏览器中运行,或者我应该分解并重写整个东西在rails或其他常见的Web平台。

4 个答案:

答案 0 :(得分:2)

其他人已经提到过Java WebStart - 它是一种技术,可以帮助重新分配Java应用程序,然后拥有桌面应用程序的全部权限,但它们也具有内置的自动更新支持。它基本上是一个启动程序,它从Internet获取JAR并将其作为桌面应用程序运行。这些不会在浏览器中运行。

Applet是一种可以直接嵌入到网页中的旧技术。它们没有错误,但它们有几个安全限制。此外,由于技术中发现的严重错误数量,支持率正在稳步下降。但是,想要applet支持的桌面用户通常无法确保它。目前,Chrome和Java平台本身都会在允许运行applet之前发出警告 - 并且假设已经安装了Java运行时环境。

Google Web Toolkit是一个允许用Java创建单页面应用程序的框架,然后将其编译为Javascript。 GWT处理幕后的多件事,包括服务器 - 客户端通信,本地化和国际化,以及自己的布局引擎。


将现有应用程序翻译为GWT时,您需要:

  • 将代码分成在客户端上运行的部分和在服务器上运行的部分。服务器无法直接访问用户,并且客户端无法直接访问数据库。如果您的应用程序不使用集中存储,它可能完全可以在Web浏览器中运行。由于客户端 - 服务器通信是通过互联网进行的,因此应将其减少到最低限度。
  • 将前端转换为GWT小部件。忘记Swing或AWT - 它们无法有效地编译为Javascript。
  • 删除对GWT不知道如何在应用程序的客户端部分转换为Javascript的其他Java类的依赖。支持java.util.的很大一部分但不支持javax.(截至2014年1月)。 GWT站点托管list of supported Java classes。此外,Javascript的正则表达式不如Java强大。特别是Lookbehinds不受支持。服务器端是一个成熟的Java环境,但请记住 - 您希望将服务器 - 客户端通信降至最低。

但是,最常见的策略是直接在 Javascript 中对客户端进行编码。


Javascript是一种与C / C ++和Java语法非常相似的语言。它使用花括号来表示代码块,它使用分号来分隔语句(尽管Javascript具有自动分号插入功能,如果第一行没有以分号结束,有时它会将两行理解为单个语句。其数据类型包括数字(双精度浮点数),字符串,布尔值,两种类型的null,普通对象(基本上是散列映射[string - > x]),数组(无类型和动态可扩展),正则表达式和函数(命名或匿名),所有这些都有自己的文字语法。

使用Javascript编码时,您的心态应该是:

  • Javascript是单线程和事件驱动的。你不必担心并发问题,但你不能说"现在等待x"无论是。由于您的Java代码也应该是事件驱动的,因此这应该不是问题。
  • Javascript中的很多东西都是异步的。想知道用户的某些信息?您应绘制一个对话框,并将事件处理程序附加到其组件。想要获得用户的GPS位置?请求权限,传递一个事件处理程序,用于当用户决定是否应该授予权限时,从中请求位置,这也将事件处理程序作为参数。和服务器说话?异步。在进行长时间计算之前,您想显示某些内容吗?在开始计算之前,你必须先等一下。 Ecmascript 6大大改进了语法,但现代浏览器尚不支持它。
  • 浏览器只会让你这么做。磁盘访问?仅限用户明确指向的文件或文件夹。剪贴板访问?唯一可靠的方法是复制/粘贴到文本框中。与外国网络服务器交谈?只有当该网络服务器明确地允许您(并且他们中的许多人甚至不知道如何)时。当然,"外国"包括不同的子域,不同的端口号或不同的协议(http://https://)。桌面通知?地理位置?先请求权限。 Java applet具有可比较的安全限制,原因完全相同。
  • 在Java中,一切都是一个类。在Javascript中,您可以在没有任何课程的情况下享受裸机。典型的事件处理程序只是一个匿名函数,您将其作为参数传递给库函数。此外,您可以使用非常简洁的语法来拥有匿名对象。这使得Javascript代码比Java更密集,并且只有很少的类(如果有的话)。面向对象编程在Javascript中仍然可行,但不太明显。
  • 在布局显示器时,您需要考虑HTML和CSS。最好的方法是使用文档对象模型(DOM)仅修改文档结构(添加/删除元素或HTML类),并将所有CSS保留在外部文件中。无论如何,您需要足够了解CSS才能布局页面。现代浏览器支持canvas,但它没有内置的布局引擎 - 它最接近的Java相对是JCanvas - 只是一个空白区域,你可以绘制图形基元 - 或WebGL画布 - 你可以放置三维空间中的三角形。
  • 在设计自己的API时,您需要知道哪些操作可能需要异步。如果是,则将函数作为参数(回调),或者返回一个(承诺)的对象。
  • this变量外,Javascript的功能范围和词法作用域都有闭包。如果一个变量存在于周围的作用域中,它可以被读取和写入 - 甚至可以从仅在该作用域中定义并稍后调用的函数中读取。在Java中,您不能关闭非final函数局部变量。

    但是,您需要注意时间安排 - 不要认为您可以在回调中分配变量并在外部使用它。当您尝试使用它时,它还没有被分配给它。许多人试图以这种方式欺骗时间,但都失败了。

  • 当用户离开您的网页时,它就是游戏结束。如果你想记住那一点之后的任何事情,你需要将它存储在某个地方,无论是cookie(非常小的空间,过时的API),localStorage(相当大的空间,不是很老的浏览器都支持)或服务器(很多空间,但在关闭页面时与服务器通话很棘手)。
  • DOM API经常受到批评,但有几个框架和库可以简化它的使用,其中最流行的是jQuery,它也处理浏览器的不一致,改进了AJAX API,事件委托(你不能将一个事件处理程序附加到一个尚未存在的元素上,并且包含一个动画引擎(尽管现代的CSS几乎同样强大并且通常更容易使用)。

答案 1 :(得分:1)

我认为java web start可以帮助你

http://www.java.com/it/download/faq/java_webstart.xml

答案 2 :(得分:1)

我建议你看看Java Web Start。它使您可以使用Web浏览器直接从Internet启动Java平台的应用程序软件。

有关详细信息,请参阅:Java Web Start

答案 3 :(得分:1)

现在Web Start并不是一个好的选择,因为用户需要安装JVM,并且围绕Java的所有漏洞都很难说服用户下载它。 JDK 1.8+的最新版本包括仅在一个安装程序中将应用程序打包到jvm运行时的脚本:https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/

为了在像applet这样的浏览器中使用你的应用程序,可以使用Bck2BrwsrTeaVM两者都可以在没有Java插件的浏览器中运行java应用程序。如果可用,Bck2Brwsr也会使用Java Plug。

您还可以使用GWT将Java应用程序编译为JavaScript。注意:不支持Swing。

此致