Новости

Використовуйте динамічні мови динамічно: Частина 1. Введення в Java scripting API

  1. Серія контенту:
  2. Цей контент є частиною серії: Використовуйте динамічні мови динамічно
  3. API Java-скриптинга
  4. Привіт, скриптова світ
  5. Лістинг 1. Метод main для HelloScriptingWorld
  6. клас ScriptEngineManager
  7. Чому в нашому прикладі JavaScript?
  8. інтерфейс ScriptEngine
  9. Малюнок 1: Взаємозв'язки компонентів Scripting API
  10. Лістинг 2. Метод invokeHelloScript
  11. Лістинг 3. Методи defineScriptFunction і invokeScriptFunctionFromEngine
  12. Лістинг 4. Метод invokeScriptFunctionFromJava
  13. Виклик Java-методів з скриптового коду
  14. Лістінг 5. Методи invokeJavaFromScriptFunction и getHelloReply
  15. Портирування Java-об'єктів
  16. Запуск програми HelloScriptingWorld
  17. Лістинг 6. Висновок з запущеного HelloScriptingWorld
  18. Область видимості виконуваного скрипта
  19. Що далі?
  20. Ресурси для скачування

Використовуйте динамічні мови динамічно

Застосовуйте javax.script API для зміни поведінки виконуваних додатків

Серія контенту:

Цей контент є частиною # з серії # статей: Використовуйте динамічні мови динамічно

https://www.ibm.com/developerworks/ru/views/global/libraryview.jsp?series_title_by=Используйте+динамические+языки+динамично

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Використовуйте динамічні мови динамічно

Слідкуйте за виходом нових статей цієї серії.

Java-розробники знають, що Java не завжди є кращим мовою для вирішення певного роду завдань. Цього року релізи версій 1.0 для JRuby і Groovy посилили інтерес до вбудовування динамічних мов в додатки Java. Groovy, JRuby, Rhino, Jython та інші проекти з відкритим кодом надають можливість писати код на так званих скриптових мовах і запускати його під керуванням JVM (див. ресурси ). До сих пір інтеграція таких мов з Java-кодом, зазвичай, мала на увазі необхідність вивчення для кожного інтерпретатора його унікального API і особливостей реалізації.

Пакет javax.script, доданий в Java SE 6, полегшує процес інтеграції динамічних мов. Він надає однаковий, простий спосіб виклику безлічі скриптових мов при використанні невеликого набору інтерфейсів і реальних класів. Але Java scripting API - це більше, ніж просто полегшення в створенні скриптових фрагментів додатки; пакет підтримки скриптинга дозволяє вам зчитувати і викликати зовнішні скрипти на льоту, що означає можливість динамічної модифікації самих скриптів для зміни поведінки виконуваного додатка.

Ця стаття, перша в серії з двох частин, є введенням в можливості і ключові класи Java scripting API за допомогою програми в стилі "Hello World". Частина 2 представляє більш реалістичний приклад програми, що розкриває додаткові сильні сторони скриптового API. У цьому додатку scripting API задіяний для створення движка з динамічно налаштованим правилами, в якому правила кодуються у вигляді зовнішніх скриптів, написаних на Groovy, JavaScript і Ruby. Правила приймають рішення - чи може здобувач внутрішнього займу претендувати на окремі іпотечні продукти. Втілення таких правил за допомогою Java scripting API дозволяє змінювати самі правила і додавати в процесі виконання нові продукти іпотеки.

API Java-скриптинга

Скриптинг проти динаміки

Термін скриптова зазвичай відноситься до мов, що запускаються в интерпретирующей оболонці без виділення етапу копміляціі. Термін динамічний, як правило, відноситься до мов, які чекають на моменту, коли Виконавча визначить тип змінної або поведінку об'єкта і містить можливості на подобу замикань (closures) і продовжень (continuations). Деяким мов програмування загального призначення підходять обидва терміни. Перевагу терміну скриптова мова тут віддано з тієї причини, що ця стаття сфокусована на Java Scripting API, а не тому що згадуються мов бракує динамічних характеристик.

