JAVA Applet 了解

来源:互联网 发布:js得到当前星期几 编辑:程序博客网 时间:2024/06/13 12:41

JAVA [ Applet在IE和FF下不同表现]

IE和FireFox以及纯applet运行时三者状态
Applet运行状态

 Applet类中的四种基本方法用来控制其运行状态:init()、start()、stop()、destroy()

  init()方法

  这个方法主要是为Applet的正常运行做一些初始化工作。当一个Applet被系统调用时,系统首先调用的就是该方法。通常可以在该方法中完成从网页向Applet传递参数,添加用户界面的基本组件等操作。

  start()方法

  系统在调用完init()方法之后,将自动调用start()方法。而且,每当用户离开包含该Applet的主页后又再返回时,系统又会再执行一遍start()方法。这就意味着start()方法可以被多次执行,而不像init()方法。因此,可把只希望执行一遍的代码放在init()方法中。可以在start()方法中开始一个线程,如继续一个动画、声音等。

  stop()方法

  这个方法在用户离开Applet所在页面时执行,因此,它也是可以被多次执行的。它使你可以在用户并不注意Applet的时候,停止一些耗用系统资源的工作以免影响系统的运行速度,且并不需要人为地去调用该方法。如果Applet中不包含动画、声音等程序,通常也不必实现该方法。

  destroy()方法

