比较Ajax的三种实现及JSON解析

本文主要是比较三种实现Ajax的方式,为以后的学习开个头。

准备:

1、  prototype.js
2、  jquery1.3.2.min.js
3、  json2.js

后台处理程序(Servlet),访问路径servlet/testAjax:

Java代码

package ajax.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Ajax例子后台处理程序
 * @author bing
 * @version 2011-07-07
 *
 */
public class TestAjaxServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out = response.getWriter();
    String name = request.getParameter("name");
    String age = request.getParameter("age");
    System.out.println("{\"name\":\"" + name + "\",\"age\":\"" + age + "\"}");
    out.print("{\"name\":\"" + name + "\",\"age\":" + age + "}");
    out.flush();
    out.close();
  }
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request,response);
  }
} 

TestAjaxServlet接收两个参数:name和age,并返回一个以JSON格式编写的字符串。

前台页面参数输入界面:

Html代码 

<div id="show">显示区域</div>
<div id="parameters">
  name:<input id="name" name="name" type="text" /><br />
  age:<input id="age" name="age" type="text" /><br />
</div> 

一、prototype实现

Html代码

<script type="text/javascript" src="prototype.js"></script>
  <script type="text/javascript">
    function prototypeAjax()
    {
    var url = "servlet/testAjax";//请求URL
    var params = Form.serialize("parameters");//提交的表单
   var myAjax = new Ajax.Request(
    url,{
      method:"post",// 请求方式
      parameters:params, // 参数
      onComplete:pressResponse, // 响应函数
      asynchronous:true
    });
    $("show").innerHTML = "正在处理中...";
    }
    function pressResponse(request)
    {
    var obj = request.responseText; // 以文本方式接收
    $("show").innerHTML = obj;
    var objJson = request.responseText.evalJSON(); // 将接收的文本用解析成Json格式
    $("show").innerHTML += "name=" + objJson['name'] + " age=" + objJson['age'];
    }
</script>
<input id="submit" type="button" value="提交" onclick="prototypeAjax()" /><br /> 

在prototype的Ajax实现中,用evalJSON方法将字符串转换成JSON对象。

二、jquery实现

Html代码 

<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="json2.js"></script>
<input id="submit" type="button" value="提交" /><br />
<script type="text/javascript">
    function jqueryAjax()
    {
      var user={"name":"","age":""};
      user.name= $("#name").val();
      user.age=$("#age").val();
      var time = new Date();
      $.ajax({
         url: "servlet/testAjax?time="+time,
         data: "name="+user.name+"&age="+user.age,
         datatype: "json",//请求页面返回的数据类型
         type: "GET",
         contentType: "application/json",//注意请求页面的contentType 要于此处保持一致
         success:function(data) {//这里的data是由请求页面返回的数据
         var dataJson = JSON.parse(data); // 使用json2.js中的parse方法将data转换成json格式
         $("#show").html("data=" + data + " name="+dataJson.name+" age=" + dataJson.age);
         },
         error: function(XMLHttpRequest, textStatus, errorThrown) {
          $("#show").html("error");
         }
      });
    }
    $("#submit").bind("click",jqueryAjax); // 绑定提交按钮
 </script> 

刚接触jQuery,在json的处理上借助了json2.js。还请前辈们指教。。

三、XMLHttpRequest实现

Html代码 

<script type="text/javascript">
    var xmlhttp;
    function XMLHttpRequestAjax()
    {
      // 获取数据
     var name = document.getElementById("name").value;
       var age = document.getElementById("age").value;
     // 获取XMLHttpRequest对象
     if(window.XMLHttpRequest){
      xmlhttp = new XMLHttpRequest();
     }else if(window.ActiveXObject){
      var activxName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
      for(var i = 0 ; i < activexName.length; i++){
        try{
          xmlhttp = new ActiveXObject(activexName[i]);
          break;
        }catch(e){}
      }
     }
       xmlhttp.onreadystatechange = callback; //回调函数
       var time = new Date();// 在url后加上时间,使得每次请求不一样
       var url = "servlet/testAjax?name="+name+"&age="+age+"&time="+time;
       xmlhttp.open("GET",url,true); // 以get方式发送请求
       xmlhttp.send(null);  // 参数已在url中,所以此处不需要参送
    }
    function callback(){
      if(xmlhttp.readyState == 4){
       if(xmlhttp.status == 200){ // 响应成功
         var responseText = xmlhttp.responseText;  // 以文本方式接收响应信息
         var userdiv = document.getElementById("show");
         var responseTextJson = JSON.parse(responseText); // 使用json2.js中的parse方法将data转换成json格式
         userdiv.innerHTML=responseText + " name=" + responseTextJson.name + " age=" + responseTextJson.age;
       }
      }
    }
</script>
<input id="submit" type="button" value="提交" onclick="XMLHttpRequestAjax()" /><br /> 

ps:字符串转换成JSON的三种方式

采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON )。
ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法。

1,eval方式解析,恐怕这是最早的解析方式了。

function strToJson(str){
   var json = eval('(' + str + ')');
   return json;
} 

记得str两旁的小括号哦。

2,new Function形式,比较怪异哦。

function strToJson(str){
  var json = (new Function("return " + str))();
  return json;
} 

IE6/7中当字符串中含有换行(\n)时,new Function不能解析,但eval却可以。

3,使用全局的JSON对象。

function strToJson(str){
  return JSON.parse(str);
} 

目前IE8(S)/Firefox3.5+/Chrome4/Safari4/Opera10 已实现了该方法。

使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

var str = '{name:"jack"}';
var obj = JSON.parse(str); // --> parse error 

name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。

(0)

相关推荐

  • 一种Javascript解释ajax返回的json的好方法(推荐)

    通常ajax请求返回的格式为json或者xml,如果返回的是json,则可以通过转换成javascript对象进行操作,如下: 1.ajax请求的controller实现 @RequestMapping public void getLocations(@RequestParam String location, PrintWriter printWriter) { if (StringUtils.isEmpty(location)) { return; } List<Location> lo

  • 浅析JSONP解决Ajax跨域访问问题的思路详解

    前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应,怎么回事?代码没怎么改动,唯一修改的地方就是jQuery的ajax方法中的url地址.难道是这里的问题,经过检查和调试,发现原来是同源策略在作怪,我们知道,JavaScript或jQuery是在Web前端开发中经常使用的动态脚本技术.在JavaScript中,有一个很重要

  • 深入浅析Jsonp解决ajax跨域问题

    一.介绍 最近跨域问题比较多,而且自己刚好也看到这一块,就总结了一下,关于JSONP的东西百度的话东西确实很多,很多人都是复制别人的,如此下去,其实找的资料就那么几份,关键是我还看不懂,可能是能力问题吧,自己经过很多尝试,所以总结了一下,终究还是弄懂了皮毛.注意一点是,这里是用Jsonp解决ajax的跨域问题,具体的实现其实不是ajax. 1.同源策略 浏览器有一个很重要的概念--同源策略(Same-Origin Policy).所谓同源是指,域名,协议,端口相同.不同源的客户端脚本(JavaS

  • Ajax的jsonp方式跨域获取数据的简单实例

    jsonp的调用,今天碰到了,正好整理了一下. <!DOCTYPE html> <html> <head> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("#b

  • 比较Ajax的三种实现及JSON解析

    本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1.  prototype.js 2.  jquery1.3.2.min.js 3.  json2.js 后台处理程序(Servlet),访问路径servlet/testAjax: Java代码 package ajax.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; i

  • asp.net省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例

    本文主要列举了省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例.前段时间需要作一个的Web前端应用,需要用多个框架,一个典型的应用场景是省市三级联动,基于此应用,特将三种主要的ajax框架略作整理,方便有需要的朋友查阅. 在示例之前,我们先设置一个演示数据源,新建一个项目,项目结构如图: 主要文件如下:AreaModel.cs: 复制代码 代码如下: using System; using System.Collections.Generi

  • 分享ajax的三种解析模式

    一.Ajax中的JSON格式 html代码: <html> <body> <input type="button" value="Ajax" id="btn"> <script> var btn = document.getElementById("btn"); btn.onclick = function(){ var xhr = getXhr(); xhr.open(&quo

  • Struts 2中实现Ajax的三种方式

    Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的. 所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一部分,也可能是xml.json等结构化的数据,还可能是一个简单的字符串. 所以,在Struts 2中使用Ajax,Action一般就不会调用一个jsp视图来显示了(如果Ajax请求内容是页面的一部分也可能调用jsp视图),而是通过一些其他的方式. 下面介绍了三种方法,用于Action实现Ajax请求

  • Java三种移位运算符原理解析

    这篇文章主要介绍了Java三种移位运算符原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java移位运算符不外乎就这三种:<<(左移).>>(带符号右移)和>>>(无符号右移). 1. 左移运算符 左移运算符<<使指定值的所有位都左移规定的次数. 1)它的通用格式如下所示: value << num num 指定要移位值value 移动的位数. 左移的规则只记住一点:丢弃最高位(符

  • 三种Java自定义DNS解析器方法与实践

    目录 1.InMemoryDnsResolver 2.SystemDefaultDnsResolver 3.自定义DnsResolver 4.连接池管理器 5.测试 前言: 最近终于用上了高性能的测试机(54C96G * 3),相较之前的单机性能提升了三倍,数量提升了三倍,更关键的宽带提单机升了30倍不止,总体讲提升了100多倍,这下再也不用担心单机压力机瓶颈,直接原地起飞. 不过没高兴5分钟,我发现接口居然请求不通,经过一阵拨乱反正终于找到原因:域名无法解析,IP无法直接访问. 自然而然,解决

  • Java多线程三种主要实现方式解析

    多线程三种主要实现方式:继承Thread类,实现Runnable接口.Callable和Futrue. 一.简单实现 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class T02_HowToCreat

  • VMWare网络适配器三种模式实现过程解析

    三种模式 Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式) 在安装好vmware后,在网络连接中会有以下两块虚拟网卡: VMnet1作用于仅主机模式 VMnet8作用于NAT模式 一.桥接模式 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰.在桥接

  • VMware虚拟机三种连接方式实例解析

    NAT 这种方式下,虚拟机的网卡连接到宿主的 VMnet8 上.此时系统的 VMWare NAT Service 服务就充当了路由器的作用,负责将虚拟机发到 VMnet8 的包进行地址转换之后发到实际的网络上,再将实际网络上返回的包进行地址转换后通过 VMnet8 发送给虚拟机.VMWare DHCP Service 负责为虚拟机提供 DHCP 服务. Bridged 这种方式下,虚拟机就像一台真正的计算机一样,直接连接到实际的网络上,与宿主机没有任何联系. Host-only 这种方式下,虚拟

  • Java监听器三种实现方法代码解析

    这是没有缩减的写法 //创建一个自定义监听器 private btnlistener btnl = new btnlistener(); //必须在一个btn创建后才添加监听器,即在类里面无法添加但构造函数可以 btn.addActionListener(btnl); //自定义监听器的内容 private class btnlistener implements ActionListener { @Override //实现接口(interface) public void actionPer

随机推荐