Javaアプレット Tips

JavaScriptからのJavaアプレット呼び出し

環境

  1. Java Runtime Environmentがインストールされていること
  2. LiveConnect対応のブラウザがインストールされていること (今回はInternet Explorer 6.0 SP1で検証しました。)

JavaScript記述のポイント

  1. HTMLのBODY部にAPPLETタグを定義します。 このときMAYSCRIPT属性を定義すると、Javaアプレットがページ上の JavaScript にアクセスできるようになります。
  2. JavaScriptからJavaアプレットを呼び出す時は、document.APPLETタグのNAME.アプレットのメソッド名(引数) です。 戻り値を受け取ることもできます。

    サンプル

    <HTML>
    <head><title>Java Applet サンプル</title>
    </head>
    
    <script type="text/javascript">
    <!--
    function getNum(){
      var ret = document.SampleNum.getNum(document.formnum.num.value);
      document.formnum.num.value = ret;
    }
    // -->
    </script>
    
    <BODY>
    <form method="POST" name="formnum">
    
    <input type="text" name="num" value="1"></input>
    <input type="button" value="Applet呼び出し" onClick="javascript:getNum()"></input>
    
    <applet name="SampleNum" code="SampleNum.class" height="0" width="0" MAYSCRIPT>
    </applet>
    
    </form>
    </BODY>
    </HTML>
    
    

Javaアプレット記述のポイント

  1. クラスにjava.applet.Appletを継承します。

    サンプル

    import java.applet.Applet;
    
    public class SampleNum extends Applet {
            public int getNum(int i) {
                    int ret = i + 1;
                    return ret;
            }
    }
    
    

制限事項

引数・戻り値

  1. JavaScriptからJavaアプレットに対し、数値型や文字列型の引渡しは可能ですが 配列の引渡しができません。
  2. JavaScriptからJavaアプレットに対しObject型を引き渡すことは可能です。 Javaアプレット側は、netscape.javascript.JSObjectとして受け取ります。 ただし、Javaアプレット側からJavaScript Object Notation(JSON)をそのまま返却することができません。 (中身が空のObjectが返却されます。) Mapなどに変換すると値を戻すことは可能です。

セキュリティ

  1. Javaアプレットから、許可のないアクセス権を実行しようとすると java.security.AccessControlExceptionが発生します。

    JREのセキュリティファイル(java.policy、[JREインストール先]\lib\security\に格納されています。) に、アクセス権を記述することでセキュリティエラーを回避できます。 以下の記述は、全てのアクセス権を付与します。

      
    grant{
            permission java.security.AllPermission;
    };
    
    

JavaアプレットでReflexを使用する

サンプルダウンロード samplestr.zip

サンプルの動き

  1. JavaScriptのJSONオブジェクトを文字列に変換し、Javaアプレットに引き渡します。
  2. Javaアプレットは、受け取ったJSON文字列をReflexでオブジェクトに変換し、再度オブジェクトをJSON文字列に変換してJavaScriptに返却します。
  3. JavaScriptは、Javaアプレットから受け取ったJSON文字列をポップアップ表示します。

Reflexを使用すると

  1. Reflexを使用することで、JavaScriptとJavaアプレット間で構造化されたオブジェクト(JSON)をString型として受け取り・引渡しすることができます。
  2. セキュリティ上の制約があるため、JREのセキュリティファイルに設定が必要です。

必要なライブラリ

  1. reflexcore-0.7-SNAPSHOT.jar
  2. xstream-1.1.2.jar
  3. xpp3-1.1.3.4-RC8.jar

