Java上下文是一种抽象概念,它提供了一种机制,可以在Java应用程序中共享信息。它可以被用来存储和传递数据,以及在应用程序之间共享信息。
Java上下文是一个对象,它包含了一组键/值对,这些键/值对可以在应用程序之间共享。这样的话,当你想要在不同的应用程序之间传递数据时,你就可以使用Java上下文来实现这一目的。
Java上下文也可以用来存储和传递特定的信息。例如,如果你想要在不同的应用程序之间传递特定的信息(例如当前时间或者当前位置),你就可以使用Java上下文来存储这些信息并将其传递到不同的应用程序中去。
此外,Java上下文也可以被用来存储和传递特定的配置信息。例如,如果你想要在不同的应用环境中使用相同的配置信息(例如数据库连接字符串或者服务器IP地址),你就可以使用Java上下文来存储这些配置信息并将其传递到不同的应用中去。
总而言之,Java上下文是一个强大而有效的工具,它能够帮助开发人员在不同的应用中共享数据、信息、配置信息或者其他内容。因此,开发人员必须正确理解并控制Java上下文所包含内容所带来的风险才能够有效地使用该工具。
脚本引擎在上下文或环境中执行脚本。
ScriptContext
接口的实例表示脚本的上下文。
SimpleScriptContext
类是 ScriptContext
接口的实现。
脚本上下文由四个组件组成:
以下代码使用SimpleScriptContext类创建ScriptContext。
SimpleScriptContext类的一个实例维护Bindings的两个实例:一个用于引擎范围,一个用于全局范围。
默认情况下,SimpleScriptContext类分别将上下文的输入阅读器,输出写入程序和错误写入程序初始化为 System.in
, System.out
和 System.err
。
ScriptContext接口的getReader(),getWriter()和getErrorWriter()方法分别返回来自ScriptContext的读者,写者和错误写入者的引用。
Setter方法可以设置读写器。
以下代码显示如何获取读写器。它还显示如何设置写入器到FileWriter以将脚本输出写入文件:
import java.io.FileWriter; import java.io.Reader; import java.io.Writer; import javax.script.ScriptContext; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws Exception{ ScriptContext ctx = new SimpleScriptContext(); // Get the reader and writers from the script context Reader inputReader = ctx.getReader(); Writer outputWriter = ctx.getWriter(); Writer errWriter = ctx.getErrorWriter(); // Write all script outputs to an out.txt file Writer fileWriter = new FileWriter("out.txt"); ctx.setWriter(fileWriter); } }
创建 SimpleScriptContext
后,您可以开始在引擎范围绑定中存储键值对。
setAttribute()
方法用于向Bindings添加键值对。
以下代码显示如何添加三个键值对。
import javax.script.ScriptContext; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws Exception{ ScriptContext ctx = new SimpleScriptContext(); ctx.setAttribute("year", 2015, ScriptContext.ENGINE_SCOPE); ctx.setAttribute("month", 9, ScriptContext.ENGINE_SCOPE); ctx.setAttribute("day", 21, ScriptContext.ENGINE_SCOPE); } }
要将键值对添加到全局范围中的绑定,请首先创建和设置绑定。
import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.SimpleBindings; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws Exception { ScriptContext ctx = new SimpleScriptContext(); Bindings globalBindings = new SimpleBindings(); ctx.setBindings(globalBindings, ScriptContext.GLOBAL_SCOPE); ctx.setAttribute("year", 2015, ScriptContext.GLOBAL_SCOPE); ctx.setAttribute("name", "Java", ScriptContext.GLOBAL_SCOPE); } }
import static javax.script.ScriptContext.ENGINE_SCOPE; import static javax.script.ScriptContext.GLOBAL_SCOPE; import java.util.List; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.SimpleBindings; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) { ScriptContext ctx = new SimpleScriptContext(); List<Integer> scopes = ctx.getScopes(); System.out.println("Supported Scopes: " + scopes); ctx.setAttribute("year", 2015, ENGINE_SCOPE); Bindings globalBindings = new SimpleBindings(); ctx.setBindings(globalBindings, GLOBAL_SCOPE); ctx.setAttribute("year", 2014, GLOBAL_SCOPE); ctx.setAttribute("name", "Jack", GLOBAL_SCOPE); String nameValue = (String) ctx.getAttribute("name"); System.out.println("nameValue = " + nameValue); int engineScopeYear = (Integer) ctx.getAttribute("year", ENGINE_SCOPE); int globalScopeYear = (Integer) ctx.getAttribute("year", GLOBAL_SCOPE); System.out.println("engineScopeYear = " + engineScopeYear); System.out.println("globalScopeYear = " + globalScopeYear); } }
上面的代码生成以下结果。
使用由同一ScriptEngineManager创建的引擎的全局和引擎范围绑定。
import static javax.script.ScriptContext.ENGINE_SCOPE; import static javax.script.ScriptContext.GLOBAL_SCOPE; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); manager.put("n1", 1); String script = "var sum = n1 + n2;print(msg + " + "" n1=" + n1 + ", n2=" + n2 + " + "", sum=" + sum);"; engine.put("n2", 2); engine.put("msg", "a string"); engine.eval(script); Bindings bindings = engine.createBindings(); bindings.put("n2", 3); bindings.put("msg", "another string"); engine.eval(script, bindings); ScriptContext ctx = new SimpleScriptContext(); Bindings ctxGlobalBindings = engine.createBindings(); ctx.setBindings(ctxGlobalBindings, GLOBAL_SCOPE); ctx.setAttribute("n1", 4, GLOBAL_SCOPE); ctx.setAttribute("n2", 5, ENGINE_SCOPE); ctx.setAttribute("msg", "ScriptContext:", ENGINE_SCOPE); engine.eval(script, ctx); engine.eval(script); } }
上面的代码生成以下结果。
分别使用getContext()和setContext()方法获取和设置ScriptEngine的默认上下文,如下所示:
import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); ScriptContext defaultCtx = engine.getContext(); // Work with defaultCtx here // Create a new context ScriptContext ctx = new SimpleScriptContext(); // Configure ctx here engine.setContext(ctx); } }
要在新的默认上下文中使用ScriptEngineManager的绑定,请如下所示明确设置:
import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import javax.script.SimpleScriptContext; public class Main { public static void main(String[] args) throws ScriptException { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); ScriptContext defaultCtx = engine.getContext(); // Work with defaultCtx here // Create a new context ScriptContext ctx = new SimpleScriptContext(); // Configure ctx here // Set ctx as the new default context for the engine engine.setContext(ctx); ctx.setBindings(manager.getBindings(), ScriptContext.GLOBAL_SCOPE); engine.setContext(ctx); } }
Java脚本教程 - Java调用Javascript函数以下代码显示了如何从Java调用Javascript函数。首先,它定义了Javascript文件中的四个函...
Java脚本教程 -Java脚本变量脚本语言是松散类型的。变量的类型在编译时是未知的。类型可以在程序执行期间更改。并且基于存储在变...
Java Lambda-Java递归Lambda我们可以在创建递归lambda表达式时使用方法引用。例子以下代码以正常方式创建递归函数,然后使用递归...
Java Lambda-Java静态方法引用lambda表达式表示在函数接口中定义的匿名函数。方法引用使用现有方法创建lambda表达式。方法引用的...
Java IO教程 - Java文件操作文件创建我们可以使用File类的createNewFile()方法创建一个新文件:File dummyFile = new File(test....