Java Applet使用简记

您所在的位置:网站首页 chrome运行applet Java Applet使用简记

Java Applet使用简记

2024-01-21 14:34| 来源: 网络整理| 查看: 265

转自:http://blog.csdn.net/zhyh1986/article/details/8269009

1、前言

Applet现在已经很少使用了,我在之前也从来没有用过,甚至在一开始学习Java时也没有学习相关内容,只是听说有这么一个东西。

世事难料,最近在做的一个项目却需要用到Applet,因项目需要支持一些较大文件的上传,自然应该能够支持断点续传,在多方考虑后决定使用Applet来实现FTP上传,也正巧,这个任务就落在了我身上。

经过很长一段时间的摸索,对Applet略有了解,这已经是几个月之前的事情了,今天在翻自己的笔记时突然觉得当时对Applet所作的笔记也许有些价值,于是讲其搬到此处...

2、说明

1、 该笔记仅是Applet使用简介,并不是用来说明如何编写Applet的

2、 内容大多参考自网络

3、 内容中提到问题的解决方法仅是个人遇到并参考网络资源解决,不能完全保证权威,但个人测试通过

3、Applet简介

Java程序主要分Application(应用程序)和Applet(小应用程序)两种形式。

Applet是一种特殊的Java程序,它自身不可以单独运行,而是需要嵌入在一个HTML(当然也可以用JSP等动态资源)文件中,使用浏览器或者AppletViewer命令来解释执行。Applet可以通过网络传输,由浏览器自动装载并执行。所有的Applet程序都必须继承Java的java.applet.Applet类或者javax.swing.JApplet类,其实javax.swing.JApplet也是继承自java.applet.Applet类的。

4、Applet生命周期

Applet程序不像Application程序那样从main()函数开始运行,一个Applet包含以下几个部分(方法):init()、start()、paint()、stop()和destory()等,这几个方法也就大体描述了Applet的生命周期。

Applet程序启动的时候,最先执行init()方法初始化Applet;然后执行start()方法开始工作;通过paint()方法进行绘图,当我们恢复Applet窗口或者最大化Applet窗口的时候,会重新调用paint()方法;当我们最小化窗口和关闭窗口的时候,会执行stop()方法停止Applet;至于destory()方法,由名字就可以看出是来销毁Applet程序(或其所占的资源),许多资料说在关闭浏览器的时候被调用。

5、使用

Applet一般是需要将其嵌入到HTML文件(或其它动态页面)中使用,嵌入方式主要有和两种标签嵌入方式。

5.1、标签嵌入

在HTML文件中插入标签:

[html]  view plain  copy                           

其中除了code属性外都是可选的。例如如果Applet类文件和HTML文件在同一个目录下,那么就可以不写codebase,或者也可以写成codebase="./" (表示当前目录)。

5.2、标签嵌入

在HTML中插入标签:

[html]  view plain  copy                                                  text message for user      

其大多数属性与标签一样,此处不再赘述。

6、Applet嵌入JSP/HTML时的问题

在将Applet嵌入到网页时经常遇到找不到Applet类的问题,因为编译后的所有类文件(.class文件)位于WEB-INF目录里,但是WEB-INF目录比较特殊,只能在页面重定向的时候可以访问,所以初始化的时候加载不了其中的.class文件,因而报ClassNotFoundException异常。因此我们可以在Web_Root目录中新建一个与WEB-INF平级的applet目录用以存放Applet编译后的class文件。

Applet在编写的时候是可以有包结构,也可以没有包结构,也可以将其打成jar包,现分门别类将已知解决方式记录如下:

6.1、 Applet没有定义在包中

applet嵌入标记中,code属性仅写Applet的class文件名(类名+.class);codebase属性设置为Applet的class文件所在的目录。 示例: 假设现在有一个没有定义包结构的Applet叫AppletWithoutPackage,其编译后的.class文件AppletWithoutPackage.class文件放在WebRoot中的applet目录中,而jsp文件放在WebRoot下的jsp目录中,此时标记的写法如下所示:

[html]  view plain  copy   

codebase属性表示从JSP所处位置退回一层到WebRoot目录下,再进入applet目录。

