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

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

页面上下文和脚本上下文

Java Scripting API和JavaServer Pages 是两个相互独立并且可以轻松集成的Java 技术。它们都可以在定义良好的上下文中执行代码。使用JSP技术,您可以访问一组JSP隐式对象:pageContext、page、request、response、out、session、config和application。在第1 部分中,您已经了解了如何将这些对象导入servlet 可以执行的JavaScript文件。在本文中,您将了解如何对JSP页面可以执行的代码应用这些操作。

JavaScript引擎使用不同类型的上下文维护应用程序代码中定义的脚本变量和函数。如果您运行设置变量或包含函数的脚本,以及在同一个上下文中执行的后续脚本,那么可以使用前一个脚本的变量和函数。因此,在处理HTTP请求时,应该使用单个脚本上下文,如下一节中所示。

使用JavaScript 语言编写的脚本可以访问公共字段并调用任何Java对象。此外,您可以使用object.property 语法(而不是使用get和set方法)获取和修改JavaBean属性的值。因为在JavaScript代码中使用Java对象很容易,唯一缺失的是一组在JSP页面上下文和JavaScript上下文之间交换对象的定制标记。从本文中可以看到,只需几行代码就可以实现它们。

在Web页面中使用服务器端JavaScript代码

本节展示如何在整个 Ajax/HTTP 请求中管理 JavaScript上下文,以及如何在JSP页面上下文和JavaScript上下文之间交换变量。

在JavaScript 中使用JSP对象

本系列的第 1 部分展示了基于 Java Scripting API的Java servlet,Java Scripting API 可以用来在服务器上执行JavaScript 文件。本节描述一个名为JSUtil的类,该类在执行JSP页面时使用相同的Java Scripting API 运行JavaScript代码片段。首先,您需要创建一个 ScriptEngineManager对象,然后获取 ScriptEngine 实例,如清单 1 中所示。

清单 1. JSUtil的getScriptEngine()方法

package jsee.util;

import javax.script.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.io.*;

public class JSUtil {
  private static ScriptEngine engine;

  public static synchronized ScriptEngine getScriptEngine() {
    if (engine == null) {
      ScriptEngineManager manager = new ScriptEngineManager();
      engine = manager.getEngineByName("JavaScript");
    }
    return engine;
  }
  ...
}

清单 2 包含 createScriptContext()方法,该方法初始化 ScriptContext 实例,从页面上下文获取 JSP 隐式对象并作为脚本上下文的变量设置这些对象。该操作允许通过在脚本上下文中执行的JavaScript代码访问隐式对象:

pageContext对象是用于页面范围变量的存储库,它包含获取所有其他隐式对象的方法。

page对象是处理当前请求的servlet类实例。

request对象允许您获取 HTTP 请求参数和请求头。

response对象允许您设置 HTTP 响应头并提供一个写入程序,该程序使用JSP代码中的out 标识。

out对象用于 JSP页面的输出。

session对象维护请求之间与用户相关的状态。

config对象表示使用JSP的servlet的配置。

application对象用于存储所有用户共享的bean 实例,并获取 Web.xml 文件中指定的初始化参数。

清单 2. JSUtil的createScriptContext()方法

public class JSUtil {
  ...
  public static ScriptContext createScriptContext(PageContext pageContext) {
    ScriptContext scriptContext = new SimpleScriptContext();
    int scope = ScriptContext.ENGINE_SCOPE;
    scriptContext.setAttribute("pageContext", pageContext, scope);
    scriptContext.setAttribute("page", pageContext.getPage(), scope);
    scriptContext.setAttribute("request", pageContext.getRequest(), scope);
    scriptContext.setAttribute("response", pageContext.getResponse(), scope);
    scriptContext.setAttribute("out", pageContext.getOut(), scope);
    scriptContext.setAttribute("session", pageContext.getSession(), scope);
    scriptContext.setAttribute("config", pageContext.getServletConfig(), scope);
    scriptContext.setAttribute("application",
        pageContext.getServletContext(), scope);
    scriptContext.setWriter(pageContext.getOut());
    return scriptContext;
  }
  ...
}

在处理 HTTP 请求的过程中,您需要使用一个脚本上下文,以便 JavaScript 片段能够使用上次执行的脚本中定义的变量和函数。满足该请求的简单方式是将脚本上下文存储为request对象的属性。getScriptContext()方法(见清单 3)使用jsee.ScriptContext 作为属性名称。

时间: 2024-08-03 05:16:35

JavaScript EE,第3部分:结合使用Java Scripting API和JSP的相关文章

关于Java Scripting API您不知道的5件事,Java平台上更简单的脚本编写方法

