快捷搜索:

JavaScript EE,第1部分:在服务器端运行JavaScript文件

本系列文章环抱的主旨是将JavaScript与办事器上的Java™代码结合起来,从而能够在办事器和客户机上应用相同的JavaScript例程。此外,本系列所展示的这些技巧将让您能为Ajax 客户机和非Ajax 客户机掩护同一个代码库。因为办事器真个大年夜部分代码依然用Java 说话编写,以是有需要对 JavaScript 公开这些 Java Platform, Enterprise Edition (Java EE) 特点。在本系列中,您将懂得若何在办事器端运行JavaScript文件、若何用Ajax调用远程JavaScript函数以及若何借助JavaServer Pages (JSP)技巧应用这个Java Scripting API。

范例的Ajax利用法度榜样在客户端一样平常都应用JavaScript,而在办事器端经常应用别的一种说话,比如 Java。是以,开拓职员必须将此中一些例程实现两次,一次用于在Web 浏览器应用JavaScript,另一次用于在办事器应用别的一种说话。这种双重编码问题实际上可以经由过程将JavaScript 和办事器真个Java代码结合起来加以避免,而对脚本说话的完备支持可以经由过程javax.script API 得到。此外,Java SE Development Kit (JDK) 6 已经包孕了 Mozilla的Rhino JavaScript引擎,这意味着您将无需进行任何设置。

在本系列的第一篇文章中,将应用一个简单的脚本运行法度榜样来在一个Jave EE利用法度榜样内履行 JavaScript文件。这些脚本将能造访被用在JSP 页面内的所谓的“隐式工具”,比如application、session、request和response。本文中的大年夜多半示例均包孕可重用代码,这样一来,您可以在自己的利用法度榜样中轻松地将JavaScript利用于办事器上。

应用javax.script API

本节给出了javax.script API的概览,展示了若何履行脚原先造访Java工具、若何从Java代码调用JavaScript函数,以及若作甚所编译的脚本实现缓存机制。

履行脚本

javax.script API 十分简单。可以先创建一个ScriptEngineManager 实例,有了这个实例就能用下列措施中的任一个来得到ScriptEngine工具(拜见清单 1):

getEngineByName()

getEngineByExtension()

getEngineByMimeType()

清单 1. 得到一个ScriptEngine 实例

import javax.script.*;

...

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

...

engine.eval(...);

此外,还可以经由过程getEngineFactories() 得到可用脚本引擎的列表。今朝,只有JavaScript引擎是与 JDK 6 绑缚的,不过ScriptEngineManager 实现了一种发明机制,能发明支持 JSR-223 Scripting for the Java Platform的第三方引擎(拜见 参考资料)。只需将脚本引擎的JAR文件放入 CLASSPATH 即可。

得到了 javax.script.ScriptEngine 实例后,就可以调用eval()来履行脚本了。也可以将Java工具作为脚本变量导出,其间要将Bindings 实例通报给 eval()措施。清单 2所示的ScriptDemo.java 示例导出两个名为demoVar和strBuf的变量、履行 DemoScript.js脚本,然后让这些变量输出它们改动后的值。

清单 2. ScriptDemo.java 示例

package jsee.demo;

import javax.script.*;

import java.io.*;

public class ScriptDemo {

public static void main(String args[]) throws Exception {

// Get the JavaScript engine

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("JavaScript");

// Set JavaScript variables

Bindings vars = new SimpleBindings();

vars.put("demoVar", "value set in ScriptDemo.java");

vars.put("strBuf", new StringBuffer("string buffer"));

// Run DemoScript.js

Reader scriptReader = new InputStreamReader(

ScriptDemo.class.getResourceAsStream("DemoScript.js"));

try {

engine.eval(scriptReader, vars);

} finally {

scriptReader.close();

}

// Get JavaScript variables

Object demoVar = vars.get("demoVar");

System.out.println("[Java] demoVar: " + demoVar);

System.out.println("  Java object: " + demoVar.getClass().getName());

System.out.println();

Object strBuf = vars.get("strBuf");

System.out.println("[Java] strBuf: " + strBuf);

System.out.println("  Java object: " + strBuf.getClass().getName());

System.out.println();

Object newVar = vars.get("newVar");

System.out.println("[Java] newVar: " + newVar);

System.out.println("  Java object: " + newVar.getClass().getName());

System.out.println();

}

}

DemoScript.js文件(如清单 3所示)包孕一个printType()函数,该函数可用来输出每个脚本变量的类型。这个示例会调用strBuf工具的append()措施、改动 demoVar的值并设置一个名为newVar的新变量脚本。

假如通报给 printType()的工具具有getClass()措施,那么它必然是个Java工具,该工具的类名由obj.getClass().name 得到。这个JavaScript 表达式调用此工具的java.lang.Class 实例的getName()措施。假云云工具不具备 getClass,那么 printType() 就会调用toSource()措施,而该措施是所有JavaScript工具都有的。

您可能还会对下面的文章感兴趣: