Ajax原理及简介

 我知道Ajax是google的 google map应该,我们都知道,b/s架构跟c/s架构的区别。所谓的C/S架构其实就是我们常说的胖客户端,需要我们将程序部署到各个客户端上,费时,费力,容易出错,但是也有好处,就是响应能力强,典型的又QQ之类的程序,那B/S架构呢?也就是通俗的网站,程序部署在服务器上,我们通过浏览器浏览内容,B/S是基于HTTP的协议,而HTTP协议的典型特征就是无状态,什么是无状态,就是客户端不能记住我们操作的状态,或者数据。举一个最简单的例子。

<body>
    <form id="form1" runat="server">
    <div>
    <asp:TextBox ID="Mytext" runat="server"></asp:TextBox>
    <asp:Button ID="MyButton" Text="Check here" runat="server" 
            onclick="MyButton_Click" />
    </div>
    </form>
</body>

这里我们有一个最简单的ASP.NET页面,所要实现的功能也是很简单的,一个文本框一个按钮,要实现的功能就是点击一个按钮,文本逛里的数字就加一。

后台代码

    public partial class WebForm1 : System.Web.UI.Page
    {
        int value = 0;
        protected void Page_Load(object sender, EventArgs e)
        {
     
        }

        protected void MyButton_Click(object sender, EventArgs e)
        {
            value++;
            this.Mytext.Text = value.ToString();
        }
    }

可是结果却是无论我怎么点击,textbox的值始终是1,但是再winfrom程序里就可以达到我们要的效果,至于原因,我会在ASP.NET的文章里解释,这里只简单的说一下,因为HTTP实际也是请求----响应,一次请求一次响应,彼此之间的请求响应是不互相联系的。那么在我们与浏览器产生交互的时候实际上是向服务器请求数据,然后服务器返回数据给我们。这里就有几个问题,就是每次我们都需要服务器的响应。如果我们想向服务器响应的只是一小部分内容而不是正个页面,这时也还是会返回整个页面,造成长时间的等待,比如验证数据。二就是每次操作都需要往返,用户的体验不好。而Ajax就是为了解决这个问题

AJAX(Asynchronous JavaScript and XML)异步Javascript和XML。先看原理图

 解释一下这幅图

  1,用户触发页面事件产生交互,调用事件处理函数

  2,事件处理函数利用ajax核心的XMLHttpRequest异步向服务器发起请求

  3,服务器响应,触发XMLHttpRequest定义的回调函数

  4,根据一系列的属性检测返回状态,如果成功执行代码,如果不成功提示用户

 这跟正常的请求响应方式有所不同,但是也不是那么难理解,其实就是整个请求是异步的,异步请求,然后服务器返回,我们处理代码。

   那么我们刚刚看到了基本原理,也看了AJAX的核心其实就是XMLHttpRequest。现在就介绍一些这个对象,然后看看这个对象怎么使用,这里介绍的例子都是只返回纯文本格式,其实服务器返回的内容的格式可以是XML,也可以是JSON。这里为了简单,返回的都是纯文本。服务器技术为ASP.NET。

   XMLHttpRequest最早是在IE5中引进的,但是各个浏览器所实现的标准不一样,所以我们在创建的时候要注意,我在Javascript的文章中有写到怎么检测浏览器,可以参考。这里我们采用的是对象/特性检测法

 

        var xmlHttp;

        function CreateXMLHttpRequest() {
            if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
            xmlHttp = new XMLHttpRequest();
            }
        }

这里我们创建的是一个全局的变量,也可以使这个函数返回值来创建一个局部变量。

下面来看看XMLHttpRequest对象的一些属性

onreadystatechange    //这是一个很重要的属性,即XMLHttpRequest的每个状态改变时都会触发这个事件,即如果我们异步的发送一个请求,请求回来就是改变状态。通常会有一个事件处理函数。

readyState     //这个属性同样重要,请求的状态。0=未初始化,1=正在加载,2=已加载,3=交互中,4=完成,我们根据状态做不同的操作

responseText   //服务器的响应,表示为一个串

responseXML   //服务器的响应,表示为XML。这个对象可以解析为一个DOM对象。

statusText  //http状态码的相应文本(OK或NotFound:404)

XMLHttpRequest的一些方法

abort()   //停止当前请求

getAllResponseHeaders()   //把HTTP请求的所有响应首部作为键值对返回

getResponseHeader("header")  //返回指定首部的串值

open("method","url")   //建立对服务器的调用。methed参数可以的get,post或put。url参数可以是相对url或绝对url,这个方法还包含3个可选参数。

