• 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.  

  • 相关阅读:
    FirstThunk
    FirstThunk
    输入地址表(IAT)
    PE文件讲解
    PE格式详细讲解
    pe结构讲解
    PE格式详细讲解
    输入地址表(IAT)
    pe结构讲解
    zindex可以使用负值
  • 原文地址:https://www.cnblogs.com/ColeLiu/p/2230357.html
Copyright © 2020-2023  润新知