初识--Ajax & Json

1,AJAX是一种进行页面局部异步刷新技术。

  用AJAX向服务器发送请求和获得服务器返回的数据并更新到页面中。

  不是刷新整个页面,而是在HTML页面中使用JavaScript创建XMLHTTPRequest对象向服务器发出请求以及获得返回的数据。

  常见例子:帖子评论、视频下的评论,我们提交评论以后不会有整个HTML页面的刷新,不会有视频的中断。

2,我们借助Nvelocity模板引擎写一个一般处理程序,实现评论中常见的 [赞、踩] 功能。

  Demo 下载 (1,Demo中的视频需自行添加  2,方便排版Demo中用了Bootstrap, 可参考http://www.bootcss.com/

  我们发现,每次点击 赞或踩 页面都重新刷新了一次,正在播放的视频也重新播放了。

  

3,我们再用Ajax实现点击显示点赞次数。

  新建CommentByAjax.html,页面中给按钮 “赞” 添加 onclick方法 , onclick方法中 通过javascript创建XMLHTTPRequest对象向服务器端的一般处理程序请求处理结果。

  处理结果返回到html页面并显示,这样整个过程没有刷新页面,只是通过XMLHTTPRequest对象请求了点赞次数,实现了局部刷新。

  效果如下:连续点赞 页面显示点赞次数递增,视频没有中断或者重播。

  

  步骤:A, 新建CommnetByAJAX.html页面,并添加 javascript 方法创建XMLHTTPRequest对象请求服务器 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn‘t work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <script type="text/javascript">

        function AddZan() {
            var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(‘Microsoft.XMLHTTP‘); //创建XMLHTTP对象,考虑兼容性
            xmlhttp.open("POST", "ZanCaiCount.ashx?" + "Action=Zan", true); //“准备”向服务器的ZanCaiCount.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) //readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成)
                {
                    if (xmlhttp.status == 200) //如果状态码为200则是成功
                    {
                        document.getElementById("ZanNum").innerHTML = xmlhttp.responseText;
                    }
                    else {
                        alert("AJAX服务器返回错误!");
                    }
                }
            }
            //不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!!
            xmlhttp.send(); //这时才开始发送请求
            //发出请求后不等服务器返回数据,就继续向下执行,所以不会阻塞,界面就不卡了,这就是AJAX中“A”的含义“异步”。试着在ashx加一句Thread.Sleep(3000);
        }

    </script>
</head>
<body>

    <form action="CountComments.ashx" method="post">
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-5">
                <video src="./Surface%20Pro%203.mp4" autoplay="autoplay" width="320" height="240" controls="controls" />
            </div>
            <div class="col-md-6"></div>

        </div>
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-1">
                <input type="button" name="Zan" value="赞" onclick="AddZan()" /><label id="ZanNum"></label>
            </div>
            <div class="col-md-1">
                <input type="button" name="Cai" value="踩" onclick="AddCai()" /><label id="CaiNum"></label>
            </div>
            <div class="col-md-9"></div>
        </div>
    </form>

    <!-- jQuery (necessary for Bootstrap‘s JavaScript plugins) -->
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>

