IT_Programming/Java

[펌] Java에서 JavaScript호출하기

JJun ™ 2008. 6. 21. 08:51

출처 : IBM Developer works 2007/10/16  - 동적인 언어를 동적으로 호출하기,

Part 1 : 자바 스크립팅 API
http://www.ibm.com/developerworks/kr/library/j-javascripting1/index.html?S_TACT=105AGX55&S_CMP=EDU

자세한 설명은 출처를 참고할 것.

모든 DBMS들이 JDBC Interface를 구현하였기 때문에 사용자는 해당 DBMS의 Driver를 로드한 후 JDBC Interface만 보고 일관된 프로그래미을 할 수 있듯이 Java 6.0부터는 스크립팅 패키지를 제공하여 여러가지 동적 스크립트들이 스크립팅 패키지에서 제공하는 인터페이스를 구현하도록 하고 마치 Driver를 Load하듯이 ScriptEngine를 획득하여 그것만 보고 Script들을 호출할 수 있다.

Java는 모든 태스크의 최상의 언어는 아니지만 2006.12월부터 제공하는 스크립팅 패키지를 통해 런타임에 스크립트 언어들의 강력한 장점들을 사용할 수 있게 되었다.

아래는 Java에서 JavaScript언어를 호출하는 예제이다. 자세한 원리는 출처를 통해 알 수 있다.

import javax.script.Invocable;
import 
javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import 
javax.script.ScriptException;


public class 
HelloScriptingWorld {
       
        public static void main(String[] args) throws ScriptException, NoSuchMethodException                                                                                                       
{
                ScriptEngineManager scriptEngineMgr =
new 
ScriptEngineManager();
                ScriptEngine jsEngine = scriptEngineMgr.getEngineByName(
"JavaScript");
               
                if(jsEngine == null
) {
                        System.err.println(
"No script engine found for JavaScript"
);
                        System.exit(
1
);
                }

               
                // Java에서 JavaScript 실행
                System.out.println("Calling invokeHellosSript..."
);
                invokeHelloScript(jsEngine);

               
               
                // Java에서 JavaScript 함수 정의
                System.out.println("\nCalling defineScriptFunction..."
);
                defineScriptFunction(jsEngine);
               
               
                // 이전 메소드에서 정의한 JavaScript 함수 호출
                System.out.println("\nCalling invokeScriptFunctionFromEngine..."
);
                invokeScriptFunctionFromEngine(jsEngine);

               
               
                // Invocable Interface를 사용한 JavaScript 함수 호출
                System.out.println("\nCalling invokeScriptFunctionFromJava..."
);
                invokeScriptFunctionFromJava(jsEngine);

               
               
                // JavaScript에서 Java함수 호출
                System.out.println("\nCalling invokeJavaFromScriptFunction..."
);
                invokeJavaFromScriptFunction(jsEngine);

        }
       
       
        /**
         * Java에서 JavaScript문법을 수행한다.
         * @param jsEngine
         * @throws ScriptException
         */
        private static void invokeHelloScript (ScriptEngine jsEngine) throws 
ScriptException
        {
                jsEngine.eval(
"println('Hello from JavaScript')");
        }
       
       
        /**
         * Java에서 JavaScript함수를 정의한다. 
         * @param engine
         * @throws ScriptException
         */
        private static void defineScriptFunction (ScriptEngine engine) throws 
ScriptException
        {
                // Define a function in the script engine
                engine.eval(
                                "function sayHello(name) {" 
+
                                "    println('Hello, ' + name)" 
+
                                "}"
               
);
        }
       
       
        /**
         * Java에서 정의한 JavaScript함수를 호출한다.
         * @param engine
         * @throws ScriptException
         */
        private static void invokeScriptFunctionFromEngine(ScriptEngine engine) throws 
ScriptException
        {
                engine.eval!(
"sayHello('world!')"
);
        }

       
       
        /**
         * Invocable 인터페이스를 사용하여 Script함수를 호출한다.
         * @param engine
         * @throws ScriptException
         * @throws NoSuchMethodException
         */
        private static void invokeScriptFunctionFromJava (ScriptEngine engine) throws 
ScriptException, NoSuchMethodException
        {
                Invocable invocableEngine = (Invocable)engine;
                invocableEngine.invokeFunction("sayHello", "from java"
);
        }

       
       
        /**
         * JavaScript에서 Java함수를 호출한다.
         * @param engine
         * @throws ScriptException
         */
        private static void invokeJavaFromScriptFunction (ScriptEngine engine) throws 
ScriptException
        {
                engine.put(
"helloScriptingWorld", new 
HelloScriptingWorld());
                engine.eval(

                           "println('Invoking getHelloReply method from JavaScript...');" 
+
                           "var msg = helloScriptingWorld.getHelloReply('vJavaScript');" 
+
                           "println('java returned: ' + msg)" 
             
  );
        }
       
       
        public 
String getHelloReply (String name )
       
{
                return "Java method getHelloReply says, 'Hello, " + name + "'"
;
        }
}


Calling invokeHellosSript...
Hello from JavaScript
Calling defineScriptFunction...
Calling invokeScriptFunctionFromEngine...
Hello, world!
Calling invokeScriptFunctionFromJava...
Hello, from java
Calling invokeJavaFromScriptFunction...
Invoking getHelloReply method from JavaScript...
java returned: Java method getHelloReply says, 'Hello, vJavaScript'