简单意义上来说,Ajax可以用来在服务器端和WEB客户端之间交换数据,它是利用JavaScript来装载WEB页面的。更深一层来讲,它可以利用异步JavaScript脚本来避免页面请求刷新,让Request/Response过程更加明了。实现Ajax的方法有很多,最原始的办法是用JavaScript脚本来实现这个过程,此外,我们还可以用比较成熟的功能库,比如说Dojo.
Dojo是什么
Dojo是一个强大的JavaScript类库,利用它提供的许多简单的API去实现一些比较复杂的页面功能。其中,利用Dojo来实现HTTP Request/Response不能不说是他的一个最大的亮点。除了提供Ajax功能之外,Dojo还提供了字符串操作、DOM操作、页面拖拽支持、以及数据结构(如列表,队列,堆栈等)。
JSON是什么
JSON是一个Java类库,专门用来转换Java对象为标准字符串。当这个字符串被传至客户端之后,可以通过JavaScript的eval()方法来产生一个数组,这个数组里面包含了所有关于服务端Java对象的信息。
JSON的标准语法可以用来加密许多嵌入对象的结构,这种语法产生的结果比相应的XML要小不少,而且用来很方便的传入eval()函数处理,因此JSON是一个高效、快速的浏览器/服务器数据传输媒介。既然服务端代码可以以多种语言形式存在,JSON也提供了对C#,Python,PHP等语言的支持。
利用Dojo处理HTTP请求
在下面的例子中,我们用Dojo来实现一个简单的功能:当用户按下一个button之后,页面弹出一个来自服务端的欢迎信息。让我们看看以下的部分代码:
<html>
<body onLoad="onLoad();">
<head>
<title>Example 1</title>
<script language="javascript" src="js/dojo.js"></script>
<script language="javascript">
dojo.require("dojo.io.*");
dojo.require("dojo.event.*");
function onLoad() {
var buttonObj = document.getElementById("myButton");
dojo.event.connect(buttonObj, "onclick",
this, "onclick_myButton");
}
function onclick_myButton() {
var bindArgs = {
url: "welcome.jsp",
error: function(type, data, evt){
alert("An error occurred.");
},
load: function(type, data, evt){
alert(data);
},
mimetype: "text/plain",
formNode: document.getElementById("myForm")
};
dojo.io.bind(bindArgs);
}
</script>
</head>
<body>
<form id="myForm">
<input type="text" name="name"/>
<input type="button" id="myButton" value="Submit"/>
</form>
</body>
</html>
首先,页面会导入Dojo库dojo.js,其中包含了所有必须的Dojo类。Dojo库类似于我们Java代码中的Package的概念,象这个例子中所描述的,此处导入了两个包:dojo.io包中含有一些相关的类,可以通过类似于XMLHTTPTransport的协议发出HTTP Request请求;dojo.event包则是用来为网页DOM对象提供一个统一的事件处理方式。
其次,需要注意的是,我们为button指定了一个onclick事件。传统的做法一般都是:
<input type="submit" onclick="someFunc();"/>
这样可以达到事件绑定的效果,但是遗憾的是,这种方式始终一次只能最多绑定一个事件。而例子中的dojo.event.connect()方法可以让我们关联到不同类中的多个function。例如此处,我们就将onclick_myButton作为myButton的处理句柄。
当onclick_myButton事件执行的时候,系统将会访问welcome.jsp页面,然后返回一个响应。dojo.io.bind()函数在这里起到了强大的作用,参数bindArgs是一个键值对数组。在这个例子中,我们指定了以下五对键值组合:
1、url:请求的目标URL;
2、mimetype:响应的类型类型,默认是"text/plain";
3、load:执行成功之后响应的方法;
4、error:执行发生错误的时候响应的方法;
5、formNode:一个Form的ID,其中的所有fields都将作为参数传递给url处理。
一旦dojo.io.bind(bindArgs)被处理,load或error中的事件将在指定情况下被触发,仔细观察,会发现这两个方法都有三个共有的参数:
1、type:函数的返回类型值,一般load()事件对应"load",而error()事件对应"error";
2、data:得到的响应内容,如果mimetype被指定为text/plain,data内容将是一个字符串响应;如果mimetype是text/json,data的内容理论上就是eval('('+responseReceived+')')的值,这里responseReceived即是响应返回过来的一个JSON字串。
3、evt:HTML DOM Event Object,用来标示一个事件的状态,如事件发生的对象,键盘鼠标的状态等。
除了例子中的这种绑定方式之外,还可以用dojo.event.connect()的来关联一个含有(type,data.evt)参数的function,如:
var req = dojo.io.bind(bindArgs);
dojo.event.connect(req, "load", this, "handleResponse");
//handleResponse即是一个预定义的JavaScript function
注:
考虑到安全的因素,Fixfox不支持给bindArgs中url参数给定一个外部URL地址,而IE在这方面是没有限制的。
使用JSON传输Java对象
在前面的部分我们间接提到了JSON,它可以将Java对象通过eval()函数转换成一个Javascript理解的对象。
一般我们喜欢在服务端写一些个POJO,而要把它传至Web客户端,可以通过JSON库提供的一些接口方法,如我们在一个名为Book的POJO类中额外添加一个方法Book.toJSONString()方法:
public String toJSONString() throws JSONException {
JSONObject jsonObj = new JSONObject();
jsonObj.put("bookId", new Integer(this.bookId));
jsonObj.put("title", this.title);
jsonObj.put("isbn", this.isbn);
jsonObj.put("author", this.author);
return jsonObj.toString();
}
例子中的JSONObject类即将Book类的所有属性都提取出来,然后包装成为一个类似于java.util.Map的对象,最后通过toString()方法提供传输给Web端去eval()。同样,我们可以用另外一个JSONArray对象来包装相关信息为一个List,然后传输到Web客户端。
在Web客户端的实现,我们可以参考下面的例子:
function trMouseOver(bookId) {
getBookInfo(bookId);
}
function trMouseOut(evt) {
var bookDiv = document.getElementById("bookInfo");
bookDiv.style.display = "none";
}
function getBookInfo(bookId) {
var params = new Array();
params['bookId'] = bookId;
var bindArgs = {
url: "book.jsp",
error: function(type, data, evt){
alert("error");
},
mimetype: "text/json",
content: params
};
var req = dojo.io.bind(bindArgs);
dojo.event.connect(req, "load", this, "populateDiv");
}
function populateDiv(type, data, evt) {
var bookDiv = document.getElementById("bookInfo");
if (!data) {
bookDiv.style.display = "none";
} else {
bookDiv.innerHTML = "ISBN: " + data.isbn +
"<br/>Author: " + data.author;
bookDiv.style.display = "";
}
}
不同于前一个例,此例中的bingArgs多了一个content属性,用来存储一个键值对,然后作为参数传递给book.jsp页面去响应。在某种意义上来说,它有点类似于Form的fields提交。
下一次,再继续写Dojo的高级运用:Widget的制作。
分享到:
相关推荐
通过上述步骤,我们成功地使用Dojo和JSON构建了一个简单的AJAX应用。这个应用展示了如何利用Dojo进行HTTP请求、处理服务器响应以及更新DOM元素。此外,通过创建自定义组件,可以进一步扩展应用的功能,使其更加健壮...
《Dojo构建Ajax应用程序》是一本专注于利用Dojo框架创建高效、...通过学习《Dojo构建Ajax应用程序》,开发者能够熟练掌握Dojo框架,从而构建出高效、用户体验优秀的Ajax应用,同时也能对JavaScript和Ajax有更深的理解。
<<Dojo的高级运用:Widget的制作>> 和 使用Dojo和JSON构建Ajax应用>> 中涉及到的源代码 博文链接:https://tailsherry.iteye.com/blog/102907
这个压缩包包含了Dojo框架的一个早期版本——dojo-release-1.1.2,它对于了解Dojo的历史和学习Ajax应用程序的构建非常有价值。在JavaScript的世界里,Ajax(异步JavaScript和XML)技术允许网页在不刷新整个页面的...
总结来说,"dojo-0.3.1-ajax"是Dojo工具包的一个版本,专注于提供高效、灵活的AJAX功能,便于开发者构建富客户端应用。通过理解并熟练运用其提供的各种方法和特性,可以轻松地实现与服务器的数据交互,提升Web应用的...
本压缩包“dojo_doc(json+dojo的例子)”显然包含了关于如何使用Dojo与JSON进行交互的实例和文档,这对于理解和掌握Dojo的AJAX(异步JavaScript和XML)功能至关重要。 首先,让我们详细了解一下JSON(JavaScript ...
Dojo 是一个强大的JavaScript工具库,它在Web开发领域中被广泛使用,特别是在构建富互联网应用程序(RIA)时。...通过深入学习和使用这个压缩包中的资源,开发者可以掌握Dojo的Ajax实现方式,并将其应用于实际项目中。
9. **dojo/json**: 提供了JSON序列化和反序列化的功能,如`dojo/json::parse`和`dojo/json::stringify`,帮助开发者在Ajax请求中处理JSON数据。 10. **dojo.stateful**: 对象状态管理是Ajax应用中常见需求,`dojo/...
总之,"dojo-0.4.3-ajax"是一个包含Dojo Toolkit核心Ajax功能的包,它提供了丰富的异步通信手段,帮助开发者构建交互性强、响应速度快的Web应用。尽管这个版本已经较老,但它依然展示了Dojo在Ajax技术上的强大能力。
通过学习和使用这些资源,开发者可以深入了解如何在项目中有效利用Dojo的AJAX功能,提升Web应用的用户体验和交互性。同时,Dojo的其他模块(如动画、布局、国际化等)也为构建复杂的Web应用提供了全面的支持。
4. `dojo.data`: Dojo的这个模块提供了数据存储和检索的抽象层,与AJAX结合使用,可以方便地从服务器获取和存储数据。 5. JSONP (JSON with Padding): 跨域数据访问时,由于同源策略的限制,AJAX通常无法向不同源...
总结一下,dojo的Ajax功能通过xhr模块提供了强大的异步通信能力,使得Java开发者能够轻松地在Struts1和Struts2框架中构建动态、交互式的Web应用。通过引入dojo-0.4.3-ajax.jar,你可以享受到dojo的Ajax功能,提高Web...
这个“最棒的AJAX框架DOJO中文手册”提供了全面的中文指南,便于开发者更有效地理解和应用Dojo。 ### 1. AJAX 技术 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分...
`dojo.Stateful`提供了一种方式来跟踪和修改对象的状态,而`dojo/topic`则是一个简单的发布/订阅事件系统,允许组件之间进行通信,这对于构建响应式的Ajax应用非常有用。 总的来说,dojo JavaScript框架通过其强大...
Struts、JSON与Ajax是Web开发中的核心技术,它们在构建动态、交互性强的网页应用时发挥着关键作用。Struts是Java EE平台上的一个MVC(Model-View-Controller)框架,它帮助开发者组织和管理应用程序结构,实现业务...
本文将详细介绍如何使用Dojo和JSON建立一个支持无限级AJAX动态加载的功能模块树,并提供具体的实现步骤和示例代码。 #### 二、Dojo简介及优势 Dojo是一个开源的JavaScript框架,它提供了一套强大的工具集用于创建...
很不错的中文教程!文件太大分3个包! 目录如下: dojo精品中文教程 Dojo.1.0 Practice Note [1] ...使用 Dojo 工具包和 JSON-RPC 构建企业 SOA Ajax 客户端 利用Dojo实现拖动(Drag and Drop)效果