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对象都有的。

时间: 2025-01-01 12:26:01

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

我的eclipse EE不能运行java文件

问题描述 我的eclipse EE不能运行java文件 我的eclipse EE配置了tomcat,能运行jsp文件,但是就不能运行java文件,这是为什么?是哪里需要重新配置一下的吗?还是就只能运行一种啊? 解决方案 后来发现,原来要保存一下的,再运行的,不然就不行..主要以前不用保存就能运行,所以有点问题 解决方案二: 运行Java文件本质是运行某个含有main方法的类,只要某个类中有main方法,你直接右键run as Java application就可以了啊.如果是Javaee项目能选

JavaScript EE,第3部分:结合使用Java Scripting API和JSP

能够在服务器和客户端上运行同一段JavaScript代码有明显的优势:它使您能够对Ajax和非Ajax客户端使用同一个代码库,并且还能提供更多的灵活性.例如,如果您开发了一些不想让其他人查看的JavaScript代码,那么可以在服务器上运行它,这样可以保护您的知识产权并最小化安全风险.如果以后您不再注重代码保护,则可以将JavaScript代码移动到客户端,以提高应用程序性能. 页面上下文和脚本上下文 Java Scripting API和JavaServer Pages 是两个相互独立并且可以

网站开发-java写的网页,服务器端运行的是什么运行程序

问题描述 java写的网页,服务器端运行的是什么运行程序 php写的网页,服务器端运行的是什么运行程序 服务器端肯定要装jre或者装php,那服务器程序是什么 解决方案 通过访问Tomcat服务器跳转到你想要的界面,例如你的工程为"BookStore",那么你访问的应该是"http://localhost:8080/BookStore".

浅谈Sublime Text 3运行JavaScript控制台_javascript技巧

Node.js是一个基于Chrome JavaScript运行时建立的平台,小巧方便搭建.运行的端口可以在浏览器上运行,显示效果,但每次用浏览器也挺麻烦,我们这里讲的是在sublime text2中配置,是的js在sublimetext2中运行,再也不用切换到浏览器了. 1.首先安装node.js,直接去官网下载,然后安装,点击下一步就好了,如果需要更改安装路径,选择好安装路径即可.安装完以后,运行  node -v 如果显示出版本号,则说明安装成功. 2.这时候,我们还是不可以运行js文件的,

JavaScript获取当前运行脚本文件所在目录的方法_javascript技巧

本文实例讲述了JavaScript获取当前运行脚本文件所在目录的方法.分享给大家供大家参考,具体如下: DirectoryUtility = { // function getCurrentDirectory: returns currentDirectory path // with a trailing backslash. getCurrentDirectory : function ( ) { var scriptFullName = WScript.ScriptFullName; va

《JavaScript应用程序设计》一一第1章 JavaScript的革命时代

第1章 JavaScript的革命时代 JavaScript恐怕是现今世界上最为流行的程序语言,虽然它曾经被人们视为"玩具语言",但现在它已经成为历史上应用最广的程序语言.只要你拥有计算机或智能手机,基本上就可以运行JavaScript程序并创建自己的程序.构建JavaScript程序所需的配置也很简单,你需要的仅仅是一个浏览器与一个文本编辑器. JavaScript.HTML.CSS现在已经变得非常流行,许多操作系统已经开始使用这些开放的Web 技术来构建原生应用的表现层,包括Win

《JavaScript核心概念及实践》——1.3 JavaScript应用范围

1.3 JavaScript应用范围 当JavaScript第一次出现的时候,是为了给页面带来更多的动态,使用户可以与页面进行交互.虽然JavaScript在Web客户端取得了很大的成功,但是ECMA标准并没有局限其应用范围.事实上,现在的JavaScript大多运行于客户端,但是仍有部分运行于服务器端,如Servlet.ASP等.当然,JavaScript作为一个独立的语言,同样可以运行在其他的应用程序中,比如Java版的JavaScript引擎Rhino.C语言版的SpiderMonkey等

《JavaScript核心概念及实践》——1.2 JavaScript语言特性

1.2 JavaScript语言特性 JavaScript是一门动态的.弱类型.基于原型的脚本语言.在JavaScript中"一切皆对象",在这一方面,它比其他的面向对象的语言来得更为彻底.即使作为代码本身载体的函数(function),也是对象,数据与代码的界限在JavaScript中已经相当模糊.虽然它被广泛应用在Web客户端,但是其应用范围远远未局限于此.下面就这几个特点分别介绍. 1.2.1 动态性动态性是指,在一个JavaScript对象中,要为一个属性赋值,我们不必事先创建

asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 javascript代码放到独立的js文件中,其他页面通过引入该js文件来使用相应的 javascript代码.用如下方法引用JS文件:<script src="script/admin.js" type="text/javascript"></scr