6.2、 Applet定义在某包中 先建一个与WEB-INF平级的目录(假设是applet目录),把WEB-INF里面编译好的所有Applet的class文件复制到里面(不要破坏包组织结构),code属性指定Applet的全限定类名(即包名+类名)再加上.class,嵌入标记与上面类同。 示例: 假设有一个applet名字为AppletStart,包结构为cn.ninemax.zyh.applet,其对应的.class文件自然就位于cn\ninemax\zyh\applet目录下,该目录位于Web_Root下的applet目录中,JSP文件位于Web_Root目录下的jsp目录中,则嵌入标签为: [html]  view plain  copy    6.3、 applet打成jar包 如果在应用中将Applet的.class文件打成jar包,那么codebase属性设置为jar包所在目录,而code属性跟上述相同,是类的全名加上.class形式;但此时需要指定archive属性,该属性值为applet所在的的jar名。 示例 如果AppletStart被打到app.jar包里,该jar包被放在WebRoot下的applet目录中,那么此时的标记应该这样定义: [html]  view plain  copy    7、Applet参数

Applet嵌入标记中的嵌套参数标记可以向Applet传递数据,在Applet中可以通过getParameter()来获取,该方法需要一个String类型的key值,即标记中的name,方法返回标记中value的值。 如果采用标记嵌入applet,参数传递应该定义成如下形式:

[html]  view plain  copy                                                     

示例: getParameter(“username”) // 取得tom,为字符串类型 注:getParameter()方法为Applet类或JApplet类下的方法,可直接调用。

8、IE中的问题 8.1、问题描述

有时候,某些Applet在Chrome及Firefox等浏览器上运行正常,但在IE下却无法正确运行,表现为浏览器假死,显示不出Applet并且对其它浏览器操作亦无响应。

经多方查阅,此问题可能是因为IE对Java版本的支持较低,当Applet所用Java版本高于其支持版本时就会出问题,比如Applet应用了Java2中如swing包下的东西,在IE下就会出现上述问题,不使用一般没事。

8.2、解决方案:

其一、不使用标记来嵌入Applet,而是采用标记来代替标记,经测试,在IE下也可以显示了。 其二、使用JDK中的HTMLConverter工具来转换标记,HTMLConverter工具位于%JAVA_HOME%\bin目录中。

注:参考网络,在此处解决问题,不能保证一定可以解决问题

8.3、使用步骤:

先是用标记写好嵌入页面如*.html,*.jsp等,运行HTMLConverter(即%JAVA_HOME%\bin\HTMLConverter.exe可执行文件),指定要转换的文件或其所在目录,点转即可生成转换后的文件,略作修改便可以使用了。

工具运行界面如下所示:

8.4、原理描述:

Java2增加了不少特色,特别是swing提供的界面控件,但并不是所有的浏览器能够完整支持它(上面问题应该就是IE不支持所致,既然Chrome和Firefox都能够正确运行含有swing组件的Applet,可能它们已经支持),所以,在不支持Java2的浏览器上可以使用Java插件来弥补(Java Plug-in)。

本来,Applet的概念相当简单,只要在Web页面中加入一个< APPLET >标记就可以了。浏览器遇到这个标记,就会下载对应的 Applet类文件,并启动自己的解释器运行这个Applet。在此过程中浏览器担当相当重要的角色,特别是它必需具备运行Java的能力,同时浏览器的虚拟机也决定了可接受的Java代码版本。

由于某些浏览器没有提供对高版本Java的支持,所以不得不采用Java插件来解析高版本Java所开发的Applet程序。

运用Java插件的基本目标是将显示Web页面和运行Java Applet这两个任务分离,浏览器的主要任务是负责各种页面部件(如图片、文本、Applet等)的布局。这种机制Navigator和IE都早就具备,Netscape称之为浏览器插件。

所谓的插件就是一个能够负责渲染特定页面区域的代码模块。

假设某个页面中含QuickTime电影片断,浏览器只需要知道它应该保留的大小,然后就可以将它像图片或其它页面元素一样安排,页面中该区域的显示则由QuickTime插件负责。

可以将Applet与视频同等看待,此时浏览器只需要知道Applet的显示区域大小,就可以像对待其它页面元素一样对待Applet了,而运行Applet的任务则由Java 插件负责。

那么在IE中又怎么办呢?IE中的ActiveX也具有完全相似特性:浏览器将页面中某个区域的控制权交给其它代码负责。虽然Netscape叫它插件,Microsoft叫它ActiveX控件,两者名字不相同,但它们都能够让Web浏览器运行真正的Java2代码。