Пакет підтримки скриптинга був доданий в мову Java в грудні 2006 для забезпечення уніфікованого способу інтеграції скриптових мов в додаток Java. Для розробників мов пакет надає спосіб написання сполучного коду, що дозволяє їхнім мовам викликатися динамічно з Java-додатка. Для Java-розробників пакет пропонує невеликий набір класів і інтерфейсів, які дають можливість скриптів, написаним на будь-якому безлічі мов, бути викликаним через узагальнений API. Пакет скриптинга, таким чином, подібний до пакету Java Database Connectivity (JDBC) - з ним різні мови (як різні бази даних) можуть бути інтегровані в платформу Java за допомогою узгоджувального інтерфейсу.

Раніше динамічний виклик скриптового мови з Java-коду ускладнювався використанням специфічних класів, що поставляються в дистрибутиві кожної мови, або ж використанням Bean Scripting Framework (BSF) від Apache Jakarta. BSF об'єднує невелику кількість скриптових мов під управлінням єдиного API (див. ресурси ). Більше двох дюжин скриптових мов, включаючи AppleScript, Groovy, JavaScript, Jelly, PHP, Python, Ruby і Velocity, можуть бути інтегровані в Java-код при використанні Java SE 6 Scripting API, головним чином базується на BSF.

Scripting API забезпечує двосторонню видимість між Java-додатками і зовнішніми скриптами. Ваш Java-код може не тільки викликати зовнішні скрипти, але також може надати таким скриптів доступ до свого улюбленого Java-об'єктів. Зовнішній скрипт Ruby, наприклад, може викликати методи Java-об'єктів і мати доступ до їх властивостями, що дозволяє скриптам додавати в який виконувався додаток поведінку, не передбачене на момент розробки.

Звернення до зовнішніх скриптів може бути використано для розширення функціональності програми по ходу його виконання, конфігурації, моніторингу або інших оперативних маніпуляцій - таких як зміна бізнес-логіки без необхідності зупиняти додаток. Можливі застосування пакету підтримки скриптинга включають:

  • Написання бізнес-логіки на простішому, ніж Java, мовою, не звертаючись при цьому до розвинених середах виконання.
  • Побудова архітектури на базі модулів (плагінів), що дозволяє користувачам налаштовувати додаток на льоту.
  • Інтегрувати існуючий скрипт в ваше Java-додаток, скажімо, скрипт обробляє або перетворюють текстові файли.
  • Виробляти зовнішню оперативну конфігурацію поведінки програми за допомогою повноцінного мови програмування замість настроечного файлу.
  • Додавати в Java-додаток мова, специфічний для даної предметної області.
  • Застосовувати скриптова мова на етапі прототипирования Java-додатка.
  • Писати на скриптовій мовою тестує код для додатка.

Привіт, скриптова світ

Клас HelloScriptingWorld, який ви можете завантажити поряд з іншим кодом для цієї статті (див. Завантаження ), Демонструє ключові можливості пакета підтримки Java-скриптинга. У ньому використовуються жорстко закодовані фрагменти на JavaScript, взятого в якості прикладу скриптового мови. Що міститься в класі метод main (), показаний в лістингу 1, створює виконує оточення для JavaScript скрипта, а потім викликає п'ять методів (показаних в наступних лістингах), підкреслюють можливості пакета:

Лістинг 1. Метод main для 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 ( "Для JavaScript, не знайдено скриптового движка"); System.exit (1); } System.out.println ( "Викликаємо invokeHelloScript ..."); invokeHelloScript (jsEngine); System.out.println ( "\ nВизиваем defineScriptFunction ..."); defineScriptFunction (jsEngine); System.out.println ( "\ nВизиваем invokeScriptFunctionFromEngine ..."); invokeScriptFunctionFromEngine (jsEngine); System.out.println ( "\ nВизиваем invokeScriptFunctionFromJava ..."); invokeScriptFunctionFromJava (jsEngine); System.out.println ( "\ nВизиваем invokeJavaFromScriptFunction ..."); invokeJavaFromScriptFunction (jsEngine); }

Головне завдання методу main () - отримання примірника javax.script.ScriptEngine (дві перших конструкції в лістингу 1 ). Скриптова движок завантажує та виконує скрипти для деякого конкретного мови. Це найбільш часто використовуваний і затребуваний клас в пакеті Java-скриптинга. Ви витягаєте скриптова движок з javax.script.ScriptEngineManager (перший вираз присвоювання). Типова необхідність - отримання в програмі тільки одного примірника движка, якщо тільки не використовується безліч скриптових мов.

клас ScriptEngineManager

