3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptから呼び出したJavaアプレットを確認するのにJava Consoleが使えました

Last updated at Posted at 2015-07-29

JavaScriptからJavaアプレットを呼び出すコードの動作確認で、呼び出し先のJavaアプレットがどこまで処理されているのか確認するため、Java Consoleが使えました。

Java Consoleを使うまでは、Javaアプレット中のオブジェクトがundefinedになってしまう原因がまったくわからず困っていたのですが、Java ConsoleにはJavaアプレットのSystem.out.println()の出力結果が表示されたり、JVMでどういうエラーが発生しているのか表示されたりするので助かりました。

ちなみに私のコーディングミスは、archive属性の指定方法にありました。ブラウザだけではarchive属性に指定したJARファイルが無かったとしても、エラー表示されないようです。エラー内容はJava Consoleを見てはじめて判りました。

Java Consoleを有効にする

WindowsであればコントロールパネルのJavaから設定すると思いますが、例えばCentOSでは以下のようにしました。

ControlPanelを起動する
$ cd $JAVA_HOME/jre/bin
$ ./ControlPanel

詳細タブ の Javaコンソール でコンソールを表示する、を選択しておく。これでJavaアプレットを実行するとそのタイミングでJava Consoleウィンドウが自動で表示されます。

トレースレベルを 5 (詳細)にしておくとJVMが何をしているのか詳細が表示されます。

以下、最終的に動作確認できたコードを挙げておきます。

サンプルコード

環境

  • CentOS 6(サーバ/クライアント)
  • Apache 2.2.15
  • ブラウザ Chromium 31.0/Firefox 35.0.1(Javaアプレットを有効にしています)
  • Java SE 1.8.0_25

ファイル構造

public_html
├── applet
│   ├── VMInfo.jar
│   ├── VMInfo.java
│   ├── VMInfo.mf
│   └── make_jar.sh
├── js
│   └── main.js
└── main.html

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <APPLET name="VMInfoApplet" CODE="VMInfo" ARCHIVE="applet/VMInfo.jar" HEIGHT="120" WIDTH="400" mayscript="true">
        <param name="port" value="10000">
        このブラウザではアプレットがサポートされていません。
    </applet>
    <script src="js/main.js"></script>
</body>
</html>

main.js

var VMInfo = {
    notify : function(info){
        console.log(info);
        var version = info.version || "";
        var vendor = info.vendor || "";
        window.alert([version, vendor]);
    }
};

VMInfo.java(Javaアプレット)

import java.applet.Applet;
import java.awt.TextField;
import netscape.javascript.JSObject;

public class VMInfo extends java.applet.Applet {
    public String jreVersion = "";
    public String jreVendor = "";

    private TextField versionField;
    private TextField vendorField;

    public String getJreVersion() {
    return this.jreVersion;
    }

    public void init() {
        System.out.println("port is " + this.getParameter("port"));

        this.jreVersion = System.getProperty("java.version");
        this.jreVendor = System.getProperty("java.vendor");

        this.versionField = new TextField(jreVersion, jreVersion.length());
        this.vendorField = new TextField(jreVendor, jreVendor.length());
        
        add(versionField);
        add(vendorField);

        // callback
        JSObject win = JSObject.getWindow(this);
        String jsContext = "VMInfo.notify({\"version\":\"" + jreVersion + "\", \"vendor\":\"" + jreVendor + "\"})";
        win.eval(jsContext);
    }
}

make_jar.sh

# !/bin/sh
javac -d . VMInfo.java
jar -cvfm VMInfo.jar VMInfo.mf VMInfo.class

参考

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?