</body>

     B, 添加 点赞、点踩 计算的一般处理程序: ZanCai.ashx ,接收CommentByAJAX.html传递过来的参数(Zan/Cai)计算次数,并返回

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AjaxDemo
{
    /// <summary>
    /// ZanCaiCount 的摘要说明
    /// </summary>
    public class ZanCaiCount : IHttpHandler
    {

        private static int numZan = 0;
        private static int caiNum = 0;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //根据Action参数判断是赞 还是 踩
            string strAction = context.Request.QueryString["Action"];

            if (strAction == "Zan")
            {
                numZan++;
                context.Response.Write(numZan.ToString());     //输出
            }
            else if (strAction == "Cai")
            {
                caiNum++;
                context.Response.Write(caiNum.ToString());     //输出
            }

        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

     C, 以上完成了AJAX请求点赞次数。 整个过程主要就是 javascript方法创建XMLHTTPRequest对象向服务器请求数据,如下代码:

<script type="text/javascript">

        function AddZan() {
            var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(‘Microsoft.XMLHTTP‘); //创建XMLHTTP对象,考虑兼容性
            xmlhttp.open("POST", "ZanCaiCount.ashx?" + "Action=Zan", true); //“准备”向服务器的ZanCaiCount.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) //readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成)
                {
                    if (xmlhttp.status == 200) //如果状态码为200则是成功
                    {
                        document.getElementById("ZanNum").innerHTML = xmlhttp.responseText;
                    }
                    else {
                        alert("AJAX服务器返回错误!");
                    }
                }
            }
            //不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!!
            xmlhttp.send(); //这时才开始发送请求
            //发出请求后不等服务器返回数据,就继续向下执行,所以不会阻塞,界面就不卡了,这就是AJAX中“A”的含义“异步”。试着在ashx加一句Thread.Sleep(3000);
        }

    </script>

 4, 我们把上面一段JavaScript方法封装到js文件中, 方便以后调用。

  步骤: A, js文件夹下添加 ajax.js

function ajax(url, onsuccess) {
    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(‘Microsoft.XMLHTTP‘); //创建XMLHTTP对象,考虑兼容性
    xmlhttp.open("POST", url, true); //“准备”向服务器的ZanCaiCount.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) //readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成)
        {
            if (xmlhttp.status == 200) //如果状态码为200则是成功
            {
                onsuccess(xmlhttp.responseText);
                //document.getElementById("ZanNum").innerHTML = xmlhttp.responseText;
            }
            else {
                alert("AJAX服务器返回错误!");
            }
        }
    }
    //不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!!
    xmlhttp.send(); //这时才开始发送请求
    //发出请求后不等服务器返回数据,就继续向下执行,所以不会阻塞,界面就不卡了,这就是AJAX中“A”的含义“异步”。试着在ashx加一句Thread.Sleep(3000);
}

     B, CommnetByAJAX.html页面添加对ajax的引用 并 实现点击 “踩”的时候显示次数

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn‘t work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <script src="js/ajax.js"></script>

    <script type="text/javascript">

        function AddZan() {
            var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(‘Microsoft.XMLHTTP‘); //创建XMLHTTP对象,考虑兼容性
            xmlhttp.open("POST", "ZanCaiCount.ashx?" + "Action=Zan", true); //“准备”向服务器的ZanCaiCount.ashx发出Post请求(GET可能会有缓存问题)。这里还没有发出请求

            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4) //readyState == 4 表示服务器返回完成数据了。之前可能会经历2(请求已发送,正在处理中)、3(响应中已有部分数据可用了,但是服务器还没有完成响应的生成)
                {
                    if (xmlhttp.status == 200) //如果状态码为200则是成功
                    {
                        document.getElementById("ZanNum").innerHTML = xmlhttp.responseText;
                    }
                    else {
                        alert("AJAX服务器返回错误!");
                    }
                }
            }
            //不要以为if (xmlhttp.readyState == 4) {在send之前执行!!!!
            xmlhttp.send(); //这时才开始发送请求
            //发出请求后不等服务器返回数据,就继续向下执行,所以不会阻塞,界面就不卡了,这就是AJAX中“A”的含义“异步”。试着在ashx加一句Thread.Sleep(3000);
        }

        function AddCai() {
            ajax("ZanCaiCount.ashx?action=Cai", function (result) { document.getElementById("CaiNum").innerHTML = result })
        }
    </script>
</head>
<body>

    <form action="CountComments.ashx" method="post">
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-5">
                <video src="./Surface%20Pro%203.mp4" autoplay="autoplay" width="320" height="240" controls="controls" />
            </div>
            <div class="col-md-6"></div>

        </div>
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-1">
                <input type="button" name="Zan" value="赞" onclick="AddZan()" /><label id="ZanNum"></label>
            </div>
            <div class="col-md-1">
                <input type="button" name="Cai" value="踩" onclick="AddCai()" /><label id="CaiNum"></label>
            </div>
            <div class="col-md-9"></div>
        </div>
    </form>

    <!-- jQuery (necessary for Bootstrap‘s JavaScript plugins) -->
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>

</body>

  点赞点踩效果如下

  

 5, AJAX的经常用在网站新用户注册的时候,检查用户名称是否存在。

   

  步骤: A, 添加新用户注册页面,页面中用户名文本框中添加onbluer()事件,鼠标焦点离开以后触发检查用户民是否存在

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>新用户注册</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn‘t work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="http://cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="http://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <script src="js/ajax.js"></script>
    <script type="text/javascript">
        function checkIfExist() {
            ajax("RegCheckNewUserName.ashx?NewName=" + document.getElementById("NewName").value, function (result) { document.getElementById(ReminderInfo.innerHTML = result) });
        }
    </script>
