【问题标题】:How to call an applet method from JavaScript如何从 JavaScript 调用小程序方法
【发布时间】:2023-03-22 21:46:01
【问题描述】:

我已经创建了一个小程序,我将在一个 Web 项目上从我的 HTML 页面访问一个小程序方法。

我的小程序如下所示:

public class MessageApplet extends Applet {

    private Label m_mess;

    public void init()
    {
        setBackground(Color.lightGray);
        setLayout(new BorderLayout());
        m_mess = new Label("MessageApplet is Running...: No Selection Yet", Label.CENTER);
        add(BorderLayout.CENTER, m_mess);
    }

    public void setMessage(String message)
    {
        m_mess.setText("Selection: " + message);
    }
}

我的 HTML 页面如下所示:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    <SCRIPT LANGUAGE="JavaScript">
        function selectedCity()
        {
            if(document.CityChoice.City[0].checked == true)
            {
                document.SimpleMessageApplet.setMessage(document.CityChoice.City[0].value);
            }
        }
    </SCRIPT>
</HEAD>

<BODY>
    <b>This is the applet</b>
    <APPLET 
        CODE="MessageApplet.class" 
        NAME="SimpleMessageApplet" 
        WIDTH=350
        HEIGHT=100>
    </APPLET>
    <FORM NAME="CityChoice">
        <input type="radio" name="City" value="Boston" onClick="selectedCity()"> Boston<br>
    </form>
</BODY>

</html>

但是当我单击单选按钮时,我的浏览器挂起,我无法访问小程序方法。

我的小程序类位于默认目录中,而 HTML 位于 WebContent 文件夹中。我应该对我的代码进行哪些更改?

【问题讨论】:

  • 是 CityChoice.City[0].value 一个字符串吗?
  • @PerryMonschau 当我在 IE 而不是 Mozilla 上运行它时,它在 java 控制台上显示错误,例如:load: class MessageApplet.class not found。 java.lang.ClassNotFoundException:在 sun.plugin2.applet.Applet2ClassLoader.findClass(未知来源)在 sun.plugin2.applet.Plugin2ClassLoader.loadClass0(未知来源)在 sun.plugin2.applet.Plugin2ClassLoader.loadClass 的 MessageApplet.class(未知来源) ) 在 sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)
  • hmm... 尝试在 MessageApplet.class 前面添加一个“/”。只是在这里在黑暗中刺伤,但是当出现这种奇怪的事情时,我总是首先这样做。
  • @PerryMonschau 不,对不起,我在 MessageApplet.class 前面放了“/”,但还是同样的问题......

标签: java javascript jakarta-ee applet


【解决方案1】:

问题在于if 语句检查:

document.CityChoice.City[0].checked == true

这与 JavaScript 不完全一样,因为你在那里的错误表达式会引发 error 并且它永远不会进入 if 语句体。

我删除了if 语句并将代码更改为如下内容:

function selectedCity()
{
    document.SimpleMessageApplet.setMessage("Hello");
}

当我点击时,我可以看到 Hello 消息。

将您的 HTML 文件内容更改为:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Insert title here</title>
        <SCRIPT LANGUAGE="JavaScript">
            function selectedCity()
            {
                var elem = document.getElementById('cityRb');

                if(elem.checked)
                {
                    document.SimpleMessageApplet.setMessage(elem.value);
                }
            }
        </SCRIPT></HEAD>
    <BODY >
        <b>This is the Applet</b>
    <APPLET CODE="MessageApplet.class" NAME="SimpleMessageApplet" WIDTH=350 HEIGHT=100 >
    </APPLET >
    <FORM NAME="CityChoice">
        <input type="radio" id="cityRb" name="City" value="Boston" onClick="selectedCity()"> Boston<br>
    </form>
</BODY >
</html>

同时添加完整的类代码:

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Label;

/**
 *
 * @author hmmmmm
 */
public class MessageApplet extends Applet {

    private Label m_mess;

    public void init() {
        setBackground(Color.lightGray);
        setLayout(new BorderLayout());
        m_mess = new Label("MessageApplet is Running...: No Selection Yet", Label.CENTER);
        add(BorderLayout.CENTER, m_mess);
        m_mess.setBackground(Color.red);
    }

    public void setMessage(String message) {
        m_mess.setText("Selection: " + message);
    }
}

