출처 : 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 + "'";
}
}
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
Hello from JavaScript
Calling defineScriptFunction...
Calling invokeScriptFunctionFromEngine...
Hello, world!
Hello, world!
Calling invokeScriptFunctionFromJava...
Hello, from java
Hello, from java
Calling invokeJavaFromScriptFunction...
Invoking getHelloReply method from JavaScript...
java returned: Java method getHelloReply says, 'Hello, vJavaScript'
Invoking getHelloReply method from JavaScript...
java returned: Java method getHelloReply says, 'Hello, vJavaScript'
'IT_Programming > Java' 카테고리의 다른 글
[펌] MIDI SOUND 생성하기 ▷ J2SE (0) | 2008.07.23 |
---|---|
Eclipse SWT Event 정리 (0) | 2008.06.27 |
[펌] Java에서 Stored Procedure호출하기 (with Oracle) (0) | 2008.06.21 |
JAVA로 stored Procedure 호출하기 (with mssql 2000) (0) | 2008.05.14 |
[펌] JDOM을 이용한 URL XML 파싱~ 간단한 예제 (0) | 2008.04.05 |