从 JavaScript 代码调用 Applet 方法

网页上的 JavaScript 代码可以与网页上嵌入的 JavaServlets 交互。 JavaScript 代码可执行以下操作:

  • 在 Java 对象上调用方法

  • 获取和设置 Java 对象中的字段

  • 获取和设置 Java 数组元素

LiveConnect Specification描述了有关 JavaScript 代码与 Java 代码如何通信的详细信息。

当 JavaScript 代码调用 JavaServlets 时,将显示安全警告。要取消显示这些警告,请将Caller-Allowable-Codebase属性添加到 JAR 文件清单中。指定允许调用 Servlets 的 JavaScript 代码的位置。有关Caller-Allowable-Codebase属性的信息,请参见用于安全性的 JAR 文件清单属性

本主题使用 Math applet 示例探索 JavaScript 代码与 Java applet 的通信。 MathApplet类和支持Calculator类提供了一组公共方法和变量。网页上的 JavaScript 代码调用并评估这些公共成员以传递数据并检索计算的结果。

mathServlets 及相关类

这是MathApplet类的源代码。 getCalculator方法返回对Calculator helper 类的引用。

package jstojava;
import java.applet.Applet;

public class MathApplet extends Applet{

    public String userName = null;
         
    public String getGreeting() {
        return "Hello " + userName;
    }
    
    public Calculator getCalculator() {
        return new Calculator();
    } 
    
    public DateHelper getDateHelper() {
        return new DateHelper();
    }
    
    public void printOut(String text) {
        System.out.println(text);
    }
}

Calculator类中的方法使用户可以设置两个值,添加数字并检索范围内的数字。

package jstojava;

public class Calculator {
    private int a = 0;
    private int b = 0; // assume b > a
    
    public void setNums(int numA, int numB) {
        a = numA;
        b = numB;
    }
    
    public int add() {
        return a + b;
    }
    
    public int [] getNumInRange() {    
        int x = a;
        int len = (b - a) + 1;
        int [] range = new int [len];
        for (int i = 0; i < len; i++) {
            range[i]= x++;
            System.out.println("i: " + i + " ; range[i]: " + range[i]);
        }
        return range;
    }
}

DateHelper类的getDate方法返回当前日期。

package jstojava;
import java.util.Date;
import java.text.SimpleDateFormat;

public class DateHelper {
    
    public static String label = null;
        
    public String getDate() {
        return label + " " + new SimpleDateFormat().format(new Date());
    }

}

部署 Servlets

在网页AppletPage.html中部署 Servlets。在部署 Servlets 时,请确保指定 Servlets 的 ID。ServletsID 稍后用于获取对 Servlets 对象的引用。

<script src=
  "https://www.java.com/js/deployJava.js"></script>
<script>
    <!-- applet id can be used to get a reference to
    the applet object -->
    var attributes = { id:'mathApplet',
        code:'jstojava.MathApplet',  width:1, height:1} ;
    var parameters = { jnlp_href: 'math_applet.jnlp'} ;
    deployJava.runApplet(attributes, parameters, '1.6');
</script>

接下来,向AppletPage.html网页添加一些 JavaScript 代码。 JavaScript 代码可以将 applet id 用作对 applet 对象的引用,并调用 applet 的方法。在下面显示的示例中,JavaScript 代码设置了 applet 的 public 成员变量,调用了 public 方法,并检索了对 applet 所引用的另一个对象(Calculator)的引用。 JavaScript 代码能够处理原始,数组和对象返回类型。

<script language="javascript">
    function enterNums(){
        var numA = prompt('Enter number \'a\'?','0');
        var numB = prompt(
            'Enter number \'b\' (should be greater than number \'a\' ?','1');
        // set applet's public variable
        mathApplet.userName = "John Doe";

        // invoke public applet method
        var greeting = mathApplet.getGreeting();

        // get another class referenced by applet and
        // invoke its methods
        var calculator = mathApplet.getCalculator();
        calculator.setNums(numA, numB);

        // primitive datatype returned by applet
        var sum = calculator.add();

        // array returned by applet
        var numRange = calculator.getNumInRange();

        // check Java console log for this message
        mathApplet.printOut("Testing printing to System.out");

        // get another class, set static field and invoke its methods
        var dateHelper = mathApplet.getDateHelper();
        dateHelper.label = "Today\'s date is: ";
        var dateStr = dateHelper.getDate();
        <!-- ... -->
</script>

当数字 a = 0 和 b = 5 时,MathServlets 在网页上显示以下结果:

Results of JavaScript to Java Communication

Hello John Doe

a = 0 ; b = 5

Sum: 5

Numbers in range array: [ 0, 1, 2, 3, 4, 5 ]

Today's date is: 5/28/13 4:12 PM //shows current date

在浏览器中打开AppletPage.html以查看 mathServlets。

Note:

如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)6 更新 10版本。

Note:

如果看不到示例正在运行,则可能需要在浏览器中启用 JavaScript 解释器,以便 Deployment Toolkit 脚本能够正常运行。

选中security restrictions放在 JavaScript 代码调用的 Servlets 上。

下载源代码用于“从 JavaScript 代码调用 Applet 方法”示例,以进行进一步试验。