1

DJ Native Swingを使用すると、Javaアプリケーション内にWebページを表示することができます。これを行うと、「コマンド」プロトコルを使用してブラウザからJavaランタイム環境に通信することもできます。ドキュメントには、その使用法を示すコードスニペットがあります。


function sendCommand( command ){
    var s = 'command://' + encodeURIComponent( command );

    for( var i = 1; i < arguments.length; s+= '&' + encodeURIComponent( arguments[i++] ) );
      window.location = s;
}

ここに表示されているように、httpの代わりにコマンドプロトコルを使用したURLへの通常のGETリクエストのようです。作成してイメージ、スクリプトタグ、または単にajax getリクエストを実行しても、応答がなく、Javaランタイムのブレークポイントがトリガーされません。

現在表示しているページから移動したくないので、window.locationを設定したくありません。リンクを使用してコマンドURLに移動することはできますが、現在のページから離れることもできます。このページはOpenLayersとdojoを使用しています。(私も試しましたdojo.io.script

4

1 に答える 1

2

いくつかの作業の後、通信があるたびにページの更新をトリガーしないJavaランタイムと通信するためのきちんとした方法を見つけました。最近のほとんどのブラウザーでクロスドメイン制限を回避するために JSONP が機能する方法に触発されています。iFrame もcommand://URL をトリガーするため、この手法を使用して JSONP のようなアクションを実行できます。クライアント側 (ブラウザ) のコード:


dojo.provide( "nmpo.io.java" );
dojo.require( "dojo.io.script" );

nmpo.io.java = dojo.delegate( dojo.io.script, { 
    attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){
        //  summary:
        //      creates a new  tag pointing to the specified URL and
        //      adds it to the document.
        //  description:
        //      Attaches the script element to the DOM.  Use this method if you
        //      just want to attach a script to the DOM and do not care when or
        //      if it loads.        
        var frame = dojo.create( "iframe", { 
            id: id,
            frameborder:  0,
            framespacing: 0
        }, dojo.body( ) );

        dojo.style( frame, { display: "none" } );
        dojo.attr( frame, { src: url } );
        return frame;
    },

    _makeScriptDeferred: function(/*Object*/args){
        //summary: 
        //      sets up a Deferred object for an IO request.
        var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError);

        var ioArgs = dfd.ioArgs;
        ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++);
        ioArgs.canDelete = false;

        //Special setup for jsonp case
        ioArgs.jsonp = args.callbackParamName || args.jsonp;

        if(ioArgs.jsonp){
            //Add the jsonp parameter.
            ioArgs.query = ioArgs.query || "";
            if(ioArgs.query.length > 0){
                ioArgs.query += "&";
            }
            ioArgs.query += ioArgs.jsonp
                + "="
                + (args.frameDoc ? "parent." : "")
                + "nmpo.io.java.jsonp_" + ioArgs.id + "._jsonpCallback";

            ioArgs.frameDoc = args.frameDoc;

            //Setup the Deferred to have the jsonp callback.
            ioArgs.canDelete = true;
            dfd._jsonpCallback = this._jsonpCallback;
            this["jsonp_" + ioArgs.id] = dfd;
        }
        return dfd; // dojo.Deferred
    }
});

リクエストが Java ランタイムに送信されると、コールバック引数が提供さwebBrowser.executeJavascript( callbackName + "(" + json + ");" );れ、ブラウザでコールバックをトリガーするアクションを実行できます。

使用例クライアント:


dojo.require( "nmpo.io.java" );
nmpo.io.java.get({
    // For some reason the first paramater (the one after the '?') is never in the
    // paramater array in the java runtime. As a work around we stick in a dummy.
    url: "command://sum?_",
    callbackParamName: "callback",
    content: {
        numbers: [ 1, 2, 3, 4, 5 ].join( "," )
    },
    load: function( result ){
        console.log( "A result was returned, the sum was [ " + result.result + " ]" );  
    }   
});

使用例 java:


webBrowser.addWebBrowserListener(new WebBrowserAdapter() {
    @Override
    public void commandReceived(WebBrowserCommandEvent e) {
        // Check if you have the right command here, left out for the example
        // Parse the paramaters into a Hashtable or something, also left out for the example
        int sum = 0;
        for( String number : arguments.get( "numbers" ).split( "," ) ){
            sum += Integer.parseInt( number );
        }

        // Execute the javascript callback like would happen with a regular JSONP call.
        webBrowser.executeJavascript( arguments.get( "callback" ) + "({ result: " + sum + " });" );
    }
});

また、フレーム内の IE では、firebug lite を使用することを強くお勧めします。IE 用の開発ツールは利用できません。

于 2010-11-04T12:58:23.943 に答える