`
tailsherry
  • 浏览: 136409 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

使用Dojo和JSON构建Ajax应用

阅读更多

简单意义上来说,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的制作。

分享到:
评论
3 楼 jjr_1983 2011-08-25  
# 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 = "";    
#   }  

不要试图用js直接控制css元素,维护麻烦
2 楼 javabay 2009-04-30  
这篇写得太好了。
1 楼 fly.net.cn 2008-08-31  

相关推荐

    使用Dojo,JSON开发ajax

    通过上述步骤,我们成功地使用Dojo和JSON构建了一个简单的AJAX应用。这个应用展示了如何利用Dojo进行HTTP请求、处理服务器响应以及更新DOM元素。此外,通过创建自定义组件,可以进一步扩展应用的功能,使其更加健壮...

    Dojo构建Ajax应用程序

    《Dojo构建Ajax应用程序》是一本专注于利用Dojo框架创建高效、...通过学习《Dojo构建Ajax应用程序》,开发者能够熟练掌握Dojo框架,从而构建出高效、用户体验优秀的Ajax应用,同时也能对JavaScript和Ajax有更深的理解。

    Dojo的高级运用:Widget的制作

    &lt;&lt;Dojo的高级运用:Widget的制作&gt;&gt; 和 使用Dojo和JSON构建Ajax应用&gt;&gt; 中涉及到的源代码 博文链接:https://tailsherry.iteye.com/blog/102907

    Dojo构建Ajax应用程序源码(包括书中用到的dojo-release-1.1.2)

    这个压缩包包含了Dojo框架的一个早期版本——dojo-release-1.1.2,它对于了解Dojo的历史和学习Ajax应用程序的构建非常有价值。在JavaScript的世界里,Ajax(异步JavaScript和XML)技术允许网页在不刷新整个页面的...

    dojo-0.3.1-ajax

    总结来说,"dojo-0.3.1-ajax"是Dojo工具包的一个版本,专注于提供高效、灵活的AJAX功能,便于开发者构建富客户端应用。通过理解并熟练运用其提供的各种方法和特性,可以轻松地实现与服务器的数据交互,提升Web应用的...

    dojo_doc(json+dojo的例子)

    本压缩包“dojo_doc(json+dojo的例子)”显然包含了关于如何使用Dojo与JSON进行交互的实例和文档,这对于理解和掌握Dojo的AJAX(异步JavaScript和XML)功能至关重要。 首先,让我们详细了解一下JSON(JavaScript ...

    dojo-0.4.2-ajax.rar

    Dojo 是一个强大的JavaScript工具库,它在Web开发领域中被广泛使用,特别是在构建富互联网应用程序(RIA)时。...通过深入学习和使用这个压缩包中的资源,开发者可以掌握Dojo的Ajax实现方式,并将其应用于实际项目中。

    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-0.4.3-ajax"是一个包含Dojo Toolkit核心Ajax功能的包,它提供了丰富的异步通信手段,帮助开发者构建交互性强、响应速度快的Web应用。尽管这个版本已经较老,但它依然展示了Dojo在Ajax技术上的强大能力。

    dojo-0.4.1-ajax

    通过学习和使用这些资源,开发者可以深入了解如何在项目中有效利用Dojo的AJAX功能,提升Web应用的用户体验和交互性。同时,Dojo的其他模块(如动画、布局、国际化等)也为构建复杂的Web应用提供了全面的支持。

    dojo-0.4.0-ajax

    4. `dojo.data`: Dojo的这个模块提供了数据存储和检索的抽象层,与AJAX结合使用,可以方便地从服务器获取和存储数据。 5. JSONP (JSON with Padding): 跨域数据访问时,由于同源策略的限制,AJAX通常无法向不同源...

    dojo的ajax的jar包

    总结一下,dojo的Ajax功能通过xhr模块提供了强大的异步通信能力,使得Java开发者能够轻松地在Struts1和Struts2框架中构建动态、交互式的Web应用。通过引入dojo-0.4.3-ajax.jar,你可以享受到dojo的Ajax功能,提高Web...

    最棒的AJAX框架DOJO中文手册

    这个“最棒的AJAX框架DOJO中文手册”提供了全面的中文指南,便于开发者更有效地理解和应用Dojo。 ### 1. AJAX 技术 AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分...

    dojo JavaScript框架 Ajax学习

    `dojo.Stateful`提供了一种方式来跟踪和修改对象的状态,而`dojo/topic`则是一个简单的发布/订阅事件系统,允许组件之间进行通信,这对于构建响应式的Ajax应用非常有用。 总的来说,dojo JavaScript框架通过其强大...

    struts+json+ajax

    Struts、JSON与Ajax是Web开发中的核心技术,它们在构建动态、交互性强的网页应用时发挥着关键作用。Struts是Java EE平台上的一个MVC(Model-View-Controller)框架,它帮助开发者组织和管理应用程序结构,实现业务...

    利用Dojo和JSON建立无限级AJAX动态加载的功能模块树

    本文将详细介绍如何使用Dojo和JSON建立一个支持无限级AJAX动态加载的功能模块树,并提供具体的实现步骤和示例代码。 #### 二、Dojo简介及优势 Dojo是一个开源的JavaScript框架,它提供了一套强大的工具集用于创建...

    dojo精品中文教程(包一)

    很不错的中文教程!文件太大分3个包! 目录如下: dojo精品中文教程 Dojo.1.0 Practice Note [1] ...使用 Dojo 工具包和 JSON-RPC 构建企业 SOA Ajax 客户端 利用Dojo实现拖动(Drag and Drop)效果

Global site tag (gtag.js) - Google Analytics