与对象的finalize()方法不同,Java在浏览器关闭的时候才调用该方法。Applet是嵌在HTML文件中的,所以destroty()方法不关心何时Applet被关闭,它在浏览器关闭的时候自动执行。在destroy()方法中一般可以要求收回占用的非内存独立资源。(如果在Applet仍在运行时浏览器被关闭,系统将先执行stop()方法,再执行destroy()方法。

 

 

import java.applet.Applet;

import java.awt.Graphics;

import netscape.javascript.JSObject;

public class jsApplet extends Applet {

    static int staticVar=0;//静态变量  

    int globalVar = 100; //全局变量

    public jsApplet() {

       super();

       System.out.print("初始Applet!");

       System.out.println("\tstaticVar = " + staticVar + "; globalVar = " + globalVar);

    }

    public void init() {

       System.out.print("启动Applet!");  

       staticVar++;globalVar++;

       System.out.println("\tstaticVar = " + staticVar + "; globalVar = " + globalVar);

       System.out.println(getParameter("p0") + " : " + getParameter("p1"));   }

    public void start() {

       System.out.print("运行Applet!");

       staticVar++;globalVar++;

       System.out.println("\tstaticVar = " + staticVar + "; globalVar = " + globalVar);

    }

    public void stop() {

       System.out.print("停止Applet!");

       staticVar++;globalVar++;

       System.out.println("\tstaticVar = " + staticVar + "; globalVar = " + globalVar);

    } 

    public void destroy() {

       System.out.print("摧毁Applet!");

       staticVar++;globalVar++;

       System.out.println("\tstaticVar = " + staticVar + "; globalVar = " + globalVar);

    }

    public String getAppletInfo() {

       return "This is my default applet created by Eclipse";  

    }

    public void paint(Graphics g){

       System.out.println("绘画Applet!");

       g.drawString( "绘画Applet!" , 10, 40);  

   }

    public void setParameter(String name, String value){

       System.out.println("[" + name + "] = " + value ); 

    }

}

启动Applet==========

 

初始Applet! staticVar = 0; globalVar = 100

启动Applet! staticVar = 1; globalVar = 101

null : null

运行Applet! staticVar = 2; globalVar = 102

绘画Applet!

=====如果点击其他的运行程序,然后回复到applet窗口,则会再次执行“绘画Applet!”;

如果最小化并且还原Applet,则会启动它的stop和start方法========

 

初始Applet! staticVar = 0; globalVar = 100

启动Applet! staticVar = 1; globalVar = 101

null : null

运行Applet! staticVar = 2; globalVar = 102

绘画Applet!

绘画Applet!

停止Applet! staticVar = 3; globalVar = 103

运行Applet! staticVar = 4; globalVar = 104

绘画Applet!

======

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>My applet 'jsApplet' starting page</title>

  </head>

  <body>

    <script type="text/javascript">

       //This part is before the Applet init!

        //document.jsApplet.setParameter("Timer","beforeStart");

    </script>

    <applet codebase="applet/"

            code="jsApplet.class"

            name="jsApplet"

            id="jsApplet"

            width="320"

            align="top"

            height="240"

            vspace="50"

            hspace="50"

            alt="无法运行时显示此对话框"

            MAYSCRIPT>

          <param name="p0" value="name">

          <param name="p1" value="Applet">

    </applet>

    <script type="text/javascript">

    document.jsApplet.setParameter("Timer","afterEndApplet");

    document.applets[0].setParameter("title2","jesseShen");

    document.getElementByIdx_x("jsApplet").setParameter("title3","Siting");

    document.getElementByIdx_x("jsApplet")["setParameter"]("title3","Siting");

    </script>

  </body>

</html>

 


IE控制台效果

 

初始Applet!    staticVar = 0; globalVar = 100

启动Applet!    staticVar = 1; globalVar = 101

name : Applet

运行Applet!    staticVar = 2; globalVar = 102

绘画Applet!

[Timer] = afterEndApplet

[title2] = jesseShen

[title3] = Siting

[title3] = Siting

 

如果最小化并且还原applet后,再次出现“绘画Applet”;

如果关闭网页,则虚拟机关闭;

如果刷新网页,启动stop和destroy方法,并且重启开始init和start,静态变量和动态变量效果不同;

--------------------------------------------

 

绘画Applet!

停止Applet!    staticVar = 3; globalVar = 103

摧毁Applet!    staticVar = 4; globalVar = 104

初始Applet!    staticVar = 4; globalVar = 100

启动Applet!    staticVar = 5; globalVar = 101

name : Applet

绘画Applet!

运行Applet!    staticVar = 6; globalVar = 102

[Timer] = afterEndApplet

[title2] = jesseShen

[title3] = Siting

[title3] = Siting
 

---------------------------------------

 

绘画Applet!

初始Applet!    staticVar = 2; globalVar = 100

启动Applet!    staticVar = 3; globalVar = 101

name : Applet

运行Applet!    staticVar = 4; globalVar = 102

绘画Applet!

停止Applet!    staticVar = 5; globalVar = 103

摧毁Applet!    staticVar = 6; globalVar = 104

[Timer] = afterEndApplet

[title2] = jesseShen

[title3] = Siting

[title3] = Siting

这里的全局变量和静态变量效果相同,当关闭当前applet或者重启新applet,效果如前。

 

Java Script与Java Applet综合运用(一)

先我们编写一个Java Applet,就叫HelloWorld1好了(大家对HelloWorld一定不会陌生).

HelloWorld1.java


import java.awt.*;
import java.applet.*;
public class HelloWorld1 extends Applet
{
public String text="Hello World!";//请注意此处的public
public void paint(Graphics g)
{g.drawString(text,20,20);}
}

编译通过后会生成HelloWorld1.class(别告诉我程序无法通过!如果编译出错请检查是否拼写有误。)

example.html


<html>
<head><title>例子</title></head>
<body>
<script language="JavaScript">
<!--
function SetText()
{
document.app.text="世界你好!";
document.app.repaint();//也请注意此句.
}
//-->
</script>
Java Script与Java Applet的综合运用例一<br>
<applet code="HelloWorld1.class" width="100" height="28" name="app">
</applet>
<form>
<input type="button" value="请点击这里" onclick="SetText()">
</form>
</body>
</html>

用浏览器打开example.html会出现一个显示“Hello World!”的Java Applet以及一个按钮“请点击这里”。我们点一下按钮,你会发现“Hello World!”变成了“世界你好”。这说明Java Script已经成功的改变了HelloWorld1中text的内容。

你也许会问在在HelloWorld1.java中为什么要在text前加public??

还有Java Script中那行:"document.app.repaint();"是什么意思?

是这样的:

和C++一样,在Java中缺省状态下,对象的属性是private,要让Java Script访问到Java Applet中的对象,必须设置为public(包括函数、变量和类)。

前一句document.app.text="世界你好!"仅改变了text的值,要使它反映在浏览器上,必须要让HelloWorld1刷新它的显示,因此要调用HelloWorld1中的repaint()函数。你也许又要问了:我在HelloWorld1.java中并没有看到repaint()函数呀? HelloWorld1是Applet的子类,我们调用repaint()其实是调用类Applet中的repaint()函数。当然我们并不推荐在外部直接修改Applet内的变量,更安全的方法是提供public函数来读取和改变内部变量。

 

解决IE屏蔽Java Applet问题的方法

利用Java虚拟机程序来实现,一般通过在IE中设置ActiveX控件启用选项即可解决。

什么是ActiveX控件?

ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。(资料源于百度百科

一、设置ActiveX控件启用选项解决

(1)IE6.0版本的设置方法

请您在IE浏览器菜单栏依次选择“工具”→“Internet选项”→“安全”→“internet”→“自定义级别”,然后将“ActiveX控件自动提示”、“标记为可安全执行脚本的ActiveX控件执行脚本”、“二进制脚本和行为”、“下载已签名控件”“运行ActiveX控件和插件”这五个选项选择为“启用”;将“对没有标记为安全的ActiveX控件进行初始化和脚本运行”、“下载未签名控件”选择为“提示”。

(2)IE7.0版本的设置方法

请您在IE浏览器菜单栏依次选择“工具”→“Internet选项”→“安全”→“internet”→“自定义级别”,将“ActiveX”控件和插件相关设置进行如下调整:

A、ActiveX控件自动提示:设置为“启用”;

B、对标记为可安全执行脚本的ActiveX控件执行脚本:设置为“启用”;

C、对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本:设置为“提示”;

D、二进制和脚本行为:设置为“启用”;

E、下载未签名的ActiveX控件:设置为“提示”;

F、下载已签名的ActiveX控件:设置为“提示”;

G、允许scriptlet:默认原设置不做更改;

H、允许运行以前未使用的ActiveX控件而不提示:设置为“禁用”;

I、运行ActiveX控件和插件:设置为“启用”;

J、在没有使用外部媒体播放机的网页上显示视频和动画:默认原设置不做更改;

以上设置完成后点击“安全设置”窗口下方的“确定”键,返回到“Internet选项”中“安全”标签的页面,再次点击该页面下方的“确定”键,使更改完成。

(3)IE8.0版本的设置方法

请您在IE浏览器菜单栏依次选择“工具”→“Internet选项”→“安全”→“internet”→“自定义级别”,将“ActiveX”控件和插件相关设置进行如下调整:

A、ActiveX控件自动提示:启用

B、对标记为可安全执行脚本的ActiveX控件执行脚本:启用

C、对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本:提示

D、二进制和脚本行为:启用

E、仅允许经过批准的域在未经提示的情况下使用ActiveX:启用

F、下载未签名的ActiveX控件:提示

G、下载已签名的ActiveX控件:提示

H、允许scriptlet:默认原设置不更改

I、允许运行以前未使用的ActiveX控件而不提示:禁用

J、运行ActiveX控件和插件:启用

K、在没有使用外部媒体播放机的网页上显示视频和动画:默认原设置不更改

3、关闭IE弹出窗口阻止程序。

请您在IE浏览器菜单栏选择“工具”选项后,查看下拉菜单中是否有弹出窗口阻止程序,如果有此选项,请点击-》“弹出窗口阻止程序”-“关闭弹出窗口阻程序”后,重新启动IE尝试登录。如页面显示为“启用弹出窗口阻止程序”可选且“弹出窗口阻止程序设置”为灰色不可选时,则说明目前IE弹出窗口阻止程序已经关闭。

注:IE7以上版本浏览器无法显示Java Applet主要原因是IE7默认安全级别提高了,默认情况下Sun Java控制台是禁用的,即使下载安装了Java虚拟机也无法显示Applet页面。通过IE7“工具”菜单下的“管理加载项”来启用Sun Java控制台即可正常显示Applet页面。

打开IE7的“工具”菜单选择“管理加载”子菜单下“启用或禁用加载项”打开管理加载项对话框在显示下拉列表框中选择“Internet Explorer 中当前加载的加载项”这时你就能在已停用的列表中看到“Sun Java控制台”,选中他然后在设置中单击“启用”单选框,最后确定设置保存。IE7提示您需要重新启动IE浏览器,重新打开IE就能浏览嵌入了 Applet的页面了,如图2所示。

图2

二、安装新版本Sun Java程序解决

如果IE浏览器中的设置都已经按以上的方法设置完成,但Java虚拟机的程序常无法正常启动,则需安装新版本Sun Java程序,你可以去Java的网站:http://www.java.com/zh_CN/下载,你也可以直接在我的网络文件夹中下载新版本Sun Java程序:jre-6u21-windows-i586.rar

 

 关于Applet标签的使用

 

虽然w3c不推荐使用applet,但用applet在企业内部网(Intranet)中进行applet的部署是一个推荐的常用做法,那么就先来讨论一下<applet>标签的使用。

定义和用法
<applet> 定义嵌入的 applet。

HTML 4.01 与 HTML5 之间的差异
HTML 4.01 中不赞成使用 applet 元素。

HTML5 中不支持 applet 元素。

提示和注释:
提示:HTML5 中不支持 applet 元素。请使用 <object> 代替。

<applet>的使用

再早期进行applet的部署,用<applet>标签是一种很常见的做法,applet标签所有的属性列表,你可以在这里找到,http://www.w3schools.com/tags/tag_applet.asp,里面进行了详细的说明。

1.下面给一个使用applet的例子:

<applet code=Applet1.class width="200" height="200">

Your browser does not support the <code>applet</code> tag.

</applet>

一般我们主要使用的就是这几个属性:

code属性指的是applet类,也就是继承与java.applet.Applet或java.swing.JApplet类的子类,此属性值一定要为你存放applet类的路径;

width属性指的是你的applet在浏览器中所要占用的宽度

height属性指的是你的applet在浏览器中所要占用的高度

2.一般我们使用的就这几个属性,但有时我们将applet打包到了jar文件中,这时我们就要使用archive属性了,比如:

<applet code=package.Applet1.class archive="app.jar" width="200" height="200">

Your browser does not support the <code>applet</code> tag.

</applet>

这个实例的意思,就为在你存放html文件的文件中的app.jar文件中查找package.Applet1.class这个applet类,如果你想要使用多个jar文件,在archive的属性值中以英文编码逗号分隔jar文件,即可。

3.有时我们可能我们想加载的文件不再当前目录,而在其子目录,或者上级目录,这是我们就可以使用codebase属性,例如:

<applet code=Applet1.class codebase="app" width="200" height="200">

Your browser does not support the <code>applet</code> tag.

</applet>

这样Java plug-in就会在当前目录下的app子目录中查找,加载Applet1.class类。

4.我们也可以通过其向applet类中传递参数,比如:

<applet code=Applet1.class codebase="app" width="200" height="200">

<param name="param1" value="1"/>

<param name="param2" value="2"/>

Your browser does not support the <code>applet</code> tag.

</applet>

这样,我们就可以在我们写的applet通过getParameter(String param)方法得到这些参数,使得我们可以在applet标签中就可以配置程序的目的,而传入的参数名,就是我们在param标签的name属性值。


<object>使用

使用object标签,通常只在Internet explorer中使用,例如:

<object
  classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
  width="200" height="200"
  codebase="http://java.sun.com/products/plugin/autodl/
jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0">
  <param name="code" value="Applet1.class">
< /object>

属性介绍:

1.classid属性表示要使用的最小Java plug-in版本号,这就表示当前安装的Java plug-in的版本必须大于classid,否则此applet运行不了。通常在Internet Explorer中使用的classid属性值是固定的,即:

classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"

此种格式表示使用IE中最新的jre版本。

classid也有另外的一种格式,如下:

classid="clsid:CAFEEFAC-xxxx-yyyy-zzzz-ABCDEFFEDCBA"

xxxx-yyyy-zzzz为Java plug-in的版本号,如1.6.0版本,就可以表示为:

classid="clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA"

2.width,height属性与applet一样,这里就不介绍了

3.codebase为可选属性,它有以下作用:

在本机安装的JRE(Java Runtime Environment)的版本小于classid属性指定的版本,浏览器则到此url中下载安装jre。

codebase的有如下格式:

codebase=<URL>

此种格式,表是如果本地安装的jre版本不为classid指定的版本,则转到指定的url,进行下载,安装

codebase=<URL>#Version=major,minor,micro,undate

此种格式,如果本机安装的jre版本比classid中指定的小,则到指定的url中下载jre

注意:这里是用英文逗号分隔的。

这里用Sun公司专门为Windows平台下的安装文件各个版本下载文件(.cab格式),http://java.sun.com/javase/6/webnotes/install/jre/autodownload.html。

<embed>标签

使用embed标签,通常在Mozilla系列浏览器中使用,如下:

<embed code="Applet1.class"
  width="200" height="200"
  type="application/x-java-applet;version=1.6"
  pluginspage="http://java.sun.com/javase/downloads/ea.jsp"/>

属性介绍:

1.code,width,height属性于applet标签中的属性相同,这里就不介绍了

2.type属性有如下格式:

type="application/x-java-applet;version=1.6"
此种格式,表示支持MIME类型为application/x-java-applet,版本为1.6或更高的被调用,如果本地安装的jre比version中指定的大或等于,则调用此jre,否则指向pluginspage属性指定的url。

type="application/x-java-applet;jpi-version=1.5.0_07

此种格式,表示本地运行的jre版本必须大于或等于1.5.0_07,否则指向pluginspage的url


<jsp:plugin/>标签的使用

<jsp:plugin type=applet code="Molecule" codebase="/html" >
< jsp:params>
    <jsp:param name="molecule" value="molecules/benzene.mol"/>
< /jsp:params>
< jsp:fallback>
       <p> Unable to start Plug-in. </p>
< /jsp:fallback>
< /jsp:plugin>

<jsp:plugin>为applet的根标签,我们在jsp页面中的applet所做的动作都在这其中进行

<jsp:param>与applet标签中的<param>相同

<jsp:params>用于包裹多个<jsp:param>标签

<jsp:fallback>用于Java Plug-in启动失败,执行其中的内容,一般顺利执行,则会被忽略

 


另外一些技术帮助

如何在一个让一个applet能够运行在不同的浏览器中?

有三种办法?

1.使用applet标签

applet标签被大多数的主流浏览器所支持。

2.使用html标签

<object
  classid="clsid:CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA"
  <param name="code" value="Applet1.class">
    <comment>
      <embed code="Applet1.class"
        type="application/x-java-applet;jpi-version=1.6">
        <noembed>
          No Java Support.
        </noembed>
      </embed>
    </comment>
  </object>

在IE中,IE会识别Object标签,忽略comment签

在Mozilla浏览器中,Mozilla会忽略object,classid,可以识别comment标签

3.使用javascript
<html>
< script language="Javascript">
var _app = navigator.appName;
if (_app == 'Mozilla') {
   document.write('<embed code="Applet1.class"',
                   'width="200"',
                   'height="200"',
                   'type="application/x-java-applet;version=1.6">');
  }
else if (_app == 'Microsoft Internet Explorer') {
   document.write('<OBJECT ',
                   'classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"',
                   'width="200"',
                   'height="200">',
                   '<PARAM name="code" value="Applet1.class">',
                   '</OBJECT>');
}
else {
document.write('<p>Sorry, unsupported browser.</p>');
}
< /script>
< /html>

确定自己浏览器的javascript解释器被打开了,在JavaScript中我们可以用appName变量名来取得浏览器的名字,如果

为Mozilla,我们就让JavaScript写出与Mozilla相关的html代码,如果为Microsoft Internet Explorer,就写出与IE相关的html代码。

 

关于object标签  

Object标签:用于定义网页中除图片以外的多媒体

  • object标签是成对出现的,以<object>开始,</object>结束
  • 使用object标签可以在网页中嵌入各种多媒体,例如Flash,Java Applets,MP3,QuickTime Movies等
  • param标签通常配合object标签一同使用
  • object标签内除了param标签外,其它的内容将在浏览器不支持objcet标签时显示
  • 在网页中嵌入图像,请使用img标签
  • object可以完全代替标准不赞成使用的applet,embed,bgsound标签
  • 引用网址:http://www.dreamdu.com/xhtml/tag_object/

     

  • 属性
    • Common-- 一般属性
    • archive -- 包含多个使用逗号(,)分割的Java类或外部资源,用于增强applet的功能,定义applet代码
    • border -- 边框
    • classid -- 关联一个应用程序,执行嵌入内容的应用程序在windows系统中的唯一id(不能改变此id,否则程序将出现异常),例如
      • clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 -- Flash
    • codebase -- 为相对路径提供基URL,IE浏览器通常将此属性中的内容定义为运行嵌入内容所要加载的插件,例如
      • http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0 -- Flash
    • codetype -- 嵌入内容的MIME类型,例如
      • application/java -- Java
      • application/x-shockwave-flash -- Flash
    • declare -- 声明没有实例化的嵌入内容,此内容通常在加载后可以使用,或者当嵌入内容的某些参数将使用其它嵌入内容时
      • declare -- 声明
    • data -- 嵌入内容的URL,可以是根据codebase属性的相对路径
    • height -- 嵌入内容的高度,单位像素
    • hspace -- 嵌入内容水平方向的空白,应使用CSS margin代替
    • standby -- 文档加载时显示的文本信息
    • tabindex -- 使用"Tab"键的遍历顺序
    • usemap -- 定义图像点击区域
    • viewastext -- 阻止一些可视化工具,例如Microsoft FrontPage或者Visual InterDev在设计页面时运行object内的组件
    • vspace -- 嵌入内容垂直方向的空白,应使用CSS margin代替
    • width -- 嵌入内容的宽度,单位像素
  • object:物体,对象
  • 怎么查看控件的classid

    在注册表中找.但很麻烦.一般网上就有,你找到这样的CLASSID后记住就可以了,一般最重要的是两个,一个是Windows Media Player,还有一个是你说的realplayer.这两个是最最主要的插件.在注册表中查找
    【clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA】这个是realplayer的
    注册表的路径是:HKEY_CLASSES_ROOT\CLSID\{CFCDA953-8BE4-11CF-B84B-0020AFBBCCFA}
    【classid="clsid:05589FA1-C356-11CE-BF01-00AA0055595A"】这个是Media Player的
    注册表的路径是HKEY_CLASSES_ROOT\CLSID\{05589FA1-C356-11CE-BF01-00AA0055595A}
    当你在注册表中找到路径后,在后面就会显示是什么的classid了.

  •  

    JAVA [ Javascript 和 Applet 交互 ]

    ###############Java 中使用 JavaScript 对象######################


    必须引入 netscape.javascript 包,其定义如下: 

     


    netscape.javascript.JSObject 允许 Java 代码访问 JavaScript 方法和属性;
    netscape.javascript.JSException 允许 Java 代码处理 JavaScript 异常; 
    netscape.plugin.Plugin 允许客户端 JavaScript 和 applets 操作一个插件(plug-in)。 
    包在jre\lib\plugin.jar里
     
    用 JSObject 访问 JavaScript
      用 Java 来访问客户端 JavaScript,然而 HTML 页必须允许一个 Java applet 访问 JavaScript— 通过在 <APPLET> 标记中指定MAYSCRIPT 属性。当您在 Navigator 中访问 JavaScript 之前,您必须获得 
    Navigator 窗口的句柄,您可以在 netscape.javascript.JSObject 类中使用的getWindow 方法来达到这个目的。例如,如果先前定义了一个 JSObject 类的变量win,下面的代码将窗口句柄赋予 win:
     
    public class myApplet extends Applet {
     public void init() {
     JSObject win = JSObject.getWindow(this);
     }
    }
     
    在 Java 中处理 JavaScript 的异常
      当从 Java 中调用的 JavaScript 代码发生了运行时的错误,它就会发出一个
    异常,这时您可以用 try...catch 语句来捕获该异常。例如:
     
    try {
     global.eval_r("foo.bar = 999;");
    } catch (Exception e) {
     if (e instanceof JSException) {
      jsCodeFailed()";
     } else {
      otherCodeFailed(); 
      }
    }

    访问 JavaScript 的对象和属性
      我们用 getMember 方法来访问 JavaScript 的对象和属性,例如下面的代码
    允许您通过变量 myForm 来访问 JavaScript 对象 document.testForm:
     
    public void init() {
     win = JSObject.getWindow(this);
     myForm=win.eval_r("document.testForm")
    }
     
    您也可以用下面的语句来代替 myForm=win.eval_r("document.testForm"):
     
    JSObject doc = (JSObject) win.getMember("document");
    JSObject myForm = (JSObject) doc.getMember("testForm");
     
    如果 JavaScript 对象 document.testForm.jazz 是一个 checkbox,下面的语句
    允许您访问它的 checked 属性:
     
    public void init() {
     win = JSObject.getWindow(this);
     JSObject doc = (JSObject) win.getMember("document");
     JSObject myForm = (JSObject) doc.getMember("testForm");
     JSObject check = (JSObject) myForm.getMember("jazz");
     Boolean isChecked = (Boolean) check.getMember("checked");
    }
     
    访问 JavaScript 方法
      在 netscape.javascript.JSObject 类中的方法可以让您求出任一 
    JavaScript 表达式,先用 getWindow 来获得 JavaScript 窗口的句柄,然后再用
     eval 来访问一个 JavaScript 方法,如下:
     
    JSObject.getWindow().eval_r("表达式")

    ###############JavaScript 中使用 Applet对象######################

    <applet id = "" codebase = "." archive = "twaver.jar" code = "demo.MainFrame" width = "100%" height = "75%" align= "middle" MAYSCRIPT>
    </applet>
    ...
    <SCRIPT LANGUAGE="JavaScript">
    <!-- 
    function openURL(name){     
    alert("hello"); 
    }

    //Javascript operates the function 'createServer' in Applet 

    function createServer(name){    

    document.applets[0].createServer('A B C'); 

    }

    //-->

    </SCRIPT>

    ------------------------------------------------------

    import netscape.javascript.*;

    ... 

    public class MainFrame extends JApplet {  

     ...   

    //Applet operates the function 'openURL' in Javascript   

    private void openURL(String name){     

    JSObject window = JSObject.getWindow(this);    

    String code = "openURL(\"" + name + "\");";    

    window.eval_r(code);  

    }   

    public void createServer(String name){     

    Node server = new Node();     

    server.setName(name);     

    box.addElement(server);   

    }

    ...

     

    ###############Java Applet与Ocx控件的交互###################### 

    1.1从Java Applet访问Java Script方法和Ocx控件

    Sun公司在JDK中提供了一套从Java Applet访问Java Script的API,由此可以实现Java Applet访问HTML页面中的DOM对象的机制。该API以一个Jar文件的形式提供:%JAVA_HOME%/jre/lib/jaws.jar,其中%JAVA_HOME%是你安装JDK的目录。将该jar文件加入到环境变量classpath中,就可以用它实现从Java Applet到Java Script的调用了。下面是一段调用Java Script中的方法的代码实例:

    import netscape.javascript.*;

    import java.applet.*;

    import java.awt.*;

    class MyApplet extends Applet {

         public void init() {

             JSObject win = JSObject.getWindow(this);

             JSObject doc = (JSObject) win.getMember("document");

             win.call("f", null);    

    }}

    //在上面的代码中,win.call(“f”, null)调用了JavaScript中的方法f()。

    1.2从JavaScript访问Java Applet

    当使用Java Plugin1.4.x运行Java Applet时,只需把Java Applet中的方法视为Java Plugin这个控件的方法,直接在Java Script中进行调用即可。下面用一个简单的例子进行说明:

    (1) 在载入Java Plugin的Object标签中,用参数ID指定一个名字:

    <OBJECT ID="MyPlunin" WIDTH=500 HEIGHT=120CLASSID="CLSID:8AD9C840-044E-11d1-B3E9-00805F499D93"><PARAM NAME="code" value="MyApplet.class">...</OBJECT>

     

    (2) 在HTML页面上增加一个按钮,点击它时从Java Script调用Java Applet中的方法:

    <input type="button" name="Button1" value="Start"onClick="calculate" language="JavaScript">

     

    (3) 假定你的Java Applet是MyApplet.java,它有一个public方法method1(),那么就可以用如下的Java Script代码直接调用该方法:

    <SCRIPT language="JavaScript">      

    function calculate() { 

                         document.. MyPlunin.method1()      

    }

    </SCRIPT>

    java applet详解、实例

    一、先看看一个简单的applet.

    import java.applet.*;
    import java.awt.*;
    public class HelloApplet extends Applet {
    public void paint(Graphics g) {
          g.drawRect(0, 0, 499, 149);
          g.drawString("Printing...", 5, 70);
    }
    }
    以下是html页面:

    <HTML>
    <HEAD>
       <TITLE>A Simple Program</TITLE>
    </HEAD>
    <BODY>
       <CENTER>
               <APPLET CODE=" HelloApplet.class" WIDTH="500" HEIGHT="150">
          </APPLET>
       </CENTER>
    </BODY>
    </HTML>
    运行的前提是把编译后的HelloApplet.class拷贝的和html同一个目录下。这是个很简单的例子,但这样简单的例子在实际应用中用处很少。

    二、下面接着学一下applet的标签的用法。

    先学习一下applet标签的属性:

    Width:     Applet在Html页面上的宽度
    Height :    Applet在Html页面上的高度
    Name :    Applet在Html页面上的名称,用于区名一个Html页面上的多个Applet。

    Id:为 applet 指定一个 id 属性,从而能够将其作为简单的对象处理,用javascript调用其对象的方法。

    Archive: 当 applet 被存储在某个 JAVA 档案文件或 ZIP 文件中时,此 applet 的 URL。

    Code: 执行 applet 的 class 的 URL。

    Codebase: 指示 applet 的基准 URL,假如 code 属性是相对的。

    Param:传递参数。

    这些属性里面,可能最容易出现错误的是Code和Codebase属性。举个例子可能就明白了:

         假如我的web工程下有个index.jsp的页面放在根目录下,该页面需要调用一个applet,而这个HelloApplet.java在com包下。正确的做法是先把HelloApplet.class拷贝到index.jsp的同一目录下,然后

          <APPLET CODE="com.HelloApplet.class" id="helloApplet" codebase="."/>

    注意:

    1、 code一定要写包名,codebase="."表示是从index.jsp的当前目录开始。

    2、 一定要把HelloApplet.class拷贝出来放到jsp的页面目录下,如果放到web-info/classes/com/下就会出错,因为web-inf文件夹安全性比较高,客户端无法访问的。

    三、下面我们看一个复杂的例子,这个例子中前台的页面需要调用的applet不是一个class,这样就需要调用一个jar包,而且这个applet需要调用客户端本地的应用程序。

    (1) Applet类:

    package com;
    import java.applet.*;
    import java.awt.*;
    import java.io.IOException;
    public class HelloApplet extends Applet {

         public void paint(Graphics g) {

                g.drawRect(0, 0, 499, 149);

                g.drawString("Hello World", 5, 70);

         }

         /**

          * 通过applet调用本地的计算器

          */

         public void openApp() {

                String url = "C:\\WINDOWS\\system32\\calc.exe";

                System.out.println("url=" + url);

                try {

                       Runtime.getRuntime().exec(url);

                } catch (IOException e) {

                       e.printStackTrace();
                }
         }
    }

    (2) jsp页面

    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

    <head>

        <title>demo</title>

    </head>

    <body>

          <APPLET CODE="com.HelloApplet.class" id="helloApplet" codebase="." ARCHIVE = "helloApplet.jar" WIDTH="500" HEIGHT="150">

          </APPLET>

          <p><a href="#" onclick="openApp()">计算器</a></p>

          <script type="text/javascript">

          function openApp()

          {

            var helloApplet = document.getElementById("helloApplet");

            helloApplet.openApp();

          }

          </script>

    </body>

    </html>

    (3)把HelloApplet打成jar包,因为在实际的应用中一个类就能解决问题的情况很少。Cmd 切换到web-info/classes目录下,通过如下命令打包:

    jar -cvf helloApplet.jar *.*

    (4)为了使得applet能够访问本地的应用,需要给它签名。

    keytool -genkey -keystore hello.store -alias hello

    这个命令用来产生一个密匙库,执行完毕后应该产生一个 hello.store的文件,这个名字你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。输入密码后,它会提示你输入用户名,公司名等信息,这些都不是必须输入的,你可以直接回车跳过,最后问你输入是否正确,你可以输入y或n回答正确或错误。

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

    这个命令用来产生签名时所要用的证书,这个命令执行完后产生一个pepper.cert的文件。

    jarsigner -keystore hello.store helloApple

    这个命令用上面产生的证书将我们的jar文件进行了签名。最后把该jar包拷贝到jsp文件所在地目录下。

    (5)因为applet的运行是沙箱机制,在调用本地程序时需要做安全性设置。在本地运行该applet的jre\lib\security\java.policy文件里最后加permission java.security.AllPermission;这里需要注意的是如果客户端装有多个jre的话,需要找一下哪个jre是真正运行applet的。

    (6)在运行的时候,第一次会提示是否信任该applet,点击使准信任,然后运行,下次就不会在提示。

    注意:在用浏览器调试applet的过程中,可以打开java控制台,位置在Ie的工具菜单的java控制台。

     

    0 0
    原创粉丝点击