这种方法最大的好处在于,它能够让IE和Navigator使用Sun的Java运行时环境,而不再依赖于浏览器来获得Java支持,更不必关注浏览器支持什么Java版本了。

但这种方法也存在缺点,主要有以下两个方面:首先,这种运行Applet的方式需要下载和安装Java 插件;其次,一个简单的标记已经不再足够,用插件运行Applet的Web页面需要更多的HTML代码(至少需要告诉浏览器需要加载什么插件吧…)。

对于第一个问题,既可以从Sun站点(http://java.sun.com/products/plugin/index.html)事先下载和安装插件软件包,如果有Internet连接,也可以让浏览器在遇到 或 标记时自动下载。

不同浏览器使用插件的标记不同使问题稍微复杂了一点。虽然Netscape的插件机制和Microsoft的ActiveX技术是非常相似的东西,但在Web页面中调用它们的方法却是完全不同的:Navigator用标记引入插件,IE中起类似功能的标记叫。

如果熟悉HTML且需要引用Java2 Applet的页面不多,可以手工将标记嵌入到标记对内部,使得页面在两个浏览器下都可以正常显示。

假设要运行的是test.TestApplet,则通过Java插件运行Applet的HTML代码类如(也就是说,用下面这些代码取代原来的标记):

[html]  view plain  copy                                                                                                              

更方便的方法是利用Sun提供的HTML Converter工具,它可以实现标记到上述标记的自动转换。如果页面数量较多,使用这个工具尤为值得。 注:虽然以上只描述了Navigator和IE两种浏览器,但该理论并不拘泥于这两种浏览器,而说的是两类浏览器(使用IE核心的浏览器和非IE核心浏览器),所以以上描述基本适用于市面上所有的主流浏览器。

9、Applet访问本地资源----Applet的数字签名问题

默认情况下,Applet的沙箱机制使Applet不能操作客户端本地资源(如读写文件等),但我们使用Applet有些时候是需要这些操作的,所以为了破除Java的安全体系对Applet的限制,需要对Applet进行数字签名。 此处的数字签名主要涉及到两个命令(都位于%Java_Home%\bin目录下) keytool jarsigner 下面说一下怎样利用这两个命令完成jar包的数字签名: 假设我们的Applet打在temp.jar包下。

9.1、 使用keytool工具生成密匙库 [java]  view plain  copy keytool -genkey -keystore temp.store -validity 365 -alias temp  

注意: temp.store 是密匙库的名称,可以随意修改,但后缀不能修改!  -validity 365 –validity是设置签名证书有效期的选项,此处设置为1年 temp 为别名,这个也可以改成自己的名称  执行上述命令后,DOS窗口中会提示你输入keystore的密码、姓名、组织单位、所在区域、国家代码等信息,可以随便输入,但要注意的是密码请务必记住,因为后面是要用到的。 然后,要我们确认输入是否正确,我们输入y然后回车确认信息。 最后要我们输入temp的主密码(直接回车设置temp的主密码和store密码一致即可)!

9.2、 使用keytool工具导出签名时用到的证书 [java]  view plain  copy keytool -export -keystore temp.store -alias temp -file temp.cert  

注意: temp.store 就是第一步生成的密匙库名称  temp 也是在第一步中我们指定的别名  temp.cert 为我们生成的证书的名称,可以自己修改名称,注意后缀不要改  命令执行成功后,我们会在当前目录下找到一个temp.cert文件,这个就是我们刚才生成的证书。

9.3、 使用jarsigner工具签名jar压缩文档 [java]  view plain  copy jarsigner -keystore temp.store temp.jar temp  

注意: temp.store 就是我们在第一步中生成的密匙库名称  temp.jar 就是我们这第一步压缩的jar文档  temp 是提供者的名称,我们这里设置为我们的别名

9.4、 创建mytest.policy文件

在当前目录下创建一个mytest.policy文件,其内容如下:

[java]  view plain  copy keystore"file:temp.store","JKS";    grantsignedBy"temp"    {    permission java.io.FilePermission"","read";    };  

文件的意思就是说让所有由temp签名的applet都可以对本地的所有文件进行读操作。

通过上述操作后,我们会在当前目录中找到如下几个文件: temp.jar 签名后的jar文档 temp.store 密匙库 temp.cert 证书 temp.policy 访问策略文件 如果没有这些文件,那么Applet数字签名过程就没有正确的完成。 以后,如果对打包的java文件做了修改,那么就需要重新签名一次才可以!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3