【讨论】:

  • 我用上面的代码替换了我的代码,但是当我点击复选框并在页面顶部显示错误框时,我的 IE 挂起,当我点击它时,它会打开显示:MessageApplet 的 java 控制台。找不到类。 java.lang.ClassNotFoundException:在 sun.plugin2.applet.Applet2ClassLoader.findClass(未知来源)在 sun.plugin2.applet.Plugin2ClassLoader.loadClass0(未知来源)在 sun.plugin2.applet.Plugin2ClassLoader.loadClass 的 MessageApplet.class(未知来源) ) 在 sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source)
  • 这是另一个问题。如果applet 类包含在一个包中,那么还要在applet 类名之前添加包mypackage.MessageApplet.class。我建议现在将类移动到默认包中,编译它并将 html 文件放在同一目录中。
  • 现在我创建了一个包“myPackage”,在该包下放置了 MessageApplet.java 和 index.html,但是当我运行时,它显示 404 错误:请求的资源 (/SignAppletTest/) 不可用。
  • 请使用我发给你的html和Java类。创建一个项目并将两个文件放在项目的 src 目录中。在浏览器中打开 bin/index.html。他们工作正常。您的 src 和 bin 目录可能有不同的名称。不知道你用的是什么IDE或者你的项目设置
  • 谢谢,它可以工作,但我想在服务器端运行它,因此我创建了一个包含 Java 类和 html 的 jar 文件,你在同一个地方发送了这些文件,我想从我的索引重定向到那个 html .html 文件,但在运行时找不到。我将此 jar 文件放在项目类路径中。我该怎么做?
【解决方案2】:

您遇到的问题是在不同的浏览器上,它们对过时的 LiveConnect (JavaScript Java) 技术有不同的实现。

根据经验,Firefox 在尝试执行此类操作时会更加合作。

您的问题是您试图以一种非常古老的方式将您的小程序包含在页面上。尽管它可能并且将在某些浏览器上运行,但不推荐将小程序包含到页面中。

Java Web start 是技术堆栈,JNLP 是您可以用来以标准化方式分发 Java 内容的协议,您可以在本文中阅读:

Java Web start

部署 JNLP 描述符是将小程序嵌入页面的正确方法。此外,使用 Sun 的 deployJava.js 脚本也是一个好主意,它可以在将您的小程序部署到页面上的容器时为您省去很多麻烦(虽然它有点受限制,所以请随意添加内容)。

Java™ Rich Internet Applications Deployment Advice

总而言之,JNLP/Java web start 驱动的小程序是要走的路。以下是部署描述符的示例。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <jnlp codebase="file:/C:/JavaApplication6/dist/" href="launch.jnlp" spec="1.0+">
        <information>
            <title>JavaApplication6</title>
            <description>blalbla</description>
            <description kind="short">JavaApplication6</description>

        </information>
    <update check="background"/>
    <security>
    <all-permissions/>
    </security>
        <resources>
    <j2se java-vm-args="-Djava.security.policy=applet.policy" version="1.5+"/>
    <jar href="JavaApplication6.jar" main="true"/>


        <jar href="lib/jna.jar"/>
    <jar href="lib/platform.jar"/>
    </resources>
        <applet-desc height="300" main-class="winToJnaApi.NewApplet" name="JavaApplication6" width="300">

        </applet-desc>
    </jnlp>

【讨论】:

  • @baba 我从上面的链接中了解了 JNLP,但我很困惑如何使用它?你能给我一个简单的“Hello World”程序,里面有 JNLP 文件,我会理解的
  • @DaTroop np。很高兴我能帮助你。 @Balasaheb 网上有很多例子,但我会看看我能做什么。 :)
  • @baba 是的,它使用 JNLP 在我的本地机器上运行,但是当我尝试在 tomcat 服务器上运行它时,我的 java 控制台显示如下错误:异常:JNLP 文件错误:sign-applet.jnlp。请确保该文件存在并检查 JNLP 文件中的“codebase”和“href”是否正确.. java.io.FileNotFoundException: JNLP 文件错误:sign-applet.jnlp。在 sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source) at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
  • 您必须确保如果您使用签名库(jar),例如一些加密库(bouncycastle),您的所有库都由相同的授权机构签名。如果您有两个由不同实体签名的 jar,则必须提取它们的内容,编译它们并使用您自己的证书对其进行签名,或者只获取未签名的 jar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2011-04-05
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多