Java Applet使用简记


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>标签:

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

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


5.2、<jsp:plugin>标签嵌入

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

<jsp:plugin 
 		type="applet" 			// 指明嵌入插件为applet,另一种插件是bean
  	code="classFileName" 
  	codebase="classFileDirectoryName" 
  	[ name="instanceName" ] 
  	[ archive="URIToArchive, ..." ] 
  	[ align="bottom | top | middle | left | right" ] 
  	[ height="displayPixels" ] 
  	[ width="displayPixels" ] 
  	[ hspace="leftRightPixels" ] 
 		[ vspace="topBottomPixels" ] 
  	[ jreversion="JREVersionNumber | 1.1" ] 
  	[ nspluginurl="URLToPlugin" ] 
  	[ iepluginurl="URLToPlugin" ]
 >
	<jsp:params> 
  	<jsp:param name="param1" value="{paramValue | <%= expression %>}" />
		<jsp:param name="param2" value="{paramValue | <%= expression %>}" />
		<jsp:param name="paramN" value="{paramValue | <%= expression %>}" />
  </jsp:params> 
  <jsp:fallback> text message for user </jsp:fallback>
</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目录中,此时标记的写法如下所示:

<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目录中,则嵌入标签为:
<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>标记应该这样定义:
<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,参数传递应该定义成如下形式:

<jsp:plugin code="" codebase="" type="applet" archive="">
	<jsp:params>
		<jsp:param name="param1" value="" />
		<jsp:param name="param2" value="" />
		<jsp:param name="paramN" value="" />
	</jsp:params>
</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>标记):

<object classid= "" WIDTH="" ALT="no" codebase="http://java.sun.com/update/1.6.0/jinstall-6-windows-i586.cab#Version=6,0,0,105">
    <PARAM NAME=CODE VALUE="test.TestApplet" >
    <PARAM NAME=CODEBASE VALUE="../applet" >
    <PARAM NAME=ARCHIVE VALUE="applet.jar" >
	<param name="type" value="application/x-java-applet;version=1.6">
    <param name="scriptable" value="false">
    <PARAM NAME="p1" VALUE="v1">
    <PARAM NAME="p2" VALUE="v2">
    <comment>
		<embed
            type="application/x-java-applet;version=1.6" 
            CODE="cn.ninemax.zyh.applet.FileFTPApplet" 
            JAVA_CODEBASE="../applet" 
            ARCHIVE="file_applet.jar" 
            ALT="no" 
            WIDTH="400" 
            P1="v1" 
            P2="v2" 
			scriptable=false	 
			pluginspage="http://java.sun.com/products/plugin/index.html#download">
			    <noembed></noembed>
		</embed>
    </comment>
</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工具生成密匙库

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工具导出签名时用到的证书

keytool -export -keystore temp.store -alias temp -file temp.cert

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


9.3、 使用jarsigner工具签名jar压缩文档

jarsigner -keystore temp.store temp.jar temp

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


9.4、 创建mytest.policy文件

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

keystore"file:temp.store","JKS"; 
grantsignedBy"temp" 
{ 
permission java.io.FilePermission"<<ALLFILES>>","read"; 
};

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


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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值