Search Results for 'javascript'

1 POSTS

  1. 2008/05/02 Java에서 JavaScript호출하기

Java에서 JavaScript호출하기

Posted 2008/05/02 14:25
출처 : 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'