使用事件处理程序处理初始化状态

在初始化 Servlets 之前,Servlets 无法处理来自网页中 JavaScript 代码的请求。从 applet 代码调用 applet 方法或访问 applet 变量将被阻止,直到 applet 的init()方法完成或该 applet 首先从部署它的网页中调用 JavaScript 代码为止。由于 JavaScript 实现在许多浏览器中都是单线程的,因此在 applet 启动过程中,网页可能似乎被冻结。

从 JDK 7 版本开始,您可以在 applet 加载时检查status变量,以确定 applet 是否准备好处理来自 JavaScript 代码的请求。您还可以注册在 Applet 初始化的各个阶段将自动调用的事件处理程序。要利用此功能,应在java_status_events参数设置为"true"的情况下部署 applet。

在状态和事件处理程序示例中,JavaScript 代码向 applet 注册了onLoad处理程序。当小应用程序已初始化时,Java 插件软件会自动调用onLoad处理程序。 onLoad处理程序调用该 applet 的其他方法以在网页上绘制图形。 DrawingApplet类的init方法休眠两秒钟,以模拟较 Long 的 applet 初始化时间。

以下步骤描述了如何注册事件处理程序和检查 Servlets 的状态。有关可注册事件处理程序的 applet 状态值和 applet 事件的完整列表,请参见Servlets 状态和事件处理程序

  • 创建一个 JavaScript 函数来注册事件处理程序。以下代码段显示了registerAppletStateHandler函数,如果该 applet 尚未加载,该函数将注册onLoad事件处理程序。
<script>
<!-- ... -->
    var READY = 2;
    function registerAppletStateHandler() {
        // register onLoad handler if applet has
        // not loaded yet
        if (drawApplet.status < READY)  {                 
            drawApplet.onLoad = onLoadHandler;
        } else if (drawApplet.status >= READY) {
            // applet has already loaded or there
            // was an error
            document.getElementById("mydiv").innerHTML = 
              "Applet event handler not registered because applet status is: "
               + drawApplet.status;    
        }
    }
    
    function onLoadHandler() {
        // event handler for ready state
        document.getElementById("mydiv").innerHTML =
            "Applet has loaded";
        draw();
    }
<!-- ... -->
</script>
  • body标签的 onload 方法中调用先前创建的registerAppletStateHandler函数。这样可以确保在注册小应用程序的事件处理程序之前,已在网页的文档对象模型(DOM)树中创建了小应用程序的 HTML 标记。
<body onload="registerAppletStateHandler()">
  • 部署java_status_events参数设置为"true"的 Servlets。
<script src=
  "https://www.java.com/js/deployJava.js"></script>
<script>
    // set java_status_events parameter to true 
    var attributes = { id:'drawApplet',
        code:'DrawingApplet.class',
        archive: 'applet_StatusAndCallback.jar',
        width:600, height:400} ;
    var parameters = {java_status_events: 'true', permissions:'sandbox' } ;
    deployJava.runApplet(attributes, parameters, '1.7');
</script>

在浏览器中打开AppletPage.html以查看 applet 事件处理程序的行为。在AppletPageUpdatedDuringLoading.html页中,检查 applet 的status变量以确定是否已加载 applet。根据状态,在加载 Servlets 时会不断更新网页。

Note:

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

Note:

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

下载源代码用于“状态和事件处理程序”示例,以进一步进行实验。