JavaScriptサンプル

  1. HTML、JavaScript
    <HTML>
    <head><title>Java Applet サンプル</title>
    </head>
    
    <script type="text/javascript" src="furniture.js"></script>
    <script type="text/javascript" src="json.js"></script>
    <script type="text/javascript">
    <!--
    var tables = new Array("dining", "living");
    
    function init() {
        setTables(tables);
    }
    
    function setTables(tables) {
        for (var i = 0, len = tables.length; i < len; i++) {
            setTable(tables[i]);
        }
    }
    
    function setTable(name) {
        var e = entity["furniture"];
        var o = e[name];
    
        for (var i = 0, ilen = o.length; i < ilen; i++) {
            for (var j = 0, jlen = o[i].length; j < jlen; j++) {
                var ele;
                var id = name + "_" + i + "_" + j;
                if (ele = document.getElementById(id)) {
                    ele.innerText = o[i][j];
                }
            } 
        }
    }
    
    function getObj(){
        var j = JSON.stringify(entity);
        var ret = document.SampleStr.getString(j);
        
        alert(ret);
        entity = JSON.parse(ret);
        setTables(tables);
    }
    // -->
    </script>
    
    <BODY onload="init();">
    <form method="POST" name="formstr">
    <applet name="SampleStr" code="sample.main.SampleStr.class" archive="jar\samplestr.jar,jar\reflexcore-0.7-SNAPSHOT.jar,jar\xstream-1.1.2.jar,jar\xpp3-1.1.3.4-RC8.jar" height="0" width="0" MAYSCRIPT>
    </applet>
    
    <table>
    <tr>
    <th>goods</th><th>width</th><th>depth</th><th>height</th>
    </tr>
    <tr>
    <td>desk</td>
    <td><input type="text" name="dining_0_0" id="dining_0_0"></input></td>
    <td><input type="text" name="dining_0_1" id="dining_0_1"></input></td>
    <td><input type="text" name="dining_0_2" id="dining_0_2"></input></td>
    </tr>
    <tr>
    <td>chair</td>
    <td><input type="text" name="dining_1_0" id="dining_1_0"></input></td>
    <td><input type="text" name="dining_1_1" id="dining_1_1"></input></td>
    <td><input type="text" name="dining_1_2" id="dining_1_2"></input></td>
    </tr>
    <tr>
    <tr>
    <td>sofa</td>
    <td><input type="text" name="living_0_0" id="living_0_0"></input></td>
    <td><input type="text" name="living_0_1" id="living_0_1"></input></td>
    <td><input type="text" name="living_0_2" id="living_0_2"></input></td>
    </tr>
    <tr>
    <td>Television stand</td>
    <td><input type="text" name="living_1_0" id="living_1_0"></input></td>
    <td><input type="text" name="living_1_1" id="living_1_1"></input></td>
    <td><input type="text" name="living_1_2" id="living_1_2"></input></td>
    </tr>
    <tr>
    <td colspan="3"><input type="button" value="Applet呼び出し" onClick="javascript:getObj()"></input></td>
    </tr>
    </table>
    </form>
    </BODY>
    </HTML>
    
    
  2. JSONオブジェクト (furniture.js)
    var entity = { "furniture" : { "dining" : [
                                       ["120","80","85"],
                                           ["60","70","130"]
                                       ],
                                 "living" : [
                                       ["180","100","60"],
                                           ["110","60","45"]
                                       ]
                          }
    
                 }
                 
    

Javaアプレットサンプル

  1. アプレット
    package sample.main;
    
    import java.applet.Applet;
    import jp.sourceforge.reflex.EntityMapper;
    import jp.sourceforge.reflex.core.RXStream;
    
    public class SampleStr extends Applet {
    
            public String getString(String json) {
                    
                    try {
                            
                            EntityMapper mapper = new RXStream("sample.model");
                            Object fromJSON = mapper.fromJSON(json);        // JSON文字列からオブジェクトに変換
                            String toJSON = mapper.toJSON(fromJSON);        // オブジェクトからJSON文字列に変換
    
                            return toJSON;  // JSON文字列を返却
    
                    } catch (Exception e) {
                            return e.toString();
                    }
            }
    
    }
    
    
  2. model
    package sample.model;
    
    import java.util.List;
    
    public class Furniture {
    
            public List<Dining> dining;
            public List<Living> living;
    
    }
    
    
    package sample.model;
    
    public class Dining {
            
            public final int _$$col = 3;    // 0以上で配列を意味する。今回は要素数3個(width, depth, height)。
            public String _$$text;
    
    }
    
    
    package sample.model;
    
    public class Living {
            
            public final int _$$col = 3;    // 0以上で配列を意味する。今回は要素数3個(width, depth, height)。
            public String _$$text;
    
    }
    
    

java.policy

  1. JavaアプレットでReflexを実行する場合、JREのセキュリティファイルに以下の記述をすることでセキュリティエラーを回避できます。
      
    grant{
            permission java.lang.RuntimePermission "createClassLoader";
            permission java.lang.RuntimePermission "accessDeclaredMembers";
            permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
    };
    
    

サンプル画面イメージ

Javaアプレット Reflexサンプル