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接口、构建XMLHttpRequest包装器、使Ajax调试更加容易以及使用JSP 标记文件生成JavaScript代码。

RPC机制非常简单。服务器上有一组 JavaScript函数,现在希望能从Web浏览器调用它们,就像有一个JavaScript引擎在同时执行客户机代码和服务器代码一样。因此,需要有一些客户端例程,这些例程应该与服务器端的对应例程有相同的名称和参数。

客户端例程将使用Ajax 把它们的参数传递到服务器,在服务器上进行真正的处理。一个Java servlet 将调用服务器端函数,并使用JSON格式将结果返回到客户机。然后,客户端例程计算 Ajax 响应,将JSON 字符串转换回JavaScript对象,后者被返回到应用程序。

作为应用程序开发人员,可以将精力放在构建用户界面和服务器中执行的函数上。您不需要处理Ajax或RPC 问题,因为本文以标记文件的形式提供了一个JavaScript代码生成器,您可以在JSP页面使用它来自动生成客户端例程。为了理解其中的工作原理,我们从一个示例应用程序开始。

开发一个JVM 监视应用程序

本文中的示例应用程序使用Java Management API 监视运行托管应用程序的Java EE 服务器的JVM。用户界面由一个简单的Web页面组成,该页面显示各种不同的指示器,例如 Java类的数量、内存消耗、垃圾收集器的活动和线程的数量。

这些信息通过Ajax获得,并插入到一个HTML表中(如图 1 所示;单击 这里 查看图 1的放大图)。更有趣的是,这个Web页面包含一个表单,通过该表单可以为给定的秒数分配内存。还可以调用JVM的垃圾收集器(GC)。

图 1. 示例应用程序

在服务器端,应用程序使用一个JavaScript文件,Web浏览器将借助 Ajax 并使用本系列第1部分提供的脚本运行器调用该文件中的函数。这是一个简单的servlet,它处理URL 以.jss 扩展名结束的所有请求。该 servlet 查找服务器上相应的JavaScript文件,并使用Java Scripting API执行它。

创建Web页面

清单 1 显示MonitorPage.jsp文件中的表和表单。每个数据单元有一个ID,以便用JavaScript 更新表中的内容。<body> 标记的onload 属性用于调用一个名为 init()的JavaScript函数,该函数将初始化应用程序的客户端部分。另外两个函数 allocMem()和gc() 是在用户单击按钮时调用的。

清单 1. MonitorPage.jsp的HTML代码

<html>
<head>
...
<style type="text/css">
th { text-align: left; }
td { text-align: right; }
.space { margin: 10px; }
</style>
</head>
<body onload="init()">
<table border="1" cellpadding="5">
<tr>
<th colspan=2>Classes</th>
<th colspan=2>Heap Memory</th>
<th colspan=2>Non-Heap Memory</th>
<th colspan=2>Garbage Collector</th>
<th colspan=2>Threads</th>
</tr>
<tr>
<th>Loaded</th>
<td id="info.classes.loaded"></td>
<th>Used</th>
<td id="info.memory.heap.used"></td>
<th>Used</th>
<td id="info.memory.nonHeap.used"></td>
<th>Count</th>
<td id="info.gc.count"></td>
<th>Live</th>
<td id="info.threads.live"></td>
</tr>
<tr>
<th>Unloaded</th>
<td id="info.classes.unloaded"></td>
<th>Committed</th>
<td id="info.memory.heap.committed"></td>
<th>Committed</th>
<td id="info.memory.nonHeap.committed"></td>
<th>Time</th>
<td id="info.gc.time"></td>
<th>Peak</th>
<td id="info.threads.peak"></td>
</tr>
</table>
<br>
<form name="monitorForm">
Size: <input name="size" size="10">
<span class="space"></span>
Seconds: <input name="seconds" size="4">
<span class="space"></span>
<button type="button"
onclick="allocMem(this.form.size.value, this.form.seconds.value)"
>Allocate Memory</button>
<span class="space"></span>
<button type="button" onclick="gc()">Collect Garbage</button>
</form>
</body>
</html>

MonitorPage.jsp文件(见清单 2)使用一个名为 <js:rpc>的定制标记来生成客户端 JavaScript函数,这些函数调用服务器端对应的函数。<js:rpc> 标记有以下属性:

script 将在服务器上执行的脚本的URL
function 被远程调用的JavaScript函数的签名
validator 一个可选表达式,在Web浏览器中将计算该表达式以验证函数的参数
jsonVar 一个可选 JavaScript 变量的名称,该变量用于存储 JSON 响应
method HTTP方法,可以是 GET或POST
async 表明应该异步还是同步使用XMLHttpRequest的一个布尔属性
时间: 2024-10-04 12:15:58

JavaScript EE,第2部分:用Ajax调用远程JavaScript函数的相关文章

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

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

基于JavaScript如何实现ajax调用后台定义的方法_jquery

由于ajax的独特优势,使得它在当前大量网站得到了广泛的应用,下面就介绍一下ajax如何调用后台定义的函数,虽然比较简单,不过希望能够给初学者带来一定的帮助,代码如下: 1.首先我们先创建一个antzone.aspx页面. 2.在它的cs文件中创建如下函数: public static string mytest(string first, string second) { return return first+second; } 2.html代码如下: <form id="myform

Javascript ajax调用新闻内容并显示

html如下,我们这个页面让dedecms调用数据新闻标签  代码如下 复制代码 dedecms模板标签是否样  {dede:arclist typeid='3' row='6' orderby='id'}                                                              <li data-value="url(/images/20131107153016.jpg)">                         

javascript引擎-Ajax调用作用域问题,函数未定义

问题描述 Ajax调用作用域问题,函数未定义 提示tellme未定义.代码在图里面,请大神指点...... 解决方案 解决方案二: 你的tellme是放到其他函数体内申明的吧.. 如$(function(){....});的....里面,你那样添加的事件tellme需要再window作用域下的,你放到其他函数内部申明是访问不到的 改成这样 window.tellme=function(){ console.log("hah"); } 或者将tellme函数放到函数体外申明,变成wind

用AJAX调用SOAP Web服务:构建Web服务客户机

ajax|web|web服务|客户机 [导读]本文介绍如何使用异步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 设计模式来实现基于 Web 浏览器的 SOAP Web 服务客户机. AJAX 已普遍用于许多知名的 Web 应用程序服务,例如 GMail.Google Maps.Flickr 和 Odeo.com.通过使用异步 XML 消息传递,AJAX 为 Web 开发人员提供了一种扩展其 Web 应用程序价值和功能的途径.这

用AJAX调用SOAP Web服务:构建Web服务客户机(2)

ajax|web|web服务|客户机 WS.Call 对象公开了以下三个方法: •add_handler.向处理链添加请求/响应处理程序.处理程序对象在调用 Web 服务的前后被调用,以支持可扩展的预调用处理和后调用处理. •invoke.将指定的 SOAP.Envelope 对象发送给 Web 服务,然后在接收到响应后调用回调函数.当调用使用文本 XML 编码的文档样式的 Web 服务时,请使用此方法. •invoke_rpc.创建一个封装 RPC 样式请求的 SOAP.Envelope,并将

用AJAX调用SOAP Web服务:构建Web服务客户机(1)

ajax|web|web服务|客户机 本文介绍如何使用异步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 设计模式来实现基于 Web 浏览器的 SOAP Web 服务客户机. AJAX 已普遍用于许多知名的 Web 应用程序服务,例如 GMail.Google Maps.Flickr 和 Odeo.com.通过使用异步 XML 消息传递,AJAX 为 Web 开发人员提供了一种扩展其 Web 应用程序价值和功能的途径.这里介绍的

用AJAX调用SOAP Web服务:构建Web服务客户机(3)

ajax|web|web服务|客户机 一个简单示例 我已经提供了一个示例项目来阐释 Web Services JavaScript Library 的基本功能.该演示所使用的 Web 服务(如清单 10 所示)已经在 WebSphere Application Server 中进行了实现,并提供了简单的 Hello World 功能. 清单 10. 一个简单的基于 Java 的"Hello World"Web 服务 package example; public class Hello

jQuery+json实现的简易Ajax调用实例_jquery

本文实例讲述了jQuery+json实现的简易Ajax调用.分享给大家供大家参考,具体如下: Userservlet.java代码: package com.iss.servlet; import org.json.JSONException; import org.json.JSONObject; import com.iss.pojo.User; import com.iss.util.JSONUtil; public class UserServlet extends HttpServle