2013-04-03 6 views
5

Dies ist vielleicht nicht praktisch, aber ich habe es als eine Aufgabe. Ich habe einen ServerSocket in Java geöffnet. Jetzt möchte ich eine Datei lesen, die HTML und Javascript enthält, und das Javascript-Ergebnis an den Browser ausgeben. So würde ich das Javascript auf der Serverseite bewerten. Also ich möchte was innerhalb ausgewertet wird.Bewertung von Javascript mit einem Java-Code

Ich versuchte dies zu testen, es funktionierte, aber es hat einige Probleme, zum Beispiel druckt es die Nachricht zu System.out. Und engine.eval ("print ('Welocme to java worldddd')"); nicht einen String zurückgeben, so dass ich ausgeben kann es an den Output der Fassung:

import javax.script.*; 
// create a script engine manager 
ScriptEngineManager factory = new ScriptEngineManager(); 
// create a JavaScript engine 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 
try { 
    // evaluate JavaScript code from String 
    engine.eval("print('Welocme to java worldddd')"); 
    //engine.eval("a"); 
} catch (ScriptException ex) { 
    Logger.getLogger(doComms.class.getName()).log(Level.SEVERE, null, ex); 
} 
+5

Weil 'print()' auf einen Drucker druckt? – Joseph

+0

http://www.codeproject.com/Articles/571/Java-to-JavaScript-Communication – AurA

Antwort

8

Sie die Ausgabe des Skripts bekommen (was mit print() in JavaScript gedruckt wird), indem die Schreiber Einstellung auf den ScriptContext:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); 
ScriptContext context = engine.getContext(); 
StringWriter writer = new StringWriter(); 
context.setWriter(writer); 

engine.eval("print('Welocme to java worldddd')"); 

String output = writer.toString(); 

System.out.println("Script output: " + output); 
5

ich habe dies in der Vergangenheit gelöst durch eine Javascript-Funktion innerhalb eval() Erstellen und Aufrufen es ein Ergebnis zu erhalten:

import javax.script.*; 
// create a script engine manager 
ScriptEngineManager factory = new ScriptEngineManager(); 
// create a JavaScript engine 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 
try { 
    // evaluate JavaScript code from String 
    engine.eval("function sum(a,b){ return a + b;}"); 
    System.out.println(((Invocable) engine).invokeFunction("sum", new Object[]{10,20})); 
} catch (ScriptException ex) { 
    Logger.getLogger(doComms.class.getName()).log(Level.SEVERE, null, ex); 
} 

Beachten Sie, dass der Funktionsname in invokeFunction (erstes Argument) mit dem zuvor deklarierten übereinstimmen sollte.

Beachten Sie, dass dies gefährlich sein kann. Haben Sie absolute Kontrolle darüber, woher der JavaScript-Code kommt? Ansonsten könnte eine einfache while(true){} für Ihren Server ziemlich katastrophal sein.

Verwandte Themen