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();

常用的类(例如javasunnetscape软件包中的类)可以通过以下方式实例化。

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对象。


<source type="image/webp"><source><img src="https://s2.51cto.com/images/blog/202409/24100614_66f21e96255a770725.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=" alt="">


免费学习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