2010. 3. 22. 15:02
매우 간만에 정리할만한 짓을 해서 정리중..

일단 url 부터..




일단 그냥 javascript 자체는 jdk 1.6 부터 ScriptManager 로 그냥 실행 시킬 수 있다. 아래같이 걍 쓰면 된다.

import javax.script.*;

ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
engine.eval("print(1+3);");


그런데 문제점은 기존의 코드를 그대로 돌릴 수 없다는 점. 가장 문제는 window 객체도 없고 document 도 없다. 물론, html 영역도 없으므로 기존의 코드가 브라우저의 내장 객체들을 사용하면 그 코드는 돌아가지 않는다.
그런 객체들을 만들어주는 코드가 바로 env.js 이다. 순수 자바스크립트로 이루어져있는 이 코드는 window 객체부터, document 객체는 물론이고, dom 객체들의 innerHTML 같은 속성까지 구현해놓았다.


그럼 ScriptManager 에 env.js 를 넣고 실행한 후 하면 될 것 같다. 하지만 문제는 또 있다. env.js 는 ScriptManager 가 제공하는 자바스크립트 스펙만으로는 동작하지 않는다. env.js 에는 getter, setter 같은 것이 구현되어 있는데, 그건 ECMA-262 Edition 4 부터 지원되는 것 같다. 아무튼 그냥 jdk 1.6 안에 있는 걸루는 안되니 rhino 를 따로 받아서 해야한다.

env.js 나 js-14.jar 나 그냥 url 로 들어가서 받아도 된다.
아무튼 jar 를 자바빌드패스를 설정해서 넣어주고, 다음과 같이 하면 된다.

import org.mozilla.javascript.Context;
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.Scriptable;

ContextFactory factory = ContextFactory.getGlobal();
Context cx = factory.enterContext();
cx.setOptimizationLevel(-1);// without 64kb limit
Scriptable shared = cx.initStandardObjects();
Scriptable scope = cx.newObject(shared);
cx.evaluateReader(scope, new java.io.FileReader("env.rhino.js"), "", 1, null);
String source ="";
source += "var div = document.createElement(\"div\");";
source += "div.innerHTML = \"korea\";";
source += "document.body.appendChild(div);";
source += "document.body.innerHTML;";
Object result = cx.evaluateString(scope, source, "", 1, null);
System.out.println(result);//"<div>korea</div>"


룰루랄라.. 너무 잘된다. 응용이 매우 가능할듯.
Posted by 아즈키