ScriptEngineManager, можливо, єдиний реальний клас в пакеті скриптинга до якого ви будете звертатися регулярно; більшість іншого - інтерфейси. І це, може бути, єдиний клас з пакета скриптинга, екземпляри якого ви будете створювати безпосередньо (або опосередковано - через механізм впровадження залежності (dependency-injection) так, як це робиться в Spring Framework.) ScriptEngineManager може повертати скриптова движок одним з трьох способів :

  • На ім'я движка або мови, як запитується JavaScript в лістингу 1 .
  • З розширення файлу, загальноприйнятій у використанні для скриптів на цій мові, скажімо, .rb для Ruby.
  • За MIME-типу, в разі, коли в скриптовій движку заявлена ​​його підтримка.
Чому в нашому прикладі JavaScript?

У нашому прикладі Hello World ми використовуємо JavaScript почасти тому що його код простий для розуміння, але в більшій мірі - бо середовища виконання для Java 6 в постачанні від Sun Microsystems і BEA Systems комплектуються JavaScript-інтерпретатором на базі реалізації з відкритим кодом Mozilla Rhino. Для JavaScript у вас немає необхідності додавати JAR-файли підтримки скриптового мови в змінну оточення CLASSPATH.

ScriptEngineManager-и знаходять і створюють скріптові движки опосередковано. Тобто при створенні екземплярів ScriptEngine-менеджерів вони звертаються до механізму пошуку сервісу (додано в Java 6) для виявлення всіх зареєстрованих реалізацій javax.script.ScriptEngineFactory в CLASSPATH Ці фабричні класи поставляються в пакетах з реалізаціями Java scripting API; вам, швидше за все, ніколи не доведеться безпосередньо мати справу з цими класами.

Після того, як ScriptEngineManager знайшов все фабричні класи відповідних скриптових движків, він опитує кожну з фабрик щоб з'ясувати: чи можна створити движок необхідного типу - JavaScript для випадку в лістингу 1 . Якщо фабрика відповідає ствердно, менеджер просить фабрику створити движок і він буде повернутий споживачеві. Менеджер повертає null якщо фабрика для цільової мови не знайдено, що передбачено в коді лістингу 1 , З метою надійності перевіряти повертається значення на null.

інтерфейс ScriptEngine

Як я вже згадував, ваш код використовує екземпляр ScriptEngine для виконання скрипта. Скриптова движок діє як посередник між вашим скриптовою кодом і цільовим мовним інтерпретатором або компілятором, який, в кінцевому рахунку, і виконує код. Отже, вам не потрібно знати які класи використовуються кожним інтерпретатором для відпрацювання коду. Наприклад, скриптова движок для JRuby може спочатку передати ваш код в екземпляр класу org.jruby.Ruby для компіляції скрипта в деяку проміжну форму, потім викликати його знову для прогону скрипта і обробки значень, що повертаються. Реалізація скриптовой підтримки приховує деталі, включаючи те, як інтерпретатор погоджує визначення класів, об'єкти додатка і потоки введення / виводу з Java-кодом.

На рис. 1 в загальному вигляді показані взаємозв'язку між вашим додатком, Java scripting API, реалізацією ScriptEngine і інтерпретатором скриптового мови. Ви можете відзначити, що ваш додаток спирається тільки на API скриптинга, що надається класом ScriptEngineManager і інтерфейсом ScriptEngine. Компонент реалізації інтерфейсу ScriptEngine обслуговує всю специфіку використання конкретного мовного інтерпретатора.

Малюнок 1: Взаємозв'язки компонентів Scripting API

Вас, мабуть, зацікавить питання де ж взяти необхідні JAR-файли, імплементує скриптова движок і мовний інтерпретатор. Найкращим місцем для пошуку реалізації движка є, перш за все, проект з відкритим кодом Scripting, підтримуваний java.net (див. ресурси ). Тут ви знайдете реалізації скриптових движків для багатьох мов і посилання на інші ресурси по темі. Проект Scripting також надає посилання для завантаження інтерпретаторів підтримуваних скриптових мов.

В лістингу 1 метод main () передає ScriptEngine в кожен метод для відпрацювання відповідного JavaScript-коду. Перший метод приведений в лістингу 2. Метод invokeHelloScript () викликає на стороні движка метод eval для обчислення і виконання переданої рядки коду на JavaScript. Інтерфейс ScriptEngine визначає шість перевантажених методів eval (), які беруть скрипт до обробки як у вигляді рядка, так і через об'єкт java.io.Reader, широко використовуваний для вичитування скриптів з зовнішніх джерел, таких як файли.

