Java与JavaScript的通信
时间:2007-02-17 来源:PHP爱好者
文/ Jeremiah Talkar 信任 1. 聊天演示程序内在的想法,连同这篇文章一起都是我自己的。我所见过的所有聊天程序不是完全基于JAVA就是HTML。我的方法是这两种方法的一个很好的平衡。 2. 我通过在Netscape开发者站点阅读大量的文章后收集了在JAVA和JAVAs cript间通信的技术信息。 3. 我第一次在读Danny Goodman的文章时(The Javas cript Apostle on the Netscape site)偶然遇到术语“不知名的applet(Faceless applet)”。因此出于对Danny的信任我使用了这个非常切题的术语。 放弃 1. 这篇文章中讨论的技术已经在Windows 2000 Professional机器上使用Internet Explorer 5.0和 Netscape Navigator 4.7测试过了。在我所知道的最佳作品中,这些技术应该在任一浏览器4.0以上的版本上运行,但我不能保证我这样做,因为我没有时间用这些版本将它测试出来。 2. 因为JAVAs cript是唯一一种在两种主要浏览器都得到支持的语言,所有的脚本代码使用这种语言。我先前在http://www.ncompasslabs.com上使用了一个可用的商业插件,这个插件可以让Netscape Navigator支持VBs cript,但我去他们的站点核实这个信息的时候,这个产品已经没有列出了。 引言 我一直从事现代COM的工作两年了,现在是我公司的e化商业产品团队的技术领导。我明白好的界面设计和在不同环境像Visual C++, Visual Basic 还有脚本下都能很好执行程序的重要性。基于界面的程序设计的能力在我的头脑中已经永远确立,并且作为一个软件工程师我试着将它应用到我所涉及的每件事情中。 在过去的一年里,当ASP+脚本就要被当作这些对象的黏合剂使用的时候,经验告诉我们的勤奋:所有的商业逻辑应该被压缩在COM对象之内。设计和开发典型的基础设施和商业对象要求一个更高的技术设备,它用来比较什么是要求实际使用同一个事物的。开发这些对象的首选环境(至少在我的团队中)是Visual C++ / ATL / STL。微软也鼓励Visual Basic成为这些对象可选择的开发环境。 这些对象被代表性的称为“不知名的”,因为他们实现许多逻辑但用户界面除外。它的表现层次(presentation tier)不是一个充足的客户就是一个不充足的客户(这个客户有从最终用户表达信息和聚集信息的逻辑)。然后这样的一个客户用这些信息通过使用不知名的对象做一些有意义的事情。这整个想法是当商业对象改变不频繁时表现层次会代表性的要求许多客户定制。表现层次要求的改变也可以通过使用较少的经验程序来实现。 应用这些相同的原理到浏览器环境,当使用一种脚本语言处理表现方面时,在“不知名的”二进制模块中压缩高度发展的客户方的逻辑看起来是合乎逻辑的。在Windows平台上这些模块的选项是Java applet和ActiveX 控件/服务器。这篇文章的焦点是使用Java applet完成这个目标,因为applet是独立于浏览器,平台和处理器的(对大部分而言)。 Applet的简短历史 SUN Microsystems1995年在嘹亮的号角声中引入了Java applet。Applet立即博得WEB世界的欢心,因为它们增加了在原来是一个静态HTML的世界的浏览器中动态地显示WEB内容的能力。 在最初的日子里,使用Java applet作为最好的一种在网页中增加动态内容的方式出现了。最初Microsoft 试图使用他们的ActiveX Control技术反对SUN提供的Java applet,但是在网页内部使用控件存在两个主要问题: ● 二进制模块是处理器指定的,因此不适合作为网页的一部分运行。万维网(World Wide Web)如此成功的一个主要原因是使用W3C标准HTML写出的大部分网页对浏览器和处理器是不可知的事实。ActiveX控件正好不符合这个范例。 ● 安全是一个大问题,因为控件编写者有足够的权利在客户机器上存取资源。签了名的控件允许任何一个人查看网页并聪明地作出是否应该在他/她的机器上下载一个特定控件的决定,但是所有他进行的是一个按钮意外的点击(或者是高兴地忽略),这样就留下了易受攻击的客户机,这也正符合恶意控件编写者的意图。 当动态HTML终于开始成型时,事情彻底地改变了。文档对象模型(Document Object Model )作为可以设计的组件,它们用它们自己的属性和方法揭露了网页元素。即使Internet Explorer和Netscape Navigator浏览器执行动态HTML有许多不同,但使用脚本代码程序化的改变显示页内容本身的根本主题就是是一个巨大的成功。Applet突然开始看起来是又旧又粗糙的。W3C对动态HTML的认可最终对高度发展的,动态网页的新种类调整了语气。 在浏览器内是使用Java applet有以下列出的几种优点: ● Applet(对大多数Applet而言)可以在多浏览器,平台和处理器上工作。 ● JAVA语言是典型的一种强大的概念性语言。 ● JDK有许多典型的且只在高层类库中创建的有用的类。 ● 技术中已经构思了安全,applet只能用默认值在方框中运行。如果它们要打破方框的限制则Applet必须是已经签了名的。 ● Applet可以就发回用户化信息,上传/下载文件等而与网页服务器取得联系。签了名的applet可以与任何一个服务器联系,而不仅仅是一个它们的主机。 ● 通过“查看源文件”选项不能看到applet代码,因此保护了知识产权。 ● JAVA的.class文件非常小,结果是下载非常快。 使用Java apple的缺点: ● 在一次浏览器对话中,下载applet不是网页使用它们的第一时间显示就是网页随后刷新后显示。Applet在浏览器对话中不长驻客户机。事实上在大多数场合下这可以作为一种优势考虑。 ● Applet要花很长时间初始化。 ● 因为JAVA的.class文件是被JAVA虚拟机(Java virtual machine ,JVM)解释的字节代码,所以applet运行比本地代码慢。 ● 一个applet只是浏览器上真正状态的一部分,它不会无缝完好地出现在网页内容中。层叠样式单(Cascading style sheets ,CSS)也不会直接影响applet占有的矩形区域。 ● Netscape Navigator 4.x有十个活动applet的限制。我不知道Internet Explorer 4.0+有任何一种这样的限制。 使用Java applets的快速回顾 Java applets通过使用用applet标签被包含进一个HTML网页中。W3C 站点上HTML 4.01说明书的13.4节详细地说明了这个标记。它也提到赞成<object>,而不赞成使用这个标记。 一个简单地包含applet的HTML网页如下所示:<html>
<head>
<title>Calculator</title>
</head>
<body>
<applet id="Calculator" width="300" height="500" code ="Calculator.class" codebase=".">
<param name="InitialMode" value="Normal">
</applet>
</body>
</html> 上例中用到的属性解释如下: Id Applet实例的标识符。客户方脚本代码能知道使用这个id的applet。 Width 这个属性指定了applet显示域的初始宽度(不包括applet创建的窗口或者对话框)。即使我经成功使用了宽度0用 “放弃”一节中提到的浏览器,还是推荐使用值1作为最小的可能宽度。 Height 这个属性指定了applet显示域的初始高度(不包括applet创建的窗口或者对话框)。就像用宽度属性一样,推荐使用值1作为最小的可能宽度。 Code 这个属性指定了任一类文件(包含applet编译的applet子类或者能够得到类的路径,包括类文件自身)的名字,它在谈到applet的codebase时会作出解释。 Codebase 这个属性指定applet的基本URI. 如果这个属性没有指定,那么它默认最近的文档为同一个基本URI。 只有code, width和height 属性是必须的。 Param标记包含一对名字的值,它允许applet第一次运行时安装自己。 在上面的applet调用一个方法的JAVAs cript函数如下,它非常简单:<s cript language=Javas cript>
function SetCalculatorMode(Mode)
{
document.Calculator.SetCalculatorMode (Mode);
// Alternative way to reference the applet.
// document.applets[0].SetCalculatorMode(Mode);
}
</s cript> 劳动力的分工 在这篇文章的引言部分,我暗示当通过Javas cript代码处理表现形式时,高度发展的浏览器方正处理的一个方法是被压缩进不知名的Java applets中的。这个方法要求在Java和Javas cript间双向通信。下面几章会研究可用的选项。 通过JAVAs cript代码存取Java applet暴露的成员和函数是直截了当的,像上一节中的SetCalculatorMode()函数说明的一样。文档内的applet不是通过使用它的Id / Name就是使用applet收集的索引来查询。 例如: document.Calculator.SetCalculatorMode(Mode);// or document.applets[0].SetCalculatorMode(Mode); 使用netscape.javas cript.JSObject类和netscape.javas cript.JSException类完成了其它方向(Java to Javas cript)的通信。为了找到这些类在什么位置,我在我的硬盘驱动器上寻找所有包含字符串“JSObject”的文件。令我吃惊的是,这些文件在许多不同的程序中得到广泛地使用,包括是Visual Interdev工程一部分的库。 如果Netscape Navigator 4.0+安装在你的机器上,这些.class文件在 <Navigator Installation Directory>communicatorprogramjavaclasses 目录下的Java40.jar 文件中可用。 我也在<Windows Installation Directory>JavaPackages目录下的四个不同的.zip文件中寻找这些.class文件。这些.zip文件显然是Microsoft产品安装的,因为它们包含许多com.ms包。它们的用途是这两个类对任一浏览器都是可用的,你可以设置你的CLASSPATH环境变量给任一个上述路径。一个可选的方法是使用一个程序像WINZIP从.jar或者.zip文件中解压缩这些文件到你的applet目录下。 JSObject类 引用JSObject类成员函数的简短描述是为了更好的理解这个类的用途。 public static JSObject getWindow (Applet applet ) 这个静态方法对含有给出的applet窗口返回一个JSObject。例如:JSObject MainWindow = JSObject.getWindow ( this ); public Object call ( String methodName, Object args[ ] ) 这个函数从Java applet内部调用一个Javas cript方法。例如:JSObject MainWindow = JSObject.getWindow ( this );
String Arguments[ ] = {"90", "2"}; // {"Percent complete", "Time remaining"}
MainWindow.call ( "UpdateProgressIndicator", Arguments ); public Object eval ( String s ) 这个方法求一个Javas cript表达式的值。表达式是这个对象上下文中待求的Javas cript源代码的一个字符串。例如:JSObject MainWindow = JSObject.getWindow ( this );
JSObject UserName = MainWin.eval ( "document.UserInfoForm.UserName" );public Object getMember ( String name )这个方法检索Javas cript对象的一个索引成员,等价于Javas cript对象的this.name。:JSObject MainWindow = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject)MainWindow.getMember ( "document" );
JSObject UserInfoForm = (JSObject) DocumentPage.getMember ( "UserInfoForm" );
JSObject UserName = (JSObject) UserInfoForm.getMember ( "UserName" );public Object getSlot ( int index)这个方法检索Javas cript对象的一个索引成员,等价于Javas cript对象的this [index]。例如:JSObject MainWindow = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject)MainWindow.getMember ( "document" );
JSObject Applets = (JSObject) DocumentPage.getMember ( "applets" );
Object theApplet = Applets.getSlot ( index );public void removeMember ( String name )这个方法删除一个JAVAs cript对象的指定成员。public void setMember ( String name, Object value )这个方法设置一个JAVAs cript对象的指定成员。它等价于Javas cript对象的this.name = value。例如:JSObject MainWin = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject) MainWin.getMember ( "document" );
JSObject UserInfoForm = (JSObject) DocumentPage.getMember ( "UserInfoForm" );
JSObject UserName = (JSObject) UserInfoForm.getMember ( "UserName" );
UserName.setMember ( "value", "Jeremiah S. Talkar" );public void setSlot ( int index, Object value )这个方法设置一个JAVAs cript对象的索引成员。它等价于Javas cript对象的this[index] = value。 public String toString () 这个方法将JSObject转换成一个字符串。 上面的例子是很清楚的。JSObject类的公共方法试图在JavaApplet中调用Javas cript函数时是不受限制的。他们也可以使一个applet直接处理文档对象模型元素。 这些类完整的文档可以在http://developer.netscape.com/docs/manuals/communicator/jsref/pkg.htm上得到。 文档也解释了怎样在Java和Javas cript间处理数据类型。 MAYs cript属性的意义 即使applet使用JSObject调用Javas cript函数,或者直接访问文档对象模型,如果applet标签没有包含在MAYs cript属性中的话JSObject的方法就会失败。这一点能使网页设计者测定一个applet是否能唤起Javas cript。 不知名的applet间的通信 在
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
<head>
<title>Calculator</title>
</head>
<body>
<applet id="Calculator" width="300" height="500" code ="Calculator.class" codebase=".">
<param name="InitialMode" value="Normal">
</applet>
</body>
</html> 上例中用到的属性解释如下: Id Applet实例的标识符。客户方脚本代码能知道使用这个id的applet。 Width 这个属性指定了applet显示域的初始宽度(不包括applet创建的窗口或者对话框)。即使我经成功使用了宽度0用 “放弃”一节中提到的浏览器,还是推荐使用值1作为最小的可能宽度。 Height 这个属性指定了applet显示域的初始高度(不包括applet创建的窗口或者对话框)。就像用宽度属性一样,推荐使用值1作为最小的可能宽度。 Code 这个属性指定了任一类文件(包含applet编译的applet子类或者能够得到类的路径,包括类文件自身)的名字,它在谈到applet的codebase时会作出解释。 Codebase 这个属性指定applet的基本URI. 如果这个属性没有指定,那么它默认最近的文档为同一个基本URI。 只有code, width和height 属性是必须的。 Param标记包含一对名字的值,它允许applet第一次运行时安装自己。 在上面的applet调用一个方法的JAVAs cript函数如下,它非常简单:<s cript language=Javas cript>
function SetCalculatorMode(Mode)
{
document.Calculator.SetCalculatorMode (Mode);
// Alternative way to reference the applet.
// document.applets[0].SetCalculatorMode(Mode);
}
</s cript> 劳动力的分工 在这篇文章的引言部分,我暗示当通过Javas cript代码处理表现形式时,高度发展的浏览器方正处理的一个方法是被压缩进不知名的Java applets中的。这个方法要求在Java和Javas cript间双向通信。下面几章会研究可用的选项。 通过JAVAs cript代码存取Java applet暴露的成员和函数是直截了当的,像上一节中的SetCalculatorMode()函数说明的一样。文档内的applet不是通过使用它的Id / Name就是使用applet收集的索引来查询。 例如: document.Calculator.SetCalculatorMode(Mode);// or document.applets[0].SetCalculatorMode(Mode); 使用netscape.javas cript.JSObject类和netscape.javas cript.JSException类完成了其它方向(Java to Javas cript)的通信。为了找到这些类在什么位置,我在我的硬盘驱动器上寻找所有包含字符串“JSObject”的文件。令我吃惊的是,这些文件在许多不同的程序中得到广泛地使用,包括是Visual Interdev工程一部分的库。 如果Netscape Navigator 4.0+安装在你的机器上,这些.class文件在 <Navigator Installation Directory>communicatorprogramjavaclasses 目录下的Java40.jar 文件中可用。 我也在<Windows Installation Directory>JavaPackages目录下的四个不同的.zip文件中寻找这些.class文件。这些.zip文件显然是Microsoft产品安装的,因为它们包含许多com.ms包。它们的用途是这两个类对任一浏览器都是可用的,你可以设置你的CLASSPATH环境变量给任一个上述路径。一个可选的方法是使用一个程序像WINZIP从.jar或者.zip文件中解压缩这些文件到你的applet目录下。 JSObject类 引用JSObject类成员函数的简短描述是为了更好的理解这个类的用途。 public static JSObject getWindow (Applet applet ) 这个静态方法对含有给出的applet窗口返回一个JSObject。例如:JSObject MainWindow = JSObject.getWindow ( this ); public Object call ( String methodName, Object args[ ] ) 这个函数从Java applet内部调用一个Javas cript方法。例如:JSObject MainWindow = JSObject.getWindow ( this );
String Arguments[ ] = {"90", "2"}; // {"Percent complete", "Time remaining"}
MainWindow.call ( "UpdateProgressIndicator", Arguments ); public Object eval ( String s ) 这个方法求一个Javas cript表达式的值。表达式是这个对象上下文中待求的Javas cript源代码的一个字符串。例如:JSObject MainWindow = JSObject.getWindow ( this );
JSObject UserName = MainWin.eval ( "document.UserInfoForm.UserName" );public Object getMember ( String name )这个方法检索Javas cript对象的一个索引成员,等价于Javas cript对象的this.name。:JSObject MainWindow = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject)MainWindow.getMember ( "document" );
JSObject UserInfoForm = (JSObject) DocumentPage.getMember ( "UserInfoForm" );
JSObject UserName = (JSObject) UserInfoForm.getMember ( "UserName" );public Object getSlot ( int index)这个方法检索Javas cript对象的一个索引成员,等价于Javas cript对象的this [index]。例如:JSObject MainWindow = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject)MainWindow.getMember ( "document" );
JSObject Applets = (JSObject) DocumentPage.getMember ( "applets" );
Object theApplet = Applets.getSlot ( index );public void removeMember ( String name )这个方法删除一个JAVAs cript对象的指定成员。public void setMember ( String name, Object value )这个方法设置一个JAVAs cript对象的指定成员。它等价于Javas cript对象的this.name = value。例如:JSObject MainWin = JSObject.getWindow ( this );
JSObject DocumentPage = (JSObject) MainWin.getMember ( "document" );
JSObject UserInfoForm = (JSObject) DocumentPage.getMember ( "UserInfoForm" );
JSObject UserName = (JSObject) UserInfoForm.getMember ( "UserName" );
UserName.setMember ( "value", "Jeremiah S. Talkar" );public void setSlot ( int index, Object value )这个方法设置一个JAVAs cript对象的索引成员。它等价于Javas cript对象的this[index] = value。 public String toString () 这个方法将JSObject转换成一个字符串。 上面的例子是很清楚的。JSObject类的公共方法试图在JavaApplet中调用Javas cript函数时是不受限制的。他们也可以使一个applet直接处理文档对象模型元素。 这些类完整的文档可以在http://developer.netscape.com/docs/manuals/communicator/jsref/pkg.htm上得到。 文档也解释了怎样在Java和Javas cript间处理数据类型。 MAYs cript属性的意义 即使applet使用JSObject调用Javas cript函数,或者直接访问文档对象模型,如果applet标签没有包含在MAYs cript属性中的话JSObject的方法就会失败。这一点能使网页设计者测定一个applet是否能唤起Javas cript。 不知名的applet间的通信 在
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +