2013-04-03 14 views
5

To może nie być praktyczne, ale mam to jako zadanie. Mam otwarte ServerSocket w java. Teraz chcę przeczytać plik zawierający html i javascript i wypisać wynik javascript do przeglądarki. W ten sposób oceniam javascript po stronie serwera. Dlatego chcę, aby to, co jest w środku, zostało ocenione.Ocena javascript przy użyciu kodu java

Próbowałem to przetestować, zadziałało, ale ma pewne problemy, na przykład drukuje komunikat do System.out. Oraz engine.eval ("print (" Welocme to java worldddd ")"); nie zwraca ciąg tak, że mogę wyjście go do OutputStream gniazda:

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

Ponieważ "print()" drukuje na drukarce? – Joseph

+0

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

Odpowiedz

8

można dostać wyjście skryptu (co jest drukowany z print() w JavaScript) poprzez ustawienie pisarza na 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

i został rozwiązany to w przeszłości poprzez tworzenie funkcji javascript wewnątrz eval() i powołując go uzyskać wynik:

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); 
} 

Należy pamiętać, że nazwa funkcji w invokeFunction (pierwszy argument) powinna być zgodna z zadeklarowaną wcześniej.

Należy pamiętać, że może to być niebezpieczne. Czy masz absolutną kontrolę, skąd pochodzi kod javascript? W przeciwnym razie prosty while(true){} może być dość katastrofalny dla twojego serwera.

Powiązane problemy