Лістинг 2. Метод invokeHelloScript
private static void invokeHelloScript (ScriptEngine jsEngine) throws ScriptException {jsEngine.eval ( "println ( 'Hello from JavaScript')"); }
Контекст виконання скрипта

Приклад скрипта в додатку HelloScriptingWorld здійснює висновок в консоль використовуючи JavaScript-функцію println (), але у вас є повний контроль над потоками введення і виведення. Скриптові движки надають опцію для зміни контексту виконання скрипта, тобто ви можете перепризначувати потоки, закріплені за standard input, standard output і standard error, а також визначати - які глобальні змінні і об'єкти Java доступні виконуваного скрипту.

JavaScript в методі invokeHelloScript () виводить Hello from JavaScript в потік стандартного виведення (standard output), що є, в даному випадку, консольним вікном. ( лістинг 6 містить остаточний висновок після запуску HelloScriptingWorldApplication.)

Зверніть увагу - цей та інші методи класу декларують, що вони викидають виняток javax.script.ScriptException. Це перевіряється виключення - єдине, певне в пакеті скриптинга - вказує на те, що движок зазнав невдачі при синтаксичному розборі або виконанні коду. Всі методи eval () скриптового движка викидають ScriptException, тому в коді вам необхідно відповідним чином обробити цю ситуацію.

У лістингу 3 показані два пов'язаних методу: defineScriptFunction () і invokeScriptFunctionFromEngine (). Метод defineScriptFunction () також викликає на движку метод eval () з явно заданим фрагментом JavaScript-коду. Однак відзначте - цей метод всього лише задає визначення JavaScript-функції sayHello (). Виконання коду не відбувається. Функція sayHello () приймає один параметр, який потім виводиться в консоль наступним далі викликом println (). JavaScript-інтерпретатор скриптового движка додає цю функцію в свою глобальну оточення, роблячи її доступною в наступних викликах eval, що відбувається (і це не дивно) в методі invokeScriptFunctionFromEngine ().

