Web applet中Java小程序的可用性

对于我们大学的电子学习项目,我们使用Java小程序在Ilias学习单元内部显示一些交互式内容(如一些交互式function绘图或一些简单的问答系统或其他交互元素及其中的任意组合)。

我们决定使用Java,因为我们想要一个开放的解决方案(当时HTML5并不是真正可用的,而且Flash实际上并不是一个选项)。

现在,几年后,我真的觉得Java并不适用于网络。 主要是因为很多问题我并没有真正解决所有情况。

所以,我的问题是:Java对于网络来说是不是正确的事情,还是我做的事情。 错误? 你能指出我如何解决这些问题吗?

我当时遇到的问题:

  • Java applet需要很长时间才能加载。 即使它是一个非常简单的小程序,它有时需要大约一分钟才能加载。 这是为什么? 是不是真的Java框架比Qt或其他框架大得多? 或者VM是如此之大? 或者VM是如此之慢?

  • 浏览器(或至少Chrome中的标签页)在加载applet时会变得非常慢esp,但之后也是如此。

  • Java applet在每个系统上看起来都不同。 UI控件完全不同,并且行为略有不同。 有时它是原生的外观(或者它的种类),有时它完全是自己的东西。 此外,字体大多不同,并且通常支持不同的Unicode字符子集。 这对我们来说是一个真正的问题,因为我们对数学符号使用了很多Unicode,并且我们得到了很多报告,有些符号对某些人不起作用。 此外,由于每个系统上的字体大小不同,我得到的报告是文本被删除给少数人(或在JLabel中缩写为“…”)。 我现在通过在JAR中加入TTF解决了这个问题。 这主要起作用。 有时候,即使使用独特的字体,我也会收到这些“…”报告。

  • 有时内存使用率非常高(但并非总是如此)。

  • 当加载具有多个applet的页面时,浏览器崩溃和/或多个applet无法正确加载的可能性变得非常高。 此外,整个操作系统变得非常慢。

  • 有时,Java applet不会在浏览器X中加载,而是在浏览器Y中加载。在重新加载或重新启动浏览器/系统时单击几次后,该行为可能会切换。 例如,似乎在Firefox中加载applet的机会更高(也不总是,但大多数情况下,至少在重新加载后点击一两次)并且Chrome上的可能性较小(但如果我很幸运,它有时也有效) 。 根据系统的不同,可能是不同的浏览器效果最好。 虽然从来没有一个完美的浏览器。 这种行为发生在我们测试的所有系统上(不同的Linux发行版,32位和64位,Windows XP / Vista / 7,MacOSX)。

  • 有时,当我切换到另一个选项卡并返回时,applet保持空白。 有时它至少需要很长时间才能再次出现。

  • 它会占用所有CPU。 即使在我用applet关闭了所有标签之后。 我必须退出浏览器来解决这个问题。

我们遇到这些问题的一些例子:

  • http://www.matha.rwth-aachen.de/~ilias/jars/Integration/Integration_Geogebra.html
  • http://www.matha.rwth-aachen.de/~ilias/jars/Abbildungen/Abbildungen.html
  • http://www.matha.rwth-aachen.de/~ilias/jars/Trigonometrie/Trigonometrie_Geonext.html
  • http://www.matha.rwth-aachen.de/~ilias/jars/AnalytischeGeometrieundLA/AnalytischeGeometrieundLA.html
  • http://www.matha.rwth-aachen.de/~ilias/jars/ganze%20und%20natuerliche%20Zahlen/ganze%20und%20natuerliche%20Zahlen.html

如果你看一下这些例子,什么是Java的一个很好的替代解决方案? 我想到了使用最新浏览器的HTML + JS(如果我们告诉用户他们应该使用基于WebKit的浏览器,那么这不是一个问题),尽管我认为其中一些例子可能很难实现(或者至少比在Java中更难)。

Java Applets在本世纪初是现代的。 目前只有少数网站使用Java applet,这可能是浏览器支持不是最佳的原因之一。

从我在浏览器卡住之前看到的,你的小程序似乎只是绘制各种图表。

我建议尝试一个专注于绘制图表的现代Javascript库: http : //javascript.open-libraries.com/utilities/chart/20-best-javascript-charting-and-plotting-libraries/

或者,如果您需要比库提供的更多选项,并且您不太关心跨浏览器兼容性,那么您可以使用HTML5元素和SVG – 除IE之外的所有浏览器都支持这些。

如果您不要求图表是交互式的,您可以使用PHP / Ruby / Python / Java / whatever在服务器上呈现它们,并将它们作为普通图像发送到浏览器。

如果需要表达数学表达式,请考虑MathML( http://en.wikipedia.org/wiki/MathML )或可能由服务器脚本动态呈现的普通图像。

你试过WebStart吗? 基本上,它允许您从Web链接启动独立的Java App。 所有资源都缓存在客户端,因此后续启动速度要快得多。

从您发送的链接中,Geonext似乎存在问题。 当同一页面上有多个实例时,它似乎不能正常工作。 您是否尝试在独立的Java应用程序中运行Geonext屏幕? 它也可能是您输入数据的问题。

就外观而言,如果您希望它独立于操作系统,则可以明确地设置它。

编辑:Geonext很可能使用一些静态变量,这可能会在页面包含多个打开的实例时创建竞争条件。 您可能想查看文档…

Java applet需要很长时间才能加载。 即使它是一个非常简单的小程序,它有时需要大约一分钟才能加载。 这是为什么? 是不是真的Java框架比Qt或其他框架大得多? 或者VM是如此之大? 或者VM是如此之慢?

这完全取决于它运行的机器,Web浏览器和Java版本。 我加载了你链接到的第一个示例页面,虽然确实需要花费一些时间来加载,但它还在双核机器上同时加载了19个applet。

话虽如此,一页上有19个小程序是荒谬的。

浏览器(或至少Chrome中的标签页)在加载applet时会变得非常慢esp,但之后也是如此。

当加载具有多个applet的页面时,浏览器崩溃和/或多个applet无法正确加载的可能性变得非常高。 此外,整个操作系统变得非常慢。

我没有注意到Applet加载方式的问题,而不是你一次加载很多它们。

同样,这不仅取决于Java,还取决于加载它的浏览器。

它会占用所有CPU。 即使在我用applet关闭了所有标签之后。 我必须退出浏览器来解决这个问题。

离开页面时,小程序并不总是被卸载。 离开页面时,Applet的stop()方法总是运行,但destroy()方法和applet的实际卸载可能不会。

在FireFox 3.6中,它似乎在卸载applet之前等待1-2分钟。

Java applet在每个系统上看起来都不同。 UI控件完全不同,并且行为略有不同。 有时它是原生的外观(或者它的种类),有时它完全是自己的东西。 此外,字体大多不同,并且通常支持不同的Unicode字符子集。 这对我们来说是一个真正的问题,因为我们对数学符号使用了很多Unicode,并且我们得到了很多报告,有些符号对某些人不起作用。 此外,由于每个系统上的字体大小不同,我得到的报告是文本被删除给少数人(或在JLabel中缩写为“…”)。 我现在通过在JAR中加入TTF解决了这个问题。 这主要起作用。 有时候,即使使用独特的字体,我也会收到这些“…”报告。

Java有两个基础的Applet类。 第一个是旧式的java.applet.Applet类。 另一个是较新的javax.swing.JApplet类。

前者使用AWT进行渲染,它基于系统的本机小部件。 后者使用Swing进行渲染,默认为跨平台的Metal(Ocean)主题。

Swing教程有一个关于如何制作小程序的页面。

  1. “Java applet需要很长时间才能加载。” 并不是的。 当您加载第一个applet时,您还加载了JVM,当您启动浏览器时,JVM与JavaScript引擎不同。 JVM启动时间不长于JavaScript启动时间,但最后一个启动时间隐藏在浏览器启动时间…有一个名为Jigsaw的项目,它将当前的JVM拆分为模块并使这个初始启动更快,并且计划用于Java 9。

  2. “浏览器(或至少是Chrome中的标签页)在加载applet时会非常慢,尤其是之后。” 虽然加载JVM很自然,事情就会变慢。 但是,如果之后浏览器速度很慢,那么您的applet中可能会出现一些错误,这些错误会导致CPU过多。 这与JavaScript没有什么不同,它也可以使浏览器变得非常慢。 您可能需要对applet进行概要分析,以确定资源的去向。 我确实遇到过Chrome问题,但它对Applet的支持却很糟糕……

  3. “Java applet在每个系统上看起来都不同。” 如果你使用Swing与非本地LAF,它不会。 我个人更喜欢现代的Nimbus LAF。 如何设置Nimbus的主要外观

  4. “有时内存使用量非常高(但并非总是如此)。” 描述您的代码,您可能正在进行过多的内存分配。 阅读对象池和其他方法以减少内存碎片。 这通常是编码错误的Applet的标志,而不是Applet技术的问题。

  5. “当加载具有多个applet的页面时,浏览器崩溃和/或多个applet无法正确加载的可能性变得非常高。整个操作系统变得非常慢。” 就个人而言,我不会在页面上有多个小程序。 看看你是否可以合并它们。 有些浏览器对此有非常不好的支持。 但更重要的是,它不是非常用户友好,即使技术不会弄乱它。

  6. “有时,Java applet不会在浏览器X中加载,而是在浏览器Y中加载”这是现代浏览器的一个已知问题,它往往不能很好地支持插件。 这实际上与数字5的问题相同。当您在页面上仅使用单个Applet时,此问题更加罕见。

  7. “有时,当我切换到另一个标签并返回时,小程序保持空白。有时它至少需要很长时间,直到它再次出现。” 与5和6相同的问题。插件代码(NPAPI)尚未进行现代化以正确支持插件。 浏览器没有告诉插件它必须正确地重绘它的内容。 或者,它可能已经崩溃。 如果您只使用一个小程序,则此问题也更少见。

  8. “它占用了所有CPU。即使在我用applet关闭了所有标签之后。我必须退出浏览器才能解决这个问题。” 关闭选项卡时,小程序不会关闭。 它们在applet退出时关闭,您需要在代码中执行此操作。 您的代码必须收听某些事件,清理并退出。 我不记得这个代码,因为我通常会复制粘贴它。 如果你在窗口资源死亡时不关闭AWT / Swing,那么AWT / Swing也可能会变得怪异……

在某些方面你是对的,在其他方面你有问题,因为你使用过时的库(如AWT或Swing与默认的LAF)或者不了解如何管理Applet生命周期。

移动访问对您很重要吗? 如果是这样,HTML + JS选项确实是你唯一不错的选择,因为它是所有Apple设备,Android设备和支持WebKit的许多其他移动设备中最广泛支持的实现技术。 (我们以这种方式在德克萨斯州主页上实现了所有的交互性.http://www.txstate.edu/ )

如果你只使用桌面交付,Flash变得非常可行,史蒂夫乔布斯的抗议就相反了。 :)我们的一些学习模块建立在该技术之上。

如果您了解Java并且熟悉Applet代码。 查看GWT( Google Web Toolkit )它允许您编写Java代码并将其转换为Java Script。

大多数这些问题都会从描述中看出是代码编写方式的问题。 不幸的是,在我们的行业中,质量很少。

如果applet花费一分钟加载,可能是DNS问题,或其他一些与I / O相关的问题。 (它是否依赖于网络,文件或CPU?)

在现代计算机上,存储器的使用难以有效地测量。 现代计算机上JRE的内存开销应该非常小。

如果使用Swing,那么PL&F可以设置为跨平台(Metal,Nimbus或下载的实现)。

字体也可以动态下载。