一个Java小程序是一个小的应用程序写入的Java编程语言或其他编程语言编译为Java字节码,并在Java中的形式交付给用户的字节码。用户从网页启动Java applet ,然后在与Web浏览器本身分开的进程中在Java虚拟机(JVM)中执行applet 。Java小程序可以出现在网页的框架,新的应用程序窗口,Sun的AppletViewer或用于测试小程序的独立工具中。
Java小程序是在1995年发布的第一版Java语言中引入的。自2017年Java 9以来,Java小程序被弃用,并从2018年9月发布的Java SE 11(18。9)中删除。[6] [7] [ 8] [9] [10]
Java applet通常用Java编写,但也可以使用其他语言,如Jython,JRuby,Pascal,[11] Scala或Eiffel(通过SmartEiffel)。
Java applet运行速度非常快,直到2011年,它们的速度比JavaScript慢很多倍。与JavaScript不同,Java applet可以访问3D 硬件加速,使其非常适合非平凡的计算密集型可视化。由于采用了画布技术(或者特别是3D图形中的WebGL),[12] [13]以及即时编译的 JavaScript,[14]速度差异,浏览器已经获得了对硬件加速图形的支持。变得不那么引人注目了。[ 引证需要 ]
由于Java字节码是跨平台的(或平台无关的),Java applet可以由浏览器(或其他客户端)执行,用于许多平台,包括Microsoft Windows,FreeBSD,Unix,macOS和Linux。它们不能在不支持Java的现代移动设备上运行。
内容
1 概述
2 技术信息
2.1 类似技术
3 嵌入网页
4 例子
5 优点
6 缺点
7 与兼容性相关的诉讼
7.1 1997:Sun vs Microsoft
7.2 2002:Sun vs Microsoft
7.3 2010:Oracle与Google
8 安全
8.1 未签名
8.2 签名
8.3 自签名
9 替代品
10 另见
11 参考文献
12 外部链接
概述
Applet用于为Web应用程序提供交互式功能,这些功能无法仅由HTML提供。它们可以捕获鼠标输入,还具有按钮或复选框等控件。响应于用户动作,applet可以改变提供的图形内容。这使得applet非常适合演示,可视化和教学。有在线applet集合,用于研究从物理学到心脏生理学的各种科目。
applet也可以只是一个文本区域; 例如,为某个远程系统提供跨平台命令行界面。如果需要,applet可以离开专用区域并作为单独的窗口运行。但是,applet对applet专用区域之外的网页内容几乎没有控制权,因此与其他类型的浏览器扩展不同,它们对于改善网站外观不太有用(而新闻代码或WYSIWYG编辑器等applet 也是众所周知的)。Applet还可以播放浏览器本身不支持的格式的媒体。
用HTML编码的页面可以在其中嵌入传递给applet的参数。因此,相同的applet可能具有不同的外观,具体取决于传递的参数。
由于applet在CSS和DHTML标准之前可用,它们也被广泛用于诸如翻转导航按钮之类的微不足道的效果。这种方法在可访问性和滥用系统资源方面造成了重大问题,已不再使用,甚至在当时也非常劝阻。
技术信息
Java applet在大多数Web浏览器的沙箱中执行,阻止它们访问剪贴板或文件系统等本地数据。applet的代码从Web服务器下载,之后浏览器将 applet 嵌入到网页中或打开一个显示applet 用户界面的新窗口。
Java applet扩展了类java.applet.Applet,或者在Swing applet 的情况下javax.swing.JApplet。必须覆盖applet类中的方法以在其自身内部设置用户界面的类(Applet)是其后代的Panel后代Container。由于applet继承自容器,因此它与普通Java应用程序具有相同的用户界面可能性,包括具有用户特定可视化的区域。
第一个实现涉及按类下载applet类。虽然类是小文件,但通常有很多,因此applet被称为缓慢加载的组件。但是,由于引入了.jars,applet通常作为单个文件提供,其大小类似于图像文件(数百千字节到几兆字节)。
的域从其中小应用程序可执行程序被下载是其通常的(无符号)小应用程序被允许进行通信的唯一的域。此域可以与托管周围HTML文档的域不同。
Java 系统库和运行时是向后兼容的,允许用户编写在Java虚拟机的当前版本和未来版本上运行的代码。
类似技术
许多Java开发人员,博客和杂志都建议使用Java Web Start技术代替applet。[15] Java Web Start允许启动未修改的applet代码,然后在单独的窗口(不在调用浏览器内)中运行。
一个Java Servlet的有时非正式相比,是“喜欢”的服务器端小程序,但它在它的语言,不同的功能,并且在每个这里描述的关于小应用程序的特性。
嵌入网页
通过使用不推荐使用的appletHTML元素[16]或推荐object元素,可以在网页上显示applet 。[17]该embed元素可以与Mozilla系列浏览器一起使用[18](embed在HTML 4中已弃用,但包含在HTML 5中)。这指定了applet的源和位置。两者object和embed标签也可以下载和安装Java虚拟机(如果需要)或者至少导致插件页面。applet和object标签还支持加载以某种特定(而非初始)状态开始的序列化小程序。如果浏览器由于任何原因无法运行,则标签还会指定显示代替applet的消息。
然而,尽管object正式推荐标签,截至2010年,object标签的支持在浏览器中尚未保持一致,并且Sun一直建议在旧的applet多浏览器环境中部署旧标签[19],因为它仍然是唯一一致支持的标签。流行的浏览器。为了支持多个浏览器,object标签当前需要JavaScript(识别浏览器并调整标签),使用其他特定于浏览器的标签或从服务器端提供适应的输出。弃用applet标签一直受到批评。Oracle现在提供了一个维护的JavaScript代码[20]来启动具有跨平台解决方案的applet。
Java浏览器插件依赖于NPAPI,许多Web浏览器供应商因其年龄和安全问题而弃用。2016年1月,Oracle宣布基于JDK 9的Java运行时环境将停止使用浏览器插件。[21]
示例
以下示例说明了通过java.applet包使用Java applet。该示例还使用Java Abstract Window Toolkit(AWT)中的类来生成消息“ Hello,world! ”作为输出。
import java.applet。* ;
import java.awt。* ;
//“Hello,world!”的Applet代码 例。
//这应保存在名为“HelloWorld.java”的文件中。
公共 类 HelloWorld 扩展 Applet {
//在屏幕上打印一条消息(x = 20,y = 10)。
public void paint (Graphics g ) {
g 。drawString之(“你好,世界!” , 20 , 10 );
//在屏幕上绘制一个圆圈(x = 40,y = 30)。
g 。drawArc (40 , 30 , 20 , 20 , 0 , 360 );
//在屏幕上绘制一个矩形(x1 = 100,y1 = 100,x2 = 300,y2 = 300)。
g 。drawRect中(100 , 100 , 300 , 300 );
//在屏幕上绘制一个正方形(x1 = 100,y1 = 100,x2 = 200,y2 = 200)。
g 。drawRect中(100 , 100 , 200 , 200 );
}
}
简单的applet可以在Internet上自由共享,用于自定义支持插件的应用程序。
编译之后,生成的.class文件可以放在Web服务器上,并使用<applet>或<object>标记在HTML页面中调用。例如:
<!DOCTYPE html>
< html >
< head >
< title > HelloWorld_example.html </ title >
</ head >
< body >
< h1 > Java applet示例</ h1 >
< p >
这里是:
< applet code = “HelloWorld.class” height = “40” width = “200” >
这是HelloWorld.class运行的地方。
</ applet >
</ p >
</ body >
</ html >
访问该页面时,其内容如下:
一个Java applet示例
这是:你好,世界!
为了大限度地缩短下载时间,可以以jar文件的形式提供applet 。对于此示例,如果将所有必需的类放在压缩归档example.jar中,则可以使用以下嵌入代码:
< p >
这里是:
< applet archive = “example.jar” code = “HelloWorld” height = “40” width = “200” >
这是HelloWorld.class运行的地方。
</ applet >
</ p >
Sun的官方页面中详细介绍了Applet包含有关APPLET标记的内容。[22]
优点
Java applet可以具有以下任何或所有优点:[23]
使它在FreeBSD,Linux,Microsoft Windows和macOS上运行很简单 - 也就是说,使它跨平台。在21世纪的前十年,大多数网络浏览器都支持小程序; 然而,从那以后,出于安全原因,大多数浏览器都放弃了applet支持。
同一个applet可以同时处理“所有”安装的Java版本,而不仅仅是新的插件版本。但是,如果applet需要更高版本的Java Runtime Environment(JRE),则客户端将在大型下载期间被迫等待。
大多数Web浏览器都会缓存 applet,因此在返回网页时可以快速加载它们。Applet也随着使用而改进:运行第一个applet后,JVM已经运行并快速启动(每次浏览器重新启动时JVM都需要重新启动)。当浏览器从包含applet的一个HTML页面导航到包含applet的另一个HTML页面时,JRE 1.5及更高版本会停止JVM并重新启动它。
它可以将工作从服务器转移到客户端,使得Web解决方案可以根据用户/客户端的数量进行扩展。
如果独立程序(如Google Earth)与Web服务器通信,则该服务器通常需要为尚未更新其客户端软件的用户支持所有先前版本。相反,正确配置的浏览器会加载(和缓存)新的applet版本,因此不需要支持旧版本。
applet自然支持不断变化的用户状态,例如棋盘上的数字位置。
开发人员可以直接通过创建主例程(在applet的类中或在单独的类中)并在applet上调用init()和start()来直接开发和调试applet,从而允许在他们喜欢的Java SE开发环境中进行开发。之后所有人都必须在AppletViewer程序或Web浏览器中重新测试applet,以确保它符合安全限制。
一个不受信任的小应用程序到本地机器不能访问,只能访问它来自服务器。这使得这样的applet比它可以替换的独立可执行文件更安全。但是,如果用户同意,签名的applet可以对其运行的计算机具有完全访问权限。
Java applet很快,甚至可以与本机安装的软件具有相似的性能。
缺点
此部分需要额外引用以进行验证。请通过向可靠来源添加引文来帮助改进本文。无法查证的内容可能被提出异议而移除。查找来源:“Java applet” - 新闻· 报纸· 书籍· 学者· JSTOR
(2015年8月)(了解如何以及何时删除此模板消息)
与其他客户端Web技术相比,Java applet可能具有以下任何缺点:
Java applet依赖于Java Runtime Environment(JRE),这是一个相当复杂和重量级的软件包。它通常还需要Web浏览器的插件。某些组织仅允许管理员安装的软件。因此,某些用户只能查看足够重要的applet,以便与管理员联系以请求安装JRE和插件。
如果applet需要比系统上可用的更新的JRE或特定的JRE,则第一次运行它的用户将需要等待大型JRE下载完成。
iOS或Android上的移动浏览器根本不运行Java小程序。[24]随着移动操作系统的兴起,桌面浏览器逐步淘汰Java applet支持。
与旧applet标记不同,object标记需要使用变通方法来编写跨浏览器的HTML文档。
没有标准可以让屏幕阅读器可以使用applet的内容。因此,applet可能会损害具有特殊需求的用户访问网站的可能性。
与任何客户端脚本一样,安全性限制可能使不受信任的applet难以甚至不可能实现所需的目标。但是,只需编辑JAVA JRE安装中的java.policy文件,就可以授予对本地文件系统或系统剪贴板的访问权限,也可以授予除向applet提供给浏览器的网络源以外的其他网络源。
与兼容性相关的诉讼
Sun已经做出了相当大的努力来确保Java版本之间的兼容性得以保持,并在必要时依法强制实施Java可移植性。Oracle似乎在继续采用相同的策略。
1997年:Sun对微软
1997年的诉讼[25]是在微软创建了自己的改进的Java虚拟机之后提交的,该虚拟机随Internet Explorer一起提供。Microsoft 在java.awt,java.lang和java.io包中的类中添加了大约50个方法和50个字段[25]。其他修改包括删除RMI功能和将Java本机接口从JNI 替换为RNI,这是一种不同的标准。RMI被删除,因为它只能轻松支持Java到Java通信并与Microsoft DCOM竞争技术。依赖这些更改或只是无意中使用它们的小程序仅在Microsoft的Java系统中起作用。Sun起诉违反商标,因为Java的重点是不应该有专有扩展,并且代码应该在任何地方都可以使用。微软同意向Sun支付2000万美元,并且Sun同意授予Microsoft有限许可,仅在有限的时间内不使用Java进行修改。[26]
2002年:Sun与微软
微软继续发布自己未经修改的Java虚拟机。多年来它变得非常过时但仍然是Internet Explorer的默认设置。后来的一项研究表明,这次的applet经常包含自己的类,它们以有限的方式反映Swing和其他新功能。[27] 2002年,Sun提起反垄断诉讼,声称微软试图非法垄断已经损害了Java平台。Sun要求微软将Sun当前的二进制Java技术实施作为Windows的一部分进行分发,将其作为旧版Microsoft桌面操作系统的推荐更新进行分发,并停止分发微软的虚拟机(因为其在之前的诉讼中同意的许可时间已经过过期)。[26]微软为未决的反托拉斯问题支付了7亿美元,为专利问题支付了9亿美元,并为将来使用Sun的软件支付了3.5亿美元的特许权使用费。[28] [ 需要非主要来源 ]
2010年:甲骨文与谷歌
另请参阅:Oracle诉谷歌
Google开发了自己的Android平台,该平台使用Java功能和概念,但与标准库不兼容。这可能违反Sun授予OpenJDK专利的条件,以便为所有人使用开源Java。2010年,甲骨文起诉谷歌[29]以“错误的方式”使用Java,声称“谷歌的Android与甲骨文美国的Java竞争”以及“谷歌已经意识到Sun的专利组合......”因为谷歌聘请了某些前Sun公司Java工程师“。2012年5月,该案件的陪审团发现谷歌没有侵犯甲骨文的专利,审判法官裁定谷歌使用的Java API结构不具有版权。[30] [31]
安全
有两种applet类型具有非常不同的安全模型:签名小程序和未签名小程序。[32]自Java SE 7 Update 21(2013年4月)起,鼓励小程序和Web-Start应用程序使用受信任的证书进行签名,并在运行未签名的小程序时显示警告消息。[33]进一步从Java 7 Update 51开始,默认情况下会阻止未签名的applet; 可以通过在Java控制面板中创建异常来运行它们。[34]
未签名
对未签名的小程序的限制被理解为“严苛的”:他们无法访问仅限于applet下载站点的本地文件系统和Web访问; 还有许多其他重要的限制。例如,他们无法访问所有系统属性,使用自己的类加载器,调用本机代码,在本地系统上执行外部命令,或者重新定义属于作为Java版本一部分包含的核心包的类。虽然它们可以在独立框架中运行,但这样的框架包含一个标头,表明这是一个不受信任的小程序。成功初始调用禁止方法不会自动创建安全漏洞,因为访问控制器会检查整个堆栈 调用代码以确保呼叫不是来自不正确的位置。
与任何复杂系统一样,自Java首次发布以来,已发现并修复了许多安全问题。其中一些(如日历序列化安全性错误)持续了很多年,没有人知道。其他人在野外被恶意软件使用。[ 引证需要 ]
一些研究提到applet崩溃浏览器或过度使用CPU资源但这些被归类为麻烦而不是真正的安全漏洞。但是,未签名的applet可能涉及组合攻击,这些攻击利用系统其他部分中的多个严重配置错误的组合。未签名的applet在托管它的服务器上直接运行也会更危险,因为虽然代码库允许它与服务器通信,但在其内部运行可以绕过防火墙。applet也可能在托管它的服务器上尝试DoS攻击,但通常管理该网站的人也管理applet,这使得这不合理。社区可以通过源代码审查或在专用域上运行applet 来解决此问题。
未签名的小程序还可以尝试下载托管在原始服务器上的恶意软件。但是,它只能将此类文件存储到临时文件夹中(因为它是瞬态数据),并且无法通过执行它来完成攻击。有人尝试使用applet以这种方式传播Phoenix和Siberia漏洞,[ 引证需要 ]但是这些漏洞利用内部不使用Java,并且还以其他几种方式分发。
签名
签名的小程序[35]包含一个签名,浏览器应通过远程运行的独立证书颁发机构服务器进行验证。生成此签名涉及专门的工具以及与权威服务器维护人员的交互。验证签名并且当前计算机的用户也批准后,签名的applet可以获得更多权限,变得等同于普通的独立程序。理由是,小程序的作者现在已知,并将对任何故意损害负责。[ 含糊 ]这种方法允许applet用于许多客户端脚本无法实现的任务。但是,这种方法需要用户承担更多责任,决定他或她信任谁。相关的问题包括无响应的授权服务器,在颁发证书时对签名者身份的错误评估,以及仍然做出用户不会批准的事情的已知applet发布者。因此,从Java 1.1出现的签名小程序实际上可能有更多的安全问题。
自签名
自签名applet是开发人员自己签署的applet,可能会带来安全风险; java插件在请求自签名applet的授权时提供警告,因为applet的功能和安全性仅由开发人员本身保证,并且尚未经过独立确认。此类自签名证书通常仅在发布之前的开发期间使用,其中第三方确认安全性并不重要,但大多数applet开发人员将寻求第三方签名以确保用户信任applet的安全性。
Java安全问题与任何客户端脚本平台的类似问题没有根本的区别[36] [ 引证需要 ]。特别是,与签名小程序相关的所有问题也适用于Microsoft ActiveX组件。
截至2014年,常用的Java插件或Java Web Start不再接受自签名和未签名的applet。因此,希望部署Java小程序的开发人员别无选择,只能从商业来源获取可信证书。
替代品
存在替代技术(例如,JavaScript),其满足applet可能的全部或更多范围。其中,JavaScript并不总是被视为竞争的替代品[ 由谁?] ; JavaScript可以与同一页面中的applet共存,协助启动applet(例如,在单独的框架中或提供平台解决方法),然后从applet代码调用。JavaFX是Java平台的扩展,也可以作为替代方案。