2010-08-06 2 views
2

после выяснения вчера, как настроить проект Eclipse, чтобы иметь возможность запускать JS-код (если вам это интересно: Build a JS server inside of Java for Google AppEngine), у меня есть следующий вопрос, связанный с этим тема: У меня есть JS-файл и функция внутри него. Мне нужно запустить эту функцию внутри моего Java-кода и передать в нее переменную (строку Java). Мой файл очень простой, он в настоящее время выглядит следующим образом:Вызовите функцию (Rhino) JS в Java и передайте переменную в

public class Com_feedic_readabilityServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException { 
    resp.setContentType("text/html"); 
    Context cx = ContextFactory.getGlobal().enterContext(); 
    cx.setOptimizationLevel(-1); 
    cx.setLanguageVersion(Context.VERSION_1_5); 
    Global global = Main.getGlobal(); 
    global.init(cx); 
    Main.processSource(cx, "server_js/js_init.js"); 
} 
} 

Что мне нужно сделать сейчас, это вызов функции run() в js_init.js -файла. Как мне это сделать?

+0

Вы используете JDK 6 механизма ScriptEngine? Кроме того, совершенно неясно, с какими функциями вы столкнулись, ну, что угодно. – Pointy

+0

Он просто показывает, как я импортирую файл .js. И я использую импортированный файл jsjar Rhino, это не совсем механизм ScriptEngine (но я думаю, что он основан на нем, к тому же: я понятия не имею). – fb55

+0

Хм ... ну, я прочитал этот пост в блоге, и это казалось непохоже на все, что я когда-либо делал с Носорогом. Я всегда использовал структуру JDK ScriptEngine и встроенную (несколько устаревшую) версию Rhino, и это очень легко использовать. – Pointy

ответ

7

Вам нужно передать значение параметра с помощью привязок объекта, следующим образом:

package rhinodemo; 

    import java.util.Date; 
    import javax.script.*; 

    public class RhinoDemo { 

    public static void main(String[] args) throws Exception { 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine engine = mgr.getEngineByName("JavaScript"); 

     Bindings bindings = engine.createBindings(); 
     bindings.put("currentTime", new Date()); 
     engine.eval(
     "function run(x) { println('x=' + x); }" + 
     "run(currentTime);", bindings); 
    } 
    } 

Если вы хотите, чтобы ваш Java-код для вызова функции Javascript под названием run() затем создать сценарий, который (а) определяет функция run() и (b) вызывает эту функцию, передавая ей параметр. Затем на стороне Java вам нужно создать объект Bindings и установить значение этого параметра bindings.put(currentTime, new Date()).

+0

У меня ошибка «println not defined». Как передать контент, оцененный Rhino, обратно в переменную (помните, я использую JS-сервер)? – fb55

1

попробовать это:

Object jsOut = Context.javaToJS(System.out, scope); 
ScriptableObject.putProperty(scope, "out", jsOut); 

и JS файл out.println(<text>);

Смежные вопросы