LiveConnect是一种允许Java和JavaScript相互通信的技术。 它允许您的Java类调用JavaScript方法并访问JavaScript环境。 JavaScript还可以访问Java对象并在其上调用方法。 LiveConnect最初是在Netscape浏览器中实现的,当前Mozilla Firefox完全支持此功能。 在本教程中,您将学习如何编写使Java和JavaScript之间的通信成为可能的代码。
LiveConnect有两个主要方面:
- 从JavaScript调用Java方法
- 在Java中使用JavaScript对象
从JavaScript访问Java:
每当您需要访问Java对象,类,数组或包时,只需使用以下四个LiveConnect对象之一即可。
-
JavaObject
–用于从JavaScript访问Java对象。 -
JavaClass
–用作对Java类的引用。 -
JavaArray
–用于访问Java数组。 -
JavaPackage
–用作对Java包的引用。
使用JavaObject
您可以在new
关键字的帮助下创建Java对象并将其分配给JavaScript中的变量。 创建Java类的实例时,JavaScript会自动创建JavaObject
对象。 例如,您可以从JavaScript实例化Java String
并将其分配给变量。 然后,您可以使用点运算符访问对象的length()
方法,如下所示。
var myString=new java.lang.String("Test String");
alert(myString.length()); //prints 11
使用JavaClass
每当您在代码中引用Java类并将其分配给变量时,JavaScript运行时都会自动创建JavaClass
对象。 例如,以下代码创建一个JavaClass
对象。
var myInteger=java.lang.Integer;
alert(myInteger.MIN_VALUE);
使用JavaPackage
同样,只要您JavaScript代码引用Java包,JavaScript运行时就会自动创建JavaPackage
对象。 在这种情况下,我们将在mypackage
包内创建类MyClass
的实例。
var myVar=new Packages.mypackage.MyClass();
如果您的类不属于任何包,则可以直接实例化它,如以下示例所示。
var myVar=new Packages.MyClass();
常用的类(例如java
, sun
和netscape
软件包中的类)可以通过以下方式实例化。
var myVar=new java.lang.String();
上面的代码等效于以下代码:
var myVar=new Packages.java.lang.String();
使用JavaArray
每当您在JavaScript代码中创建Java数组时,都会自动创建JavaArray
对象。 例如,以下代码创建一个包含五个String
的Java数组。
var myArray=java.lang.reflect.Array.newInstance(java.lang.String,5);
稍后,您可以使用length
属性打印数组的length
。
var myArray=java.lang.reflect.Array.newInstance(java.lang.String,5);
alert(myArray.length); //outputs 5
在Java代码中访问JavaScript对象
我们主要使用以下两个类从Java访问JavaScript环境。
-
netscape.javascript.JSObject
–用于访问JavaScript方法和属性。 -
netscape.javascript.JSException
–用于Java代码内部的异常处理。
默认情况下,您的代码无法访问这些类。 为了使它们可访问,您需要在CLASSPATH
添加一个包含这些类的jar。 打开您的JRE安装目录,然后转到lib
文件夹。 您将找到一个名为plugin.jar
的jar文件。 将此jar添加到您的类路径中,以便在运行应用程序时上述两个类可用于JRE。
使用JSObject
Java中出现的所有JavaScript对象都是JSObject
类型。 还记得我们讨论过从JavaScript调用Java方法吗? 好了,您可以从JavaScript代码调用任何Java方法,并将JavaScript对象作为参数传递给该方法。 这些对象然后在Java端转换为JSObject
类型。 为了使这些方法起作用,您需要在Java方法签名中定义JSObject
类型的形式参数。 下面的示例显示Java类Player
如何通过其构造函数获取JSObject
并使用它来获取JavaScript对象的成员。
public class Player{ public String name,age; public Player(JSObject js){ this.name=(String)js.getMember("name"); this.age=(String)js.getMember("age"); } }
接下来,我们将在JavaScript中创建一个名为Player
的对象。
function Player(name,age){
this.name=name;
this.age=age;
}
现在可以创建一个JavaScript对象Player
,并将其实例化时传递给Java Player
类的构造函数。
var player=new Packages.Player(new player("John Doe","20"));
// instantiates Java class Player and passes the JavaScript Player object as argument.
使用JSException
处理Java中JavaScript错误
访问JavaScript环境时,Java代码可能会出错。 在这种情况下,可以使用JSException
类。 下面的示例演示JSException
的用法。
public class TestException{ public Object process(JSObject js, String method){ try{ js.eval(method); //tries to call a JavaScript method. If method is undefined it will throw an exception. } catch(JSException e){ System.out.println(e); } return null; } }
用法示例
现在我们知道了如何从JavaScript调用Java方法并在Java中使用JavaScript对象,现在该创建一个小型应用程序了,以便使整体概念清晰明了。 我们将创建一个非常简单的应用程序,要求用户输入他/她的姓名,年龄和选择的编程语言。 根据选择的语言,应用程序将显示一条消息,指示学习的最佳框架。 当我们使用LiveConnect构建应用程序时,我们在Java和JavaScript中都有一个Programmer
类。
页面中还存在一个applet。 这样做是因为LiveConnect可访问的第一个对象是公共applet实例。 从小程序中,我们可以获得所需的对象。 在我们的程序中, LauncherApplet
有一个返回Programmer
对象的方法。 首先,我们需要调用此方法以在我们JavaScript代码中获取一个Programmer
实例。 基本思想是预先填充Programmer
对象。 然后,在加载HTML页面之后,显示一条消息,显示对象的各种属性。 然后,从HTML表单获取用户输入,并构造一个JavaScript Programmer
对象。
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
下一步是将新构造JavaScript对象传递给Java方法setData
。 Java方法读取对象的属性并更新其属性。 确保将Programmer
类声明为公共类,否则无法从JavaScript访问它。 最后一步,我们在Java对象上调用另一个方法getAdvice()
,该方法返回有关用户应使用哪种框架的个性化建议。
Java Programmer
类的源代码如下所示。
import netscape.javascript.*; public class Programmer { public String name="Sandeep"; public String age="20"; public String language="Java"; public void setData(JSObject js){ try{ this.name=((String)js.getMember("name")).toLowerCase(); this.age=((String)js.getMember("age")).toLowerCase(); this.language=((String)js.getMember("language")).toLowerCase(); System.out.println("Name= "+name+",Age= "+age+",language= "+language); } catch(JSException e){System.out.println(e);} } public String getAdvice(){ String advice=""; switch(language){ case "php": advice=name+", you should definitely try out CodeIgniter."; break; case "java": advice=name+", you should definitely try out JavaServer Faces."; break; case "python": advice=name+", you should definitely try out Django."; break; default: advice="You language of choice is not any one of PHP, Java or Python"; } return advice; } }
我们的LauncherApplet
类如下所示:
import java.applet.*; import java.awt.*; public class LauncherApplet extends Applet{ public Programmer getProgrammer(){ return new Programmer(); } }
HTML页面的结构如下:
<html>
<head>
<title>Applet Test</title>
<script type="text/javascript" src="liveconnect.js"/>
</head>
<body onload="showProgrammer()">
<applet id="app" code="LauncherApplet" height="1" width="1" MAYSCRIPT></applet>
<table>
<tr>
<td>Name</td>
<td>:</td>
<td><input type="text" id="name"/></td>
</tr>
<td>Age</td>
<td>:</td>
<td><input type="text" id="age"/></td>
</tr>
<td>Programming Language(PHP,Java or Python)</td>
<td>:</td>
<td><input type="text" id="language"/></td>
</tr>
</table>
<input type="button" onclick="processProgrammer()" value="click"/>
</body>
</html>
在liveconnect.js
我们定义了两个函数和一个Programmer
类。 Programmer
类在下面定义。
function Programmer(name,age,language){
this.name=name;
this.age=age;
this.language=language;
}
接下来,我们定义一个函数showProgrammer()
,该函数显示页面加载时Java对象Programmer
的属性。 该函数的代码如下:
function showProgrammer(){
try{
var programmer=app.getProgrammer(); //app is the id of applet tag which refers to the applet instance.
var data="Name= "+programmer.name+",Age= "+programmer.age+",Language= "+programmer.language;
alert(data);
}
catch(e){
alert(e);
}
}
最后,我们定义了processProgrammer()
函数,该函数读取名称,年龄和编程语言选择输入。 然后,它使用这些值创建一个JavaScript Programmer
对象,并在Java端调用setData()
。 JavaScript Programmer
对象是setData()
的参数。 在下一步中,我们将使用Java Programmer
对象的属性来准备建议。 最后,建议返回到JavaScript端。
function processProgrammer(){
try{
var name=document.getElementById("name").value;
var age=document.getElementById("age").value;
var language=document.getElementById("language").value;
var programmer=app.getProgrammer();
var myprog=new Programmer(name,age,language);
programmer.setData(myprog);
var advice=programmer.getAdvice();
alert(advice);
}
catch(e){
alert(e);
}
}
结论
通过将JavaScript连接到Java,您可以创建功能非常强大的应用程序。 但是,并非所有浏览器都完全支持LiveConnect。 上面的应用程序已经在Firefox 11.0中进行了测试,并且Java代码是使用JDK 7编译的。因此,如果要测试代码示例,请确保已在系统上安装了JDK 7。 要了解有关LiveConnect的更多信息,请在Mozilla开发人员网络上查看LiveConnect 。
翻译自: https://www.sitepoint.com/connect-java-to-javascript-with-liveconnect/