Лістинг 3. Методи defineScriptFunction і invokeScriptFunctionFromEngine
private static void defineScriptFunction (ScriptEngine engine) throws ScriptException {// Define a function in the script engine engine.eval ( "function sayHello (name) {" + "println ( 'Hello,' + name)" + "}"); } Private static void invokeScriptFunctionFromEngine (ScriptEngine engine) throws ScriptException {engine.eval ( "sayHello ( 'World!')"); }

Ця пара методів демонструє, що скріптові движки можуть зберігати стан компонентів програми та робити це стан доступним протягом наступних викликів методів eval (). Метод invokeScriptFunctionFromEngine () використовує перевагу, надане збереженим станом і викликає JavaScript-функцію, визначену в попередньому виклику eval ().

Отже, багато скріптові движки зберігають стан глобальних змінних і функцій між викликами eval (). Однак, і це важливо враховувати, Java Scripting API не вимагає від двигунів підтримки такої можливості. Скриптові движки JavaScript, Groovy і JRuby, використовувані в цій статті, забезпечують збереження стану між викликами eval ().

Лістинг 4 є варіацією попереднього прикладу. Метод invokeScriptFunctionFromJava () відрізняється тим, що викликає JavaScript-функцію sayHello () не вдаючись до методу eval (), що належить ScriptEngine або до JavaScript-коду. Замість цього він використовує інтерфейс javax.script.Invocable зі складу Java Scripting API для виклику функції, підтримуваної скриптовою движком. Метод invokeScriptFunctionFromJava () призводить об'єкт скриптового движка до багатофункціонального типу Invocable, а потім звертається до багатофункціонального методу invokeFunction () для виклику JavaScript-функції sayHello () з заданим параметром. Якщо викликана функція повертає значення, метод invokeFunction () поверне його, упакувавши в Java-тип Object.

Лістинг 4. Метод invokeScriptFunctionFromJava
private static void invokeScriptFunctionFromJava (ScriptEngine engine) throws ScriptException, NoSuchMethodException {Invocable invocableEngine = (Invocable) engine; invocableEngine.invokeFunction ( "sayHello", "from Java"); }
Високий рівень виклик скриптів з використанням проксі

Якщо скриптова функція або метод реалізують Java-інтерфейс - є більш розвинене використання Invocable. Інтерфейс Invocable визначає метод getInterface (), який приймає як параметр інтерфейс і повертає проксі-об'єкт Java, який реалізує цей наданий раніше інтерфейс. Як тільки ви отримали проксі-об'єкт з скриптового движка, ви можете розглядати його як звичайний Java-об'єкт. Викликані на проксі методи делегуються в скриптова движок для виконання скриптовою мовою.

Відзначте також, що лістинг 4 не містить JavaScript. Інтерфейс Invocable дозволяє Java-коду викликати скриптовими функцію не знаючи мови її реалізації. Метод invokeFunction () викидає java.lang.NoSuchMethodException якщо скриптова движок не зміг знайти функцію з такою назвою або типом параметрів.

Java Scripting API не вимагає від скриптового движка імплементації інтерфейсу Invocable. Насправді, код в лістингу 4 мав би перед приведенням типу задіяти оператор instanceof, щоб переконатися в тому, що движок реалізує інтерфейс Invocable.

Виклик Java-методів з скриптового коду

приклади в лістингу 3 і лістингу 4 показують як Java-код може викликати функції або методи, визначені в скриптовій мовою. Тепер же вас, ймовірно, зацікавить - чи може код скриптового мови, в свою чергу, викликати методи Java-об'єктів. Може. Метод invokeJavaFromScriptFunction () в лістингу 5 показує - як отримати доступ до Java-об'єктів з боку скриптового движка і як скриптова код може викликати методи цих Java-об'єктів. Зокрема, метод invokeJavaFromScriptFunction () використовує наданий движком метод put () для передачі примірника того ж класу HelloScriptingWorld в движок. Після того, як двигун отримав доступ до Java-об'єкту через ім'я, передане при виклику put (), скриптова код викликом методу eval () використовує його.

Лістінг 5. Методи invokeJavaFromScriptFunction и getHelloReply
private static void invokeJavaFromScriptFunction (ScriptEngine engine) throws ScriptException {engine.put ( "helloScriptingWorld", new HelloScriptingWorld ()); engine.eval ( "println ( 'Викликаємо метод getHelloReply з JavaScript ...');" + "var msg = helloScriptingWorld.getHelloReply (vJavaScript ');" + "println (' Отримали з Java: '+ msg)"); } / ** Метод, що викликається з вищенаведеного скрипта і повертає рядок. * / Public String getHelloReply (String name) {return "Java-метод getHelloReply говорить 'Привіт," + name + "'"; }

JavaScript-код, що міститься у виклику методу eval () з лістингу 5 використовує Java-об'єкт HelloScriptingWorld за допомогою доступу до нього через змінну з ім'ям helloScriptingWorld, переданим в виклик методу put () на стороні скриптового движка. Другий рядок JavaScript-коду викликає публічний Java-метод getHelloReply (), також наведений в лістингу 5 . Метод getHelloReply () повертає рядок Java-метод getHelloReply говорить 'Привіт, <параметр>'. Код JavaScript у методі eval () присвоює повертається з Java значення змінної msg, потім виводить це значення в консоль.

Портирування Java-об'єктів

Коли скриптова движок робить Java-об'єкт доступним скрипту, запущеного в виконуючою середовищі, движок повинен упакувати його в об'єктний тип, відповідний поточному скриптова мова. Така упаковка повинна виконувати відповідні перетворення об'єкт-значення, наприклад, допускати використання Java-об'єкта Integer безпосередньо в математичних виразах скриптового мови. З'ясування того, як Java-об'єкти портируют в скріптові об'єкти специфічно для кожного скриптового движка і виходить за рамки обговорюваного в цій статті. І все ж ви повинні усвідомлювати, що така трансляція відбувається, тому ви можете проводити тестування використовуваного скриптового мови, щоб переконатися в передбачуваності виконуваних перетворень.

ScriptEngine.put і пов'язаний з ним метод get () є основними способами розподілу доступу до об'єктів і даними між Java-кодом і виконуваними движком скриптами. (Розширене обговорення цієї теми див. Нижче в Область видимості виконуваного скрипта .) Коли ви викликаєте на движку метод put (), скриптова движок асоціює другий параметр (довільний Java-об'єкт) з заданим строковим ключем. Більшість скриптових движків забезпечують доступність цих Java-об'єктів в скриптах за допомогою заданого імені змінної. Двигуни вільні в поводженні з переданими вами в метод put () іменами. Наприклад, скриптова движок JRuby робить helloScriptingWorld доступною в Ruby-коді у вигляді глобальної змінної $ helloScriptingWorld, що відповідає синтаксису Ruby для глобальних змінних.

Метод get () движка витягує значення, доступні в скриптовій оточенні. У загальному випадку, кожна глобальна змінна і функція з оточення доступні в Java-коді через метод get (). Але для скриптів доступні тільки ті об'єкти Java, які заявлені скриптовими движку безпосередньо - викликом put ().

Така можливість доступу і маніпулювання Java-об'єктами в виконуваному додатку з боку зовнішніх скриптів є потужною технікою розширення функціональності ваших Java-програм. (Ця техніка задіяна в прикладі з частини 2 .)

Запуск програми HelloScriptingWorld

Ви можете запустити додаток HelloScriptingWorld завантаживши та скомпонувавши вихідний код. zip-файл містить компонувальні сценарії як для Ant так і для Maven, щоб полегшити компіляцію і запуск прикладу програми. Виконайте наступні кроки:

  1. скачайте zip-архів.
  2. Створіть новий каталог, скажімо, java-scripting і розпакуйте сюди отриманий на попередньому кроці архів.
  3. Відкрийте командне вікно і перейдіть в цей каталог.
  4. Запустіть ant run-hello.

Ви повинні побачити консольний висновок з Ant, подібний до наведеного в лістингу 6. ​​Зверніть увагу на те, що метод defineScriptFunction () не генерує виведення, тому що він визначає, але не викликає JavaScript-функцію.

Лістинг 6. Висновок з запущеного HelloScriptingWorld
Викликаю invokeHelloScript ... Hello from JavaScript Викликаю defineScriptFunction ... Викликаю invokeScriptFunctionFromEngine ... Hello, World! Викликаю invokeScriptFunctionFromJava ... Hello, from Java Викликаю invokeJavaFromScriptFunction ... Виклик методу getHelloReply з JavaScript ... Отримали з Java: Java-метод getHelloReply говорить 'Привіт, JavaScript'

Сумісність з Java 5

Java Scripting API з'явився в Java SE 6, але ви також можете використовувати його і з Java SE 5. Вам всього лише необхідно надати реалізацію відсутніх класів з пакета javax.script. На щастя, реалізація доступна з Java Specification Request 223 reference implementation (див. ресурси в розділі завантажень). JSR 223 визначає Java scripting API.

Якщо ви завантажте кількість посилань реалізацію JSR 223, розпакуйте архів і помістіть файли script-api.jar, script-js.jar і js.jar в місці, доступному за classpath. Ці файли з комплекту поставки Java SE 6 втілюють скриптова API, інтерфейс скриптового движка JavaScript і сам скриптова движок JavaScript.

Область видимості виконуваного скрипта

За тим, як ви передаєте Java-об'єкти в виконувані движком скрипти, варто більш розвинена реалізація, ніж просто виклик движкових методів get () і put (). Коли ви викликаєте get () або put () на движку, він витягує або зберігає необхідний ключ в спеціально передбаченому екземплярі інтерфейсу javax.script.Bindings. (Інтерфейс Bindings це просто інтерфейс Map, який обслуговує рядкові ключі.)

Коли ваш код викликає моторний метод eval (), на стороні движка використовується зумовлене зв'язування ключів зі значеннями. Однак, ви можете надати свій власний об'єкт Bindings для обслуговування викликів eval (), щоб обмежити видимість змінних і об'єктів для даного скрипта. Тоді виклик буде виглядати як eval (String, Bindings) або eval (Reader, Bindings). Щоб полегшити створення ваших специфічних Bindings, скріптові движки пропонують метод createBindings (), який повертає порожній об'єкт Bindings. Виклик eval на об'єкті Bindings тимчасово приховує Java-об'єкти, збережені раніше з використанням визначеного в движку зв'язування.

Для накопичення історії скриптова движок має в своєму складі два зумовлених механізму зв'язування: зв'язування з областю видимості на рівні движка (engine scope bindings) використовуються при викликах get () і put (), а зв'язування з глобальної областю видимості (global scope bindings) движок може застосовувати для пошуку об'єктів в разі, якщо їх не вдалося виявити на рівні зв'язування "engine scope". Формулювання може - істотна. Скриптові движки не зобов'язані забезпечувати доступність глобального зв'язування для скриптів. Хоча багато скріптові движки такий доступ надають.

Конструктивне призначення "global scope" -связиванія - спільне використання об'єктів різними скриптовими двигунами. Кожен движок, що повертається екземпляром ScriptEngineManager, комплектується одним і тим же об'єктом глобального зв'язування. Ви можете отримати цей об'єкт викликом методу getBindings (ScriptContext.GLOBAL_SCOPE) і призначити об'єкт глобального зв'язування для движка за допомогою setBindings (Bindings, ScriptContext.GLOBAL_SCOPE).

ScriptContext- це інтерфейс, який визначає і управляє контекстом часу виконання скриптового движка. ScriptContext містить зв'язування з "моторної" і "глобальної" областями видимості, а також потоки введення / виводу, що використовуються движком для стандартних операцій введення / виводу. Ви можете отримати контекст скриптового движка і маніпулювати ним за допомогою моторного методу getContext ().

Концепції Scripting API, такі як область видимості scope, зв'язування bindings і контекст можуть, спочатку, збивати з пантелику, через своїх частково перекриваються смислів. Завантажувальний файл з вихідними кодами для цієї статті включає тестовий файл JUnit, який має назву ScriptApiRhinoTest і розташований в каталозі src / test / java. Що міститься там Java-код покликаний допомогти вам розібратися з цими концепціями.

Що далі?

Тепер, коли ви маєте в своєму розпорядженні базовими знаннями по Java Scripting API, Частина 2 цієї статті поліпшить і розширить ці знання за допомогою більш реалістичного прикладу програми. Ця програма використовує комбінацію зовнішніх скриптових файлів, написаних на Groovy, Ruby і JavaScript для завдання бізнес-логіки з можливістю її оперативного зміни. Як ви побачите, визначення бізнес-правил у скриптовій мовою полегшує написання цих правил і, можливо, спрощує сприйняття при читанні непрограмістів, такими як бізнес-аналітики або фахівці з опису предметної області.

Ресурси для скачування

Схожі теми

  • Оригінал статті: " Invoke dynamic languages ​​dynamically, Part 1: Introducing the Java scripting API "(EN)
  • " Використовуйте динамічні мови динамічно, Частина 2 ": У другій публікації цієї серії демонструється як зовнішні скрипти, написані на Ruby, Groovy і JavaScript, можуть виконуватися і модифікуватися на льоту змінюючи бізнес-логіку без зупинки і перезапуску програми. (EN)
  • JSR-223: Scripting for the Java Platform : Ця Java-специфікація визначає Java Scripting API, доданий в Java SE 6. (EN)
  • Java Scripting Programmer's Guide : Документація Sun по JDK 6 включає керівництво програміста по Java Scripting API. (EN)
  • Jakarta Bean Scripting Framework : Проект BSF лежить в основі Java Scripting API. (EN)
  • Mozilla Rhino : Документація та інші ресурси, щоб дізнатися більше про JavaScript-движку, що входить в поставку виконуваної середовища Java, поширюваної Sun Microsystems і BEA Systems. (EN)
  • JRuby : JRuby - створена повністю на Java реалізація мови програмування Ruby. Веб-сайт проекту презентує останні новини та інші ресурси по використанню JRuby. (EN)
  • Java SE 6 : Комплект розробки і виконують середовища, спочатку підтримують Java Scripting API і включають полегшену версію JavaScript-движка Mozilla Rhino. (EN)
  • Scripting project : Проект з відкритим кодом Scripting на java.net надає інтерфейси скриптових движків майже для двох дюжин мов, а також посилання на інші відомі движки Java-скриптинга. Для використання одного з цих скриптових мов, встановіть JAR-файл імплементації скриптового движка, пропонований цим проектом, а також, власне, і JAR-файл самого інтерпретатора скриптової мови. (EN)
  • jsp?StoreId=22&SiteId=JCP&TransactionId=noreg&PartDetailId=sjp-1.0-fr-oth-JPR> Scripting for the Java Platform 1.0 Reference Implementation : Довідкова реалізація JSR-223 пропонує три JAR-файлу, що роблять можливим роботу Java Scripting API на платформі Java SE 5. Скачайте і розпакуйте архів sjp-1_0-fr-ri.zip, розмістіть файли js.jar, script-api.jar і script-js.jar в місці, зареєстрованому в змінної оточення classpath. (EN)
  • технології Java на developerWorks: сотні статей по кожному аспекту Java-програмування.

Підпишіть мене на повідомлення до коментарів

Jsp?
Чому в нашому прикладі JavaScript?
Що далі?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: