JavaFX z Arią - powrót do strony głównej

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;
}