Zasięgi – scopes
Domyślne Bindings
znajdują się w:
ScriptEngineManager
= SEM
ScriptEngine
= SE
ScriptContext
= SC
Dodajemy tę sama parę ‘klucz-wartość’ do różnych poziomów.
Pary dodawane do SEM mają zasięg globalny. Jeżeli dodamy nowe SimpleBindings
to para do nich dodana jest widzialna jako globalna. Jeżeli korzystamy z kilku silników może to doprowadzić do tego, że różne SE należące do danego SEM będą widziały różne pary jako globalne. Należy używać tylko albo domyślnych Bindings
albo tych nowo dodanych.
Domyślne Bindings
w SE mają zasięg silnikowy.
Możemy dodać nowe SimpleBindings
w zasięgu globalnym. Wyszukiwanie bez podania zasięgu zawsze pokaże parę o zasięgu silnikowym.
Domyślny SC ma domyślne Bindings
o zasięgu silnikowym. Możemy dodać nowe o zasięgu globalnym. Wyszukiwanie bez podania zasięgu wyszuka parę o zasięgu silnikowym.
Domyślne Bindings
SC przesłaniają domyślne Bindings
SE w zasięgu silnikowym.
Dodane SimpleBindings
SC o zasięgu globalnym przesłaniają SimpleBindings
o zasięgu globalnym dodane do SE.
Poeksperymentuj z poniższym kodem, aby dokładniej zbadać zasięgi par.
Przy standardowych potrzebach najlepsza konfiguracja to:
– domyślne SEM Bindings
dla par dostępnych globalnie
– domyślne SC Bindings
dla par o zasięgu silnika.
Jest to o tyle ważne, że SC zawiera również obiekty Reader
i Writer
do pobierania danych z pliku i zapisywania wyników do pliku oraz Writer
pozwalający na zapisywanie błędów do pliku. Cały skrypt jest wykonywany w SC w danym SE.
Klasa E08_Scopes.java
package jsr223groovy; import javax.script.*; import java.util.List; public class E08_Scopes { public static void main(String[] args) { //SEM ScriptEngineManager sem = new ScriptEngineManager(); sem.put("a", 1000); Bindings gBindings1 = new SimpleBindings(); gBindings1.put("a", 2000); sem.setBindings(gBindings1); //SE ScriptEngine se = sem.getEngineByName("Groovy"); se.put("a", 3000); Bindings gBindings2 = new SimpleBindings(); gBindings2.put("a", 4000); se.setBindings(gBindings2, ScriptContext.GLOBAL_SCOPE); //SC ScriptContext ctx = se.getContext(); ctx.setAttribute("a", 5000, ScriptContext.ENGINE_SCOPE); Bindings gBindings3 = new SimpleBindings(); ctx.setBindings(gBindings3, ScriptContext.GLOBAL_SCOPE); ctx.setAttribute("a", 6000, ScriptContext.GLOBAL_SCOPE); List<Integer> scopes = ctx.getScopes(); System.out.println(scopes); // System.out.println("SEM: " + sem.get("a")); System.out.println("SE: " + se.get("a")); System.out.println("CTX: " + ctx.getAttribute("a")); System.out.println("CTX: " + ctx.getAttribute("a", ScriptContext.ENGINE_SCOPE)); System.out.println("CTX: " + ctx.getAttribute("a", ScriptContext.GLOBAL_SCOPE)); System.out.println("CTX:" + ctx.getAttributesScope("a")); } }
Po uruchomieniu klasy na konsoli zobaczymy:
[100, 200] SEM: 2000 SE: 5000 CTX: 5000 CTX: 5000 CTX: 6000 CTX:100
Klasa module-info.java
module jsr223groovy { requires org.apache.groovy; requires java.scripting; requires java.sql; }