Interfejs ScriptContext i zasięg Bindings
Interfejs ScriptContext
zawiera domyślną instancję Bindings
. Pary <klucz, wartość> dodane do tej instancji maja zasięg silnika (ScriptContext.ENGINE_SCOPE
).
Gdy do kontekstu używając metody ctx.setBindings(Bindings)
dodamy nowe SimpleBindings
oznaczamy je jako ScriptContext.GLOBAL_SCOPE
wówczas dodawane pary <klucz, wartość> są widoczne w zasięgu globalnym.
Jeśli mamy klucze w obu zasięgach i wyszukamy atrybut nie podając zasięgu otrzymamy atrybut o zasięgu silnika. Jeżeli wyszukamy podając zasięg silnika otrzymamy tę samą wartość. Wartość globalną otrzymamy, gdy wyszukując klucz, podamy, że interesuje nas zasięg globalny.
O zasięgach będziemy jeszcze mówić.
Wartość zmiennej ScriptContext.ENGINE_SCOPE
wynosi 100. Wartość zmiennej ScriptEngine.GLOBAL_SCOPE
wynosi 200. Zmienna o niższej wartości jest wyszukiwana jako pierwsza.
Klasa E06_ScriptContextAndScopes
package jsr223groovy; import javax.script.*; import java.util.List; public class E06_ScriptContextAndScopes { public static void main(String[] args) { //ScriptContext ctx = new SimpleScripContext(); SimpleScriptContext ctx = new SimpleScriptContext(); ctx.setAttribute("a", 125, ScriptContext.ENGINE_SCOPE); Bindings gBindings = new SimpleBindings(); ctx.setBindings(gBindings, ScriptContext.GLOBAL_SCOPE); ctx.setAttribute("a", 126, ScriptContext.GLOBAL_SCOPE); System.out.println(ctx.getAttribute("a")); System.out.println(ctx.getAttribute("a", ScriptContext.ENGINE_SCOPE)); System.out.println(ctx.getAttribute("a", ScriptContext.GLOBAL_SCOPE)); System.out.println(ctx.getAttributesScope("a")); List<Integer> scopes = ctx.getScopes(); System.out.println(scopes); } }
Klasa module-info.java
module jsr223groovy { requires org.apache.groovy; requires java.scripting; requires java.sql; }
Gdy uruchomimy klasę na konsoli zobaczymy:
125 125 126 100 [100, 200]