2016-06-28 1 views
0

これで、javax.script.ScriptEngineにconsole.log機能が追加されました。javax.script.ScriptEngineコンソール拡張またはライブラリですか?

public class Console { 
     public void log(String text){ 
      System.out.println("console: " + text); 
     } 
    } 

    private static ScriptEngine getJavaScriptEngine(){ 
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 

    Console console = new Console(); 
    engine.put("console", console); 

    return engine; 
    } 

コンソールとアラートなどは実装の一部ではないため。たくさんの検索の後、私はここで見つけただけで、同じ声明しか出せませんでしたが、この権利を行う図書館がないのだろうかと疑問に思いましたか?

答えて

1

私は同様のソリューションを持っていましたが、オブジェクト/アレイをフォーマットしないことがわかりました。また、複数の引数(例えば、console.log('this is the answer:', 42))を扱うこともありません。

この問題を回避するには、ポリフィルを使用しました。それはすべての機能をサポートしているわけではありませんが、ロギングの目的のために行います。オブジェクトと配列をJSONとしてフォーマットするには、JSONオブジェクトも使用できないように見えました。そのオブジェクトもポリフィルする必要がありました。

は、おそらくこれをきれいに解決策がありますが、このセットアップは私が行くのだ:

  1. ポリフィルJSONオブジェクト、ここで言及したスクリプトを取る:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON#Polyfillを。 Rhinoはおよそwindowを知っているので、代わりにはなりません:

    if (!window.JSON) { 
        window.JSON = { 
        // ... rest of code ... 
        }; 
    } 
    

    によって:src/main/resources/scripts/json.jsの下でそれを保存

    // if (!window.JSON) { 
        // window. 
        JSON = { 
        // ... rest of code ... 
        }; 
    // } 
    

  2. その後、consoleオブジェクトに対して、src/main/resources/scripts/console.jsに以下の内容を置く:

    console = { 
        _format: function(values) { 
        var msg = []; 
        for (var i=0;i<values.length;i++) 
         msg.push(JSON.stringify(values[i])); 
        return msg.join(', '); 
        }, 
        log: function() { 
        log.fine(console._format(arguments)); 
        }, 
        info: function() { 
        log.info(console._format(arguments)); 
        }, 
        warn: function() { 
        log.warning(console._format(arguments)); 
        } 
    }; 
    

    注このconsole実装はlogグローバル変数を使用していること。私の場合、これはJUL Loggerのインスタンスですが、ちょっとした創造性があれば、別のログフレームワーク(SLF4jなど)を使用するように変更できます。最後に、Javaコードですべて一緒にこれを置くために、次のように行うことができます

  3. public class ConsoleTest { 
    
        public static void main(String... args) throws ScriptException, IOException { 
         ScriptEngineManager factory = new ScriptEngineManager(); 
         ScriptEngine engine = factory.getEngineByName("JavaScript"); 
    
         engine.put("log", Logger.getLogger("script")); 
         run(engine, "/scripts/json.js"); 
         run(engine, "/scripts/console.js"); 
    
         engine.eval("console.log('string value');"); 
         engine.eval("console.warn(['array','value']);"); 
         engine.eval("console.info({a:1,b:'two'});"); 
        } 
    
        private void run(ScriptEngine engine, String resourceName) throws ScriptException, IOException { 
         InputStream in = getClass().getResourceAsStream(resourceName); 
         Reader reader = new InputStreamReader(in, Charset.forName("UTF-8")); 
         engine.eval(reader); 
         reader.close(); 
        } 
    
    } 
    
+0

かなり遠くに見える、それを共有するためのおかげで!しかし、私はJVMが新しいバージョン1.9でおそらくここで助けてくれるだろう。 – user3732793

関連する問題