send(content)  //向服务器发送请求

setRequestHeader("header","value")  //把指定首部设置为所提供的值。在任何设置首部之前必须先调用open().

open方法的完整参数open("method","url","asynch","username","password"),asynch指示是否是异步,默认为true。后面可以指定一个用户名和密码

我们要注意的是Contect-Type的类型和是否缓存结果,要是不想缓存结果可以设置成response.setHeader("Cache—Control","no-cache");或者response.setHeader("pragma","no-cache");

Get和Post的区别

get和post的区别

1 get是从服务器获取数据,而post则是向服务器提交数据

2 get请求的数据会明文的附在在url后,以?的形式分割,而post则是把数据附在HTTP包的包体中

3 根据第二点,post比get安全性高

4 IE会对URL长度限制,即get的长度限制(2083字节),而Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。

get和post的区别参考于http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html,如想了解更多信息,请参考以上连接。

 

简单的AJAX示例

这个示例非常简单,一个文本框,一个按钮。点击按钮,文本框显示服务器端返回的“Hello World”

首先我们定义一个函数,这个函数的作用就是实例化一个XMLHttpRequest,我们之前定义过

 

        var xmlHttp;

        function CreateXMLHttpRequest() {
            if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
            xmlHttp = new XMLHttpRequest();
            }
        }

然后我们定义另外一个函数,这个函数用于异步向服务器发送请求

        function startRequest() {
            CreateXMLHttpRequest();
            var url = "HelloWorld.ashx";
            xmlHttp.onreadystatechange = handleStateChange
            xmlHttp.open("GET", url.toString());
            xmlHttp.send(null);
        }

我们这里的服务端使用的是一般处理程序,ASP.NET还可以使用WebService和后置代码,这个以后再讲

然后我们就可以定义回调函数了

        function handleStateChange() {
          if(xmlHttp.readyState==4)
          {
              if (xmlHttp.Status == 200) {
                  var otext = document.getElementById("MyText");
                  otext.value = xmlHttp.responseText;
              }
          }
        }

html代码

<body>
    <form id="form1" runat="server">
    <div>
    <input type="text" id="MyText" />
    <input type="button" id="MyButton" value="Check me" onclick="startRequest()"/>
    </div>
    </form>
</body>

HelloWorld.ashx代码

    public class HelloWorld : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

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

点击按钮,文本框显示HelloWorld。在这里HelloWorld字符串太短,这个过程我们看不清楚,那我们就返回比较长的字符串来看看效果,我们只需要改动HelloWorld.ashx代码

    public class HelloWorld : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string s = "";
            context.Response.ContentType = "text/plain";
            for (int i = 0; i < 9000000; i++)
            {
                s = i.ToString();
            }
            context.Response.Write("Complete!");
        }

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

执行循环来延迟服务器响应时间。这时我们就可以看到异步的详细了。我们还可以添加一些东西来完善,比如我们经常看到的loading...

需要改动的只是HTML文件  

完整代码如下

<head runat="server">
    <title></title>
    <script type="text/javascript">
        var xmlHttp;

        function CreateXMLHttpRequest() {
            if (window.ActiveXObject) {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } else {
            xmlHttp = new XMLHttpRequest();
            }
        }

        function startRequest() {
            CreateXMLHttpRequest();
            var url = "HelloWorld.ashx";
            xmlHttp.onreadystatechange = handleStateChange
            xmlHttp.open("GET", url.toString());
            xmlHttp.send(null);
        }

        function handleStateChange() {
            if (xmlHttp.readyState == 1) {
                var oimage = document.getElementById("MyImg");
                oimage.style.display = "";
         }

          if(xmlHttp.readyState==4)
          {
              if (xmlHttp.Status == 200) {
                  var oimage = document.getElementById("MyImg");
                  oimage.style.display = "none";
                  var otext = document.getElementById("MyText");
                  otext.value = xmlHttp.responseText;
              }
          }
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <input type="text" id="MyText" />
    <input type="button" id="MyButton" value="Check me" onclick="startRequest()"/>
    <img id="MyImg" alt="" src="Image/loading.gif" style="display:none" />
    </div>
    </form>
</body>

当XMLHttpRequest的状态为正在加载时显示loading的图片,完成时隐藏。你还可以设置loading图片的CSS,自定义图片,总之是任何你想要的样式。

基本的AJAX这里就介绍完了,下面要介绍的就是在ASP.NET中怎么异步访问WebService和后台代码。然后还有怎么传输复杂格式如json.  

posted @ 2011-10-31 15:52  刘中栋  阅读(670)  评论(0编辑  收藏  举报