使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
applet可以处理图像和音频。写作这本书时,图像必须是GIF、PNG或JPEG格式,音频文件必须是AU、AIFF、WAV或MIDI。另外也支持动画GIF,可以显示动画。要用相对URL指定图像和音频文件的位置。通常可以通过调用getDocumentBase或getCodeBase方法得到基URL,前一个方法会得到包含这个applet的HTML页面的URL,后者会得到applet的codebase属性指定的URL。
可以为getlmage或getAudioClip方法提供基URL和文件位置。例如:
Image cat=getlmage(getDocumentBase(),"images/cat.gif");
AudioGip meow=getAudioClip(getDocumentBase0,"audio/meow.au");
前面已经见过如何显示一个图像。要播放一段音频,只需要调用它的play方法。还可以调用Applet类的play方法而无须先加载这段音频。piay(getDocumentBase(),"audio/raeow.au");
applet在浏览器或applet查看器中运行。applet可以要求浏览器为它做些事情,例如,获取一个音频剪辑,在状态栏中显示一个简短的消息,或者显示一个不同的Web页面。浏览器可能会执行这些请求,也可能将其忽略。例如,如果一个在applet查看器中运行的applet要求applet査看器程序显示一个Web页面,那么什么也不会发生。
要与浏览器通信,applet可以调用getAppletContext方法。这个方法会返回一个实现AppletContext接口的对象可以认为AppletContext接口的具体实现是applet与外围浏览器之间的一个通信渠道。除了getAudioClip和getlmage之外,AppletContext接口还包含很多有用的方法。
一个Web页面可以包含多个applet。如果一个Web页面包含来自同一个codebase的多个applet,它们可以相互通信。很自然地,这是一项高级技术,你可能很少会用到。如果为HTML文件中的各个applet指定name属性,可以使用AppletContext接口的getApplet方法来得到这个applet的一个引用。例如,如果HTML文件中包含以下标记:
Applet chartl=getAppletContext().getAppletC'Chartl");
会提供这个applet的一个引用。如何使用这个引用呢?假设Chart类中有一个方法可以接受新数据并重绘图表,可以通过适当的类型转换来调用这个方法:
((Chart)chartl).setData(3,"Earth",9000);
还可以列出一个Web页面上的所有applet,不论它们是否有name属性。getApplets方法会返回一个枚举对象。下面给出一个循环,它会打印当前页面上所有applet的类名:
Enumeration
applet 不能与不同 Web 页面上的其他 applet 通信。
可以访问外围浏览器的两个区域:状态栏和Web页面显示区,这都要使用AppletContext接口的方法。
可以用showStatus方法在浏览器底部的状态栏中显示一个字符串。例如:
showStatus("Loading data...please wait");
可以用showDocument方法告诉浏览器显示一个不同的Web页面。有很多方法可以达到这个目的。最简单的办法是调用showDocument并提供一个参数,即你想要显示的URL:
URL u=new URL('http://horstmann.com/index.html"):
getAppletContext().showDocument(u):
这个调用的问题在于,它会在当前页面所在的同一个窗口中打开新Web页面,因此会替换你的applet。要返回原来的applet,用户必须点击浏览器的后退按钮。
可以在showDocument调用中提供第二个参数告诉浏览器在另一个窗口中显示文档(见表)。如果提供了特殊字符串"_blank",浏览器会用这个文档打开一个新窗口,而不是替换当前文档。更重要的是,如果利用HTML中的框架特性,可以把一个浏览器窗口分割为多个框架,每个框架都有自己的名字。可以把applet放在一个框架中,让它在其他框架中显示文档。
从一个远程站点加载代码再在本地执行时,安全会变得非常重要。访问一个Web页面会自动启动这个页面上的所有applet。
点击一个链接会启动JavaWebStart应用。如果访问一个Web页面或点击一个链接会执行用户计算机上的任意代码,有恶意的人就能轻松地窃取机密信息、访问金融数据,或者利用用户的机器发送垃圾邮件。
为了确保Java技术不会被恶意利用,Java提供了一个精巧的安全模型,我们将在卷II中详细讨论。安全管理器会检査对所有系统资源的访问。默认情况下,它只允许无害的操作。要允许其他操作,用户必须明确地批准applet或应用运行。
远程代码在所有平台上能做什么?如果只是显示图像和播放声音,获得用户的按键和鼠标点击,将用户输入发回给加载代码的主机,这些通常都没有问题。这对于显示资料数据或者与教育程序或游戏交互来说够用了。这个受限的执行环境通常称为“沙箱”。沙箱中运行的代码不能改变或刺探用户的系统。具体来说,沙箱中的程序有以下限制:
•它们绝对不能运行任何本地可执行程序。
•它们不能读写本地计算机的文件系统。
•它们不能査找有关本地计算机的信息,不过所用的Java版本和一些无害的操作系统细节除外。特别是,沙箱中的代码不能査找用户的名字、e-mail地址,等等。
•远程加载的程序需要用户同意与下载这个程序的服务器以外的主机通信;这个服务器称为源主机(originating host)这个规则通常称为“远程代码只能与家人通话”。这个规则可以保护用户防止代码刺探内部网资源。
•所有弹出窗口都带有一个警告消息。这个消息是一个安全特性,确保用户不会把这个窗口误认为一个本地应用。这是因为会担心不设防的用户可能访问一个Web页面,被诱骗运行远程代码,然后键人密码或信用卡号,这可能会发回给Web服务器。在早期版本的JDK中,这个消息看上去很严重:“不能信任的JavaApplet窗口”。后来的版本把这个警告稍稍放松了一点:“未授权的JavaApplet窗口”,后来又改为“警告:JavaApplet窗口”。现在是一个警告性的小三角,只有最敏锐的用户才会注意到。
沙箱概念没有原先那么有意义。过去,任何人都可能部署沙箱代码,只有需要得到许可在沙箱外执行的代码才需要有数字签名。如今,不论是否在沙箱中运行,通过JavaPlug-in执行的所有代码都必须有数字签名。
applet或JavaWebStart应用的JAR文件必须有数字签名。签名的JAR文件带有一个证书,指示签名者的身份。加密技术可以确保这个证书不可伪造,而且能检测出对签名文件的任何篡改。
例如,假设你收到由yWorlcsGmbH开发并签名的一个应用,它使用Thawte签发的一个证书来签名(如图所示)。接收到应用时,可以确保以下几个方面:
1)代码与签名时是一样的;没有第三方篡改这个代码。
2)签名确实来自yWorks。
3)证书确实由Thawte签发。(JavaPlug-in知道如何检查Thawte和很多其他证书发行商的证书,另外也可以安装候选的“根证书”。)
如果点击“更多信息”链接,会告诉你这个应用运行时不会有Java通常的安全限制。要安装和运行这个应用吗?实际上这取决于你对yWorksGmbH的信任。
要从某个支持的发行商得到一个证书,可能每年要付数百美元,一些证书发行商还要求提供公司或企业的执照证明。过去,一些Java开发人员会生成他们自己的证书用来对代码签名。当然,JavaPlug-in没有办法检査这些证书的准确性。不过,过去JavaPlug-in会为用户提供证书。这没有太大意义,因为很少有用户了解安全与不安全的证书之间的差别。现在已经不再支持不安全的证书。
如果想要发布一个Javaapplet或WebStart应用,你将别无选择。必须从JavaPlug-in支持的一个证书发行商得到一个证书,用它对你的JAR文件签名。
如果你在一家公司任职,你的公司很有可能已经与一个证书发行商建立了关系,可以直接订购一个代码签名证书。如果没有,很有必要货比三家,因为具体的价格有很大差异,有些发行商对于向个人签发证书要求比较宽松。
你的证书会提供相关的安装说明,指出如何把它安装在一个Java密钥库中,这是一个受密码保护的文件,可以在签名过程中从这个密钥库获取证书。要保证这个密钥库文件和密码的安全。接下来,需要确定希望得到什么权限。你可以选择沙箱权限和完全权限。建立一个清单文件包含Permissions:sandbox或Permissions:all-permissions,例如:Manifest-Version:1.0Permissions:all-permissions
接下来运行jar工具:jarcvfRMyApplet.jarManifest.afmypackage/*.c1ass
HTML文件的applet元素应当有属性archive="MyAppletjarM。最后,对JAR文件签名。命令如下:
jarsigner-keystorekeystorefile-tsatimestampURLMyApplet.jarkeyalias
需要向证书发行商询问时间戳URL。密钥别名由证书发行商签名。运行以下命令:
keytool-keystorekeystorefile-list
来得到密钥别名。还可以用keytool命令的-changealias选项修改别名。现在把签名的 JAR文件和包含 applet 元素的 HTML 文件放到你的 Web服务器上。