Wykonywanie kodu JavaScript w Javie

Do środy 4 listopada włącznie: ponad 30 tysięcy ebooków i audiobooków ze zniżkami do 95%. Kliknij tutaj.

ausmalbild-nashorn-7Wraz z pojawieniem się Javy 8 został udostępniony nowy silnik JavaScriptowy dla JVM o nazwie Nashorn. Zastąpił on starszą implementację Rhino, dostępnego od Javy 6. JavaScriptowy silnik Rhino został stworzony dawno temu przez firmę Netscape (chyba w 1997 roku), a w późniejszym czasie rozwijany był przez Mozillę. Nashorn to silnik pozwalający uruchamiać kod Javascriptowy po stronie serwera. Daje to duże możliwości, bo w łatwy sposób można udostępnić „język / składnie” jakiejś konfiguracji dla użytkownika, dzięki czemu w trakcie działania aplikacji można modyfikować implementację pewnych zachowań i dodawać nowe. Dzięki wykorzystaniu takiego silnika można np. dać użytkownikowi możliwość oprogramowania jakiegoś fragmentu systemu.
Wykorzystując taki silnik można zaimplementować np. walidację formularzy przechowując ją tylko w jednym miejscu systemu / modelu. Z formularza przekazujemy JSONa, po stronie serwera wykonujemy ten sam kod który był wykonany po stronie przeglądarki.

Bez zbędnego wstępu, przejdę do konkretnych przykładów pokazujących możliwości wywoływania kodu JavaScript z poziomu Javy.

Przykład Hello World:

W wyniku uruchomienia czego, na konsoli pojawi się tekst: „Cześć, tu Notatnik Programisty!”

Interfejs ScriptEngine posiada przeciążoną metodę eval przyjmującą obiekt klasy Reader, dzięki czemu można wywołać kod bezpośrednio z zewnętrznego pliku:

W Javie 7 metoda getEngineByName(„js”) zwróci implementację Rhino. Od wersji ósmej będzie to już silnik Nashorn.

Wywoływanie funkcji:

Przekazywanie parametrów:

Wywoływanie kodu Javy z poziomu JavaScript:

Przykład klasy z publiczną metodą statyczną:

W pliku js wywołujemy ją następująco:

Po wywołaniu engine.eval(scriptReader) z poziomu Javy, na konsoli wyświetli się: „Hello Notatnik Programisty”.

Konwersja typów

Implementacja interfejsów z poziomu JavaScript:

W powyższym kodzie implementowany jest interfejs Runnable, przekazywany do obiektu Thread. Tekst „Metoda run w oddzielnym wątku” zostanie wyświetlony na oucie w nowym wątku.

Przekazywanie obiektów (binding)

Definicja klasy z dostępnymi metodami.

Jedna z nich jest statyczna.

Jednak wywołanie tego kodu spowoduje wyrzucenie wyjątku:

Wywoływanie metod statycznych można wykonać tak:

Przykład najbanalniejszego zastosowania?

Np. chcemy aby w aplikacji użytkownik mógł definiować pewne warunki logiczne, dzięki którym coś się będzie wykonywało, czy wyświetlało. Włącznie z wykorzystaniem operatorów && || i nawiasów grupujących.
Przykład takiego wyrażenia:
„(EDYCJA || USUNIECIE) && !BRAK.DOSTEPU”, które po zastąpieniu zmiennymi logicznymi po stronie serwera zostanie zaktualizowane na „(true||false) && true” i wywołane przez silnik JSowy (jako prosty parser wyrażeń logicznych) zwróci:

Jako ciekawostkę dodam, że gdy chodzi o parsowanie samych wyrażeń logicznych, to np. dedykowana do tego, choć już leciwa biblioteka http://jboolexpr.sourceforge.net/ zadziała w tym przypadku ok. 50 razy szybciej. Jednak nikt nie powiedział, że w tym przypadku zamiast wyrazu EDYCJA nie mogłoby być inne wyrażenie np. $api.editRights(4), co zmienia już postać rzeczy.

Problemem jest wydajność, jednak przy odpowiedniej ilości iteracji kodu Javowy Just In Time (JIT) compiler zacznie działać i wykona sporą optymalizację. Mimo wszystko, Node.js i tak będzie dwa razy szybszy.

nashorn_vs_java_numbers-o

Źródło: http://pieroxy.net/blog/2015/06/29/node_js_vs_java_nashorn.html

To również może Cię zainteresować:

  • Java Spring MVC, recenzja kursu wideo z Videopoint.plJava Spring MVC, recenzja kursu wideo z Videopoint.pl Pół roku temu opisywałem kurs z podstaw frameworka Spring dostępnego w Videopoint.pl, a dziś co nieco o kolejnym z tej serii: Spring Web MVC. Autorem obu ponad 3-godzinnych materiałów jest […]
  • Zarobki w IT w I półroczu 2019 – najnowsze dane No Fluff JobsZarobki w IT w I półroczu 2019 – najnowsze dane No Fluff Jobs W branży IT ciągle zarabia się dużo więcej niż w innych gałęziach gospodarki. Zarobki programistów w pierwszym półroczu 2019 roku w porównaniu z 2018 rokiem wzrosły, choć i tak były już na […]
  • Zagadki algorytmiczne #3 – połowa sumy tablicyZagadki algorytmiczne #3 – połowa sumy tablicy Otrzymujesz listę liczb całkowitych. Twoim zadaniem jest zwrócenie jednego z jej elementów x, który spełnia warunek 2 * x = suma pozostałych elementów. Masz zagwarantowane, że element x […]
  • jQuery Cluetip – opóźnienia żądań ajaxowychjQuery Cluetip – opóźnienia żądań ajaxowych W ostatnim czasie pracowałem nad modułem ewidencji czasu pracy w systemie kadrowo-płacowym. System intranetowy, ograniczona ilość użytkowników. Z tych, a nie innych względów na […]
  • Raspberry PI 2, nauka podstaw Pythona 3Raspberry PI 2, nauka podstaw Pythona 3 W jednym z ostatnich wpisów zebrałem sobie źródła wiedzy do nauki Pythona, a w międzyczasie kupiłem Raspberry PI 2. Jedno z drugim jest mocno powiązane, ponieważ minikomputer standardowo […]
  • Hasła maskowane ciąg dalszyHasła maskowane ciąg dalszy Pod ostatnim artykułem dotyczącym wpadki jednego z polskich banków pojawił się komentarz: Czy autor ma JAKIEKOLWIEK pojecia jak sa implementowane takie maski ? Z technicznego punktu […]

Dodaj komentarz