从 Servlets 调用 JavaScript 代码

Java applet 可以调用与 applet 在同一网页中的 JavaScript 函数。 LiveConnect Specification描述了有关 JavaScript 代码与 Java 代码如何通信的详细信息。

netscape.javascript.JSObject类使 Java applet 能够检索对 JavaScript 对象的引用并与网页进行交互。接下来描述的数据摘要 Servlets 调用 JavaScript 代码从网页中检索信息,并将数据摘要写回到网页中。

假设您有一个带有一些 JavaScript 函数的网页。示例AppletPage.html具有 JavaScript 函数来检索年龄,地址和电话 Numbers。还有一个名为userName的变量,一开始就没有值。

<head>
<title>Data Summary Applet Page - Java to JavaScript LiveConnect</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/>
<script language="javascript">
    var userName = "";
    
    // returns number
    function getAge() { 
        return 25;
    }
    // returns an object
    function address() { 
        this.street = "1 Example Lane";
        this.city = "Santa Clara";
        this.state = "CA";
    }
    // returns an array
    function getPhoneNums() { 
        return ["408-555-0100", "408-555-0102"];
    } 
    function writeSummary(summary) {
        summaryElem =
            document.getElementById("summary");
        summaryElem.innerHTML = summary;
    }
    </script>

    <!-- ... -->      
</head>
<body>
    <script src =
      "https://www.java.com/js/deployJava.js"></script>
    <script> 
        <!-- ... -->
        deployJava.runApplet(attributes, parameters, '1.6'); 
    </script>          
    <!-- ... -->
    <p id="summary"/>  // this HTML element contains
                             // the summary 
    <!-- ... -->
</body>

接下来,考虑一个名为DataSummaryApplet的 Servlets 类。 DataSummaryApplet类执行以下操作。

  • 调用JSObjectsetMember方法将userName变量设置为“ John Doe”。

  • 检索年龄,地址和电话 Numbers,并构建一个包含此数据摘要的字符串。

  • 调用writeSummary JavaScript 函数将摘要写回到网页。

该小应用程序首先需要检索对JSObject的引用,如下所示:

...
JSObject window = JSObject.getWindow(this);
...

将前面的语句放在 try ... catch ..块中以处理netscape.javascript.JSException

现在,Servlets 已经引用了JSObject,它可以通过使用JSObjectevalcall方法来调用相关的 JavaScript 函数。

package javatojs;

import java.applet.Applet;
import netscape.javascript.*; // add plugin.jar to classpath during compilation

public class DataSummaryApplet extends Applet {
    public void start() {
        try {
            JSObject window = JSObject.getWindow(this);

            String userName = "John Doe";

            // set JavaScript variable
            window.setMember("userName", userName);

            // invoke JavaScript function
            Number age = (Number) window.eval("getAge()");

            // get a JavaScript object and retrieve its contents
            JSObject address = (JSObject) window.eval("new address();");
            String addressStr = (String) address.getMember("street") + ", " +
                    (String) address.getMember("city") + ", " +
                    (String) address.getMember("state");

            // get an array from JavaScript and retrieve its contents
            JSObject phoneNums = (JSObject) window.eval("getPhoneNums()");
            String phoneNumStr = (String) phoneNums.getSlot(0) + ", " +
                    (String) phoneNums.getSlot(1);

            // dynamically change HTML in page; write data summary
            String summary = userName + " : " + age + " : " +
                    addressStr + " : " + phoneNumStr;
            window.call("writeSummary", new Object[] {summary})   ;
        } catch (JSException jse) {
            jse.printStackTrace();
        }
    }
}

要编译引用了netscape.javascript包中的类的 Java 代码,请在 Classpath 中包含<your JDK path>/jre/lib/plugin.jar。在运行时,Java 插件软件会自动将这些类提供给 applet。

数据摘要 Servlets 在网页上显示以下结果:

Result of applet's Java calls to JavaScript on this page
                
John Doe : 25 : 1 Example Lane, Santa Clara, CA : 408-555-0100, 408-555-0102

在浏览器中打开AppletPage.html以查看“数据摘要”Servlets。

Note:

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

Note:

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

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