Java Applet使用简记

转自: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文件(或其它动态页面)中使用,嵌入方式主要有<applet />和<jsp:plugin />两种标签嵌入方式。


5.1、<applet>标签嵌入

在HTML文件中插入<applet>标签:

[html]  view plain  copy
  1. <applet  codebase=”” // Java的applet的代码的路径,不指定此路径将默认为与HTML文件同目录  
  2.     code=””         // Java的applet被编译成代码的文件名,不用在此属性中指定文件路径,使用codebase指定文件路径  
  3.     width=””        // Applet的宽度,单位像素  
  4.     height=””       // Applet的高度,单位像素  
  5.     alt=””          // 无法显示Applet时替换的文本  
  6.     name=””         // Applet名称,通过此名称脚本程序可以与applet通讯  
  7.     align=””        // 对齐方式  
  8.     vspace=””       // 垂直方向空白距离  
  9.     hspace=””       // 水平方向空白距离  
  10.     archive=””      // 包含多个使用逗号(,)分割的Java类或外部资源,用于增强applet的功能,定义applet代码   
  11. >  
  12.     <param name=”参数1” value=”参数值”>  
  13.     <param name=”参数2” value=”参数值”>  
  14.     <param name=”参数n” value=”参数值”>  
  15. </applet>  

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


5.2、<jsp:plugin>标签嵌入

在HTML中插入<jsp:plugin>标签:

[html]  view plain  copy
  1. <jsp:plugin   
  2.         type="applet"           // 指明嵌入插件为applet,另一种插件是bean  
  3.     code="classFileName"   
  4.     codebase="classFileDirectoryName"   
  5.     [ name="instanceName" ]   
  6.     [ archive="URIToArchive, ..." ]   
  7.     [ align="bottom | top | middle | left | right" ]   
  8.     [ height="displayPixels" ]   
  9.     [ width="displayPixels" ]   
  10.     [ hspace="leftRightPixels" ]   
  11.         [ vspace="topBottomPixels" ]   
  12.     [ jreversion="JREVersionNumber | 1.1" ]   
  13.     [ nspluginurl="URLToPlugin" ]   
  14.     [ iepluginurl="URLToPlugin" ]  
  15.  >  
  16.     <jsp:params>   
  17.     <jsp:param name="param1" value="{paramValue | <%= expression %>}" />  
  18.         <jsp:param name="param2" value="{paramValue | <%= expression %>}" />  
  19.         <jsp:param name="paramN" value="{paramValue | <%= expression %>}" />  
  20.   </jsp:params>   
  21.   <jsp:fallback> text message for user </jsp:fallback>  
  22. </jsp:plugin>  

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


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
  1. <applet alt="hello" name=”applet” id=”test” width="80" height="60" codebase="../applet" code="AppletWithoutPackage.class"></applet>  

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
  1. <applet alt="hello" name=”applet” id=”test” width="80" height="60" codebase="../applet" code="cn.ninemax.zyh.applet.AppletStart.class"></applet>  

6.3、 applet打成jar包

如果在应用中将Applet的.class文件打成jar包,那么codebase属性设置为jar包所在目录,而code属性跟上述相同,是类的全名加上.class形式;但此时需要指定archive属性,该属性值为applet所在的的jar名。
示例
如果AppletStart被打到app.jar包里,该jar包被放在WebRoot下的applet目录中,那么此时的<applet>标记应该这样定义:
[html]  view plain  copy
  1. <applet alt="hello" name=”applet” id=”test” width="80" height="60" codebase="../applet" code="cn.ninemax.zyh.applet.AppletStart.class" archive="app.jar"></applet>  

7、Applet参数


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

[html]  view plain  copy
  1. <jsp:plugin code="" codebase="" type="applet" archive="">  
  2.     <jsp:params>  
  3.         <jsp:param name="param1" value="" />  
  4.         <jsp:param name="param2" value="" />  
  5.         <jsp:param name="paramN" value="" />  
  6.     </jsp:params>  
  7. </jsp:plugin>  

示例:
<param name=”username” value=”tom” />
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>标记来嵌入Applet,而是采用<jsp:plugin type=’applet’>标记来代替<applet>标记,经测试,在IE下也可以显示了。
其二、使用JDK中的HTMLConverter工具来转换<applet>标记,HTMLConverter工具位于%JAVA_HOME%\bin目录中。

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


8.3、使用步骤:

先是用<applet>标记写好嵌入页面如*.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>标记已经不再足够,用插件运行Applet的Web页面需要更多的HTML代码(至少需要告诉浏览器需要加载什么插件吧…)。


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


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


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


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

[html]  view plain  copy
  1. <object classid"" WIDTH="" ALT="no" codebase="http://java.sun.com/update/1.6.0/jinstall-6-windows-i586.cab#Version=6,0,0,105">  
  2.     <PARAM NAME=CODE VALUE="test.TestApplet" >  
  3.     <PARAM NAME=CODEBASE VALUE="../applet" >  
  4.     <PARAM NAME=ARCHIVE VALUE="applet.jar" >  
  5.     <param name="type" value="application/x-java-applet;version=1.6">  
  6.     <param name="scriptable" value="false">  
  7.     <PARAM NAME="p1" VALUE="v1">  
  8.     <PARAM NAME="p2" VALUE="v2">  
  9.     <comment>  
  10.         <embed  
  11.             type="application/x-java-applet;version=1.6"   
  12.             CODE="cn.ninemax.zyh.applet.FileFTPApplet"   
  13.             JAVA_CODEBASE="../applet"   
  14.             ARCHIVE="file_applet.jar"   
  15.             ALT="no"   
  16.             WIDTH="400"   
  17.             P1="v1"   
  18.             P2="v2"   
  19.             scriptable=false       
  20.             pluginspage="http://java.sun.com/products/plugin/index.html#download">  
  21.                 <noembed></noembed>  
  22.         </embed>  
  23.     </comment>  
  24. </object>  

更方便的方法是利用Sun提供的HTML Converter工具,它可以实现<Applet>标记到上述标记的自动转换。如果页面数量较多,使用这个工具尤为值得。
注:虽然以上只描述了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
  1. 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
  1. 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
  1. jarsigner -keystore temp.store temp.jar temp  

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


9.4、 创建mytest.policy文件

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

[java]  view plain  copy
  1. keystore"file:temp.store","JKS";   
  2. grantsignedBy"temp"   
  3. {   
  4. permission java.io.FilePermission"<<ALLFILES>>","read";   
  5. };  

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


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


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值