IT_Programming/Java

[펌] Java에서 JavaScript호출하기

JJun ™ 2010. 2. 23. 16:14

-----------------------------------------------------------------------------------

출처: http://cherrykyun.tistory.com/tag/Java%EC%97%90%EC%84%9C%20JavaScript%ED%98%B8%EC%B6%9C

-----------------------------------------------------------------------------------

 

[원본 출처]

: IBM Developer works 2007/10/16 - 동적인 언어를 동적으로 호출하기, Part 1, 2 : 자바 스크립팅 API

http://www.ibm.com/developerworks/kr/library/j-javascripting1/index.html?S_TACT=105AGX55&S_CMP=EDU,
http://www.ibm.com/developerworks/kr/library/j-javascripting2/?S_TACT=105AGX55&S_CMP=EDU

[영문 자료]

http://www.ibm.com/developerworks/library/j-javascripting1/

http://www.ibm.com/developerworks/java/library/j-javascripting2/



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


j-javascripting1.zip

j-javascripting2.zip




모든 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'



j-javascripting2.zip
4.41MB
j-javascripting1.zip
0.11MB

'IT_Programming > Java' 카테고리의 다른 글

JavaDoc 유틸리티  (0) 2010.03.15
Finalize Guardian Idiom  (0) 2010.02.25
XML 문서에 Binary Data를 Insert하는 방법  (0) 2010.02.05
JDOM (The Java DOM)  (0) 2010.02.02
Painting in AWT and Swing - 반복적 repaint() 호출 이슈!  (0) 2010.01.19