现在,许多Java开发人员都喜欢在Java平台中使用脚本语言,但是使用编译到 Java 字节码中的动态语言有时是不可行的.在某些情况中,直接编写一个 Java 应用程序的脚本 部分 或者在一个脚本中调用特定的 Java 对象是更快捷.更高效的方法. 这就是 javax.script 产生的原因了.Java Scripting API 是从 Java 6 开始引入的,它填补了便捷的小脚本语言和健壮的 Java 生态系统之间的鸿沟.通过使用 Java Scripting API,您就可以在您的 Ja

JavaScript EE,第2部分:用Ajax调用远程JavaScript函数

在本系列的第1部分中,您学习了如何在Asynchronous JavaScript and XML(Ajax)和Java Platform, Enterprise Edition(Java EE)应用程序中使用javax.script API.本文将展示如何为同时在服务器和客户机上使用JavaScript的Web 应用程序实现远程过程调用(Remote Procedure Call,RPC)机制.您还将学习一些有趣的技巧,例如用JavaScript实现Java接口.构建XMLHttpReques

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

本系列文章围绕的主旨是将JavaScript与服务器上的Java代码结合起来,从而能够在服务器和客户机上使用相同的JavaScript例程.此外,本系列所展示的这些技术将让您能为Ajax 客户机和非Ajax 客户机维护同一个代码库.由于服务器端的大部分代码依然用Java 语言编写,所以有必要对 JavaScript 公开这些 Java Platform, Enterprise Edition (Java EE) 特性.在本系列中,您将了解如何在服务器端运行JavaScript文件.如何用Ajax

使用Java Persistence API修改数据库表行

有关如何使用 NetBeans IDE 的更多信息,请参阅 NetBeans 网站上的 支持和文档. 本文将使用以下技术和资源 JavaServer Faces 组件/ Java EE 平台 1.2/Java EE 5* Travel 数据库 不是必需的 阅读本文的前提条件本文是本系列文章(共两篇)的第二部分.您应该已经阅读了 在 Visual Web 应用程序中使用 Java Persistence API 这篇文章,并且创建了其中所描述 的两个项目以及一些不同的类和网页.第一篇文章提供了建立

Java Persistence API 2.0更新

力争更全面.更出色 Java Persistence API (JPA) 最初引入到了 Java Platform Enterprise Edition (Java EE) 5 中,作为 规范 的 Enterprise JavaBean (EJB) 3.0 家族的一部分. 自那时起,JPA 1.0 逐渐成为流行的持久性框架.即使这一最初的规范已经很全面且功能很强大了,但是总会有一些改进的空间.下一代的 JPA 规范(JPA 2.0)目前正在 JSR 317 的开发中. JPA 专家组正在努力最终

在Visual Web应用程序中使用Java Persistence API

借助 NetBeans IDE 6.0 和 Visual Web 工具,您可以使用 Visual Web 数据提供程 序组件以及 Java Persistence API(JPA)来编写连接到数据库表的应用程序.建立了到 数据库表的连接之后,可以使用 Java Persistence API 执行数据库 CRUD 操作(即创建 .读取.更新和删除操作).在开发基于数据库的应用程序时,使用 Java Persistence API 能提供更高的灵活性. 本文是本系列文章的第 1 篇(共两篇),主要

JAVA PERSISTENCE API (JPA)

13.2.1. About JPA The Java Persistence API (JPA) is the standard for using persistence in Java projects. Java EE 6 applications use the Java Persistence 2.0 specification, documented here: http://www.jcp.org/en/jsr/detail?id=317.Hibernate EntityManag

java script-初学者,使用Java Script API开发一个网页需要多长时间?

问题描述 初学者,使用Java Script API开发一个网页需要多长时间? 网页开发初学者 基于百度地图JavaScript API开发一个类似新东方网站的网页,大概需要多长时间? 百度地图Java Scrip API : http://developer.baidu.com/map/index.php?title=首页 新东方网页:http://souke.xdf.cn/Campus.aspx 解决方案 熟悉百度javascript api 1-2天,只需要关注加载地图和标注这两个例子 新

《HTML5移动开发》—— 第1章 学习移动HTML5、CSS3和Java Script API之前的准备工作

第1章 学习移动HTML5.CSS3和Java Script API之前的准备工作 HTML5移动开发如果你跟我多少有点类似的话,你肯定已经痛恨旧版IE浏览器很多年了.那些浏览器满是失败.然而,它们在整个生命周期内在任何地方失败的方式是一样的[1].我们都知道IE6非常糟糕,但是它糟糕的方式是一样的.一旦我们搞清楚了如何填IE6的坑(polyfill[2]),我们就已经把它搞清楚了. 在移动世界,我们同样面临一些问题,不同的是这些问题以一种更新.更多样化且不断变化的方式存在.在不同设备上的不同浏