</head>
<body>
    <form method="post">
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-1">用户名:</div>
            <div class="col-md-2">
                <input type="text" id="NewName" name="NewUserName" onblur="checkIfExist()" />
            </div>
            <div class="col-md-4">
                <label id="ReminderInfo"></label>
            </div>
            <div class="col-md-3"></div>
        </div>
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-1">密码:</div>
            <div class="col-md-2">
                <input type="password" name="pwd" />
            </div>
            <div class="col-md-8"></div>
        </div>
        <div class="row">
            <div class="col-md-1"></div>
            <div class="col-md-1">
                <input type="submit" name="btnRegister" value="注册" />
            </div>
            <div class="col-md-10"></div>
        </div>
    </form>
    <!-- jQuery (necessary for Bootstrap‘s JavaScript plugins) -->
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
</body>
</html>

      B, 添加检查用户名称是否存在的一般处理程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AjaxDemo
{
    /// <summary>
    /// RegCheckNewUserName 的摘要说明
    /// </summary>
    public class RegCheckNewUserName : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            //检查传递过来的参数是否存在
            //新建数组存储部分用户名
            List<string> strExist = new List<string> { "橙子", "柚子", "西瓜", "荔枝", "苹果", "葡萄", "火龙果" };

            if (string.IsNullOrEmpty(context.Request["NewName"]))
            {
                context.Response.Write("用户名为空哦,请您填写用户名");
            }
            else
            {
                string strUserName = context.Request["NewName"].ToString();
                if (strExist.Contains(strUserName))
                {
                    //已经存在
                    context.Response.Write("用户名已存在,请重新选择用户名");
                }
                else
                {
                    context.Response.Write("恭喜您,此用户名可以注册");
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

 6, 以上我们借助AJAX进行简单的数据传输,但是我们还会有一些复杂的数据请求需要借助AJAX完成。

  例如,输入员工工号以后,通过AJAX请求出来该工号对应的基本信息(姓名、性别、年龄、邮箱、电话号码、户籍、爱好等)

  这样,我们请求页面传递工号参数,AJAX请求的一般处理程序页面读取相关数据以后返回,这些数据就需要一定的格式给请求页面以方便请求页面解析读取各个字段属性,这样的解析我们借助Json就会更加方便了。

7,Json,是一种轻量级的数据交换格式,方便机器进行解析和生成,同时让人们很容易的阅读和编写。Json是几乎被所有的语言支持的。

  我们新建一般处理程序,输出一个数组对象,看看Json输出的格式是怎样的:

  步骤:A, 新建Person类 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AjaxDemo
{
    public class Person
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Gender { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }
}

     B, 添加JsonOutPut.ashx一般处理程序,程序中我们借助JavascriptSerializer把Person数组对象以Json格式输出

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;

namespace AjaxDemo
{
    /// <summary>
    /// JsonOutput 的摘要说明
    /// </summary>
    public class JsonOutput : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";

            //定义Person对象的数组
            List<Person> perList = new List<Person>();
            perList.Add(new Person() { Name = "橙子", Age = "18", Gender = "M", Email = "[email protected]", Address = "上海" });
            perList.Add(new Person() { Name = "苹果", Age = "17", Gender = "F", Email = "[email protected]", Address = "北京" });
            perList.Add(new Person() { Name = "椰子", Age = "20", Gender = "F", Email = "[email protected]", Address = "广州" });

            //以Json格式字符串把 perList进行输出
            //------1,初始化一个JavaScriptSerializer对象
            JavaScriptSerializer jss = new JavaScriptSerializer();
            //------2,获得一个对象的Json格式
            string JsonList = jss.Serialize(perList);

            context.Response.Write(JsonList);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

     C, Json格式输出,这样的字符串格式就很清晰明了,方便读取

 8,上面返回的Json字符串,在HTML页面中我们怎么去解析呢 ?也就是咋么去读取Name或者Age属性呢 ?

  HTMl页面中就需要借助Json.Parse把Json字符串解析成对象 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="js/ajax.js"></script>

    <script type="text/javascript">
        function readjsonlist() {
            ajax("JsonOutput.ashx", function (result) {
                var pers = JSON.parse(result);
                for (var i = 0; i < pers.length; i++) {
                    var p = pers[i];
                    alert("姓名:" + p.Name + "年龄:" + p.Age);
                }
            });

        }
    </script>
</head>
<body>
    <input type="button" onclick="readjsonlist()" value="点击查看数组对象" />
</body>
</html>

 

<script src="js/ajax.js"></script>

    <script type="text/javascript">
        function readjsonlist() {
            ajax("JsonOutput.ashx", function (result) {
                var pers = JSON.parse(result);
                for (var i = 0; i < pers.length; i++) {
                    var p = pers[i];
                    alert("姓名:" + p.Name + "年龄:" + p.Age);
                }
            });

        }
    </script>

  

  

参考网站:Bootstrap  http://www.bootcss.com/

完整Demo下载

     

时间: 2024-10-29 01:57:51

初识--Ajax & Json的相关文章

Django补充及初识Ajax

Django创建一对多表结构 首先现在models.py中写如下代码: from django.db import models # Create your models here. class Business(models.Model): caption = models.CharField(max_length=32) class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.C

032.Ajax+Json+Jquery

AjjA: AjaxJ: JSONJ: jQuery -----------------------------------------------JSONJavascript Object NotationJS对象标记 class User{ public int Id{get;set;} public string Name{get;set;} public string Phone{get;set;} // public string HomeAddress{get;set;} // pu

struts2 + ajax + json的结合使用,实例讲解

struts2用response怎么将json值返回到页面javascript解析,这里介绍一个struts2与json整合后包的用法. 1.准备工作 ①ajax使用Jquery:jquery-1.4.2.min.js ②struts2与json的依赖包:struts2-json-plugin-2.2.3.jar PS:版本可自己控制!~ 2.过程 ①引入json依赖包 ②编写action类 ③配置struts.xml ④编写页面 ⑤测试 3.实例 ① action类,JsonAction  注

JFreeChart与AJAX+JSON+ECharts两种处理方式生成热词统计可视化图表

本篇的思想:对HDFS获取的数据进行两种不同的可视化图表处理方式.第一种JFreeChar可视化处理生成图片文件查看.第二种AJAX+JSON+ECharts实现可视化图表,并呈现于浏览器上.   对此,给出代码示例,通过网络爬虫技术,将上传到HDFS的新浪网新闻信息实现热词统计功能,通过图表的柱状图来显示出来. ------> 目录: 1.JFreeChart可视化处理(生成本地图片) [1]HDFS文件读取 [2]JDFreeChart库应用 2.AJAX+JSON+EChart生成可视化图

echarts3+ajax+json+SpringMVC+mybatis

最近使用的东西有点多,就不分开描述了,写在一起,也比较连贯 最近在写统计查询,所以用到了echarts3,用了几个小时看了下,还是不错的,主要准备好字符串,直接嵌入就可以 下面我描述下需求,这样在看代码还能有一些针对性 需求:实现对访问记录的统计,每天一个访问记录表,需要根据时间段进行查询(这里面就设计到联调查询),同时,在页面点击某一天的数据时,需要显示这一天每个时段的访问人数(这里面就有点意思了,用到了ajax+json) 好,先附一张截图 这就是最后显示的样子,下面来点实惠的,上代码~ 我

Spring 接收转换 jquery ajax json数组字符串

1.ajax发送json字符串 </pre><p>组建对象</p><p></p><pre code_snippet_id="449843" snippet_file_name="blog_20140813_2_7927326" name="code" class="javascript">var student = new Object(); studen

Highcharts+Ajax+Json+Sturts2实现的图形异步实时刷新的一个简单demo

原文:Highcharts+Ajax+Json+Sturts2实现的图形异步实时刷新的一个简单demo 源代码下载地址:http://www.zuidaima.com/share/1550463370480640.htm 此功能可以用在后端对数据的实时抓取,前端动态更新时使用,可以根据数据的变化进行实时刷新,基于之前我上传的一个图形demo改制.如有意见建议,疑问,大家可以留言一起探讨. 源代码截图:

ajax+json模态框中分页(spring+struts+mybatis+easyui分页插件)

0.业务需求: 点击每个数字的时候可以显示每个对应的详细记录.也就是得点击11的时候拿着开采部与C级去查询. 1.页面中的模态框与分页组件(注意:需要隐藏一个页号,点击分页插件的时候给隐藏的页号赋值,ajax再次请求的时候取页面的页号值) <!-- 隐藏查询条件的页号 --> <input type="hidden" name="currentPage" id="currentPage"> <!-- 模态框 统计详细

ajax json 表格排序,分页,自定义每页数量

ajax json 表格排序,分页,自定义每页数量 点击表头可以排序,按照升序或者降序,另外支持多列排序 设置每页数量 演示 XML/HTML Code <table id='example3'> <thead> <tr> <th>ID</th> <th>First name</th> <th>Last name</th> <th>Grade</th> <th>G