zoukankan      html  css  js  c++  java
  • 原生ajax

    1、ajax是什么?
    *asynchronous javascript and xml:异步的js和xml
    *它能使用js访问服务器,而且是异步访问!
    *服务器给客户端的响应一般是整个页面,一个html完整页面!但是在ajax中因为是局部刷新,那么服务器就不用再响应整个页面!而只是数据。
    >text:纯文本
    >xml:还可以
    >json:它是js提供的数据交互格式,它在ajax中最受欢迎
    2、异步交互和同步交互
    *同步
    >发一个请求,就要等待服务器的响应结束,然后才能发第二个请求!中间的这段时间就是一个字“卡”
    >刷新的是整个页面
    *异步
    >发一个请求后,无需等待服务器的响应,然后就可以发第二个请求!
    >可以使用js来接受服务器的响应,然后使用js来局部刷新!

    3、ajax的应用场景
    *百度的搜索框
    *校验用户名是否被注册

    4、ajax的优缺点
    优点:
    *异步交互:增强了用户的体验!
    *性能:因为服务器无需再响应整个页面,只需要响应部分内容,所以服务器的压力减轻了
    缺点:
    *ajax 不能应用在所有场景
    *ajax无端地增多了对服务器的访问次数,给服务器带来了压力

    5、ajax发送异步请求(四步操作)
    1、第一步(得到XMLHttpRequest)
    *ajax其实只需要学习一个对象:XMLHttpRequest:如果掌握了它,就掌握了ajax
    *得到XMLHttpRequest
    >大多数浏览器都支持: var xmlHttp=new XMLHttpRequest();
    >IE6.0: var xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    >IE5.5以更早版本的IE:var xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

    *编写创建XMLHttpRequest对象的函数 我原来的方式是获取浏览器版本,现在发现好像这种使用异常的方式真取巧,还显得有点专业!
    function createXMLHttpRequest(){
    try{
    return new XMLHttpRequest();
    }catch(e){
    try{
    return new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
    try{
    return new ActiveXObject("Microsoft.XMLHTTP")
    }catch(e){
    alert("哥们,你用的什么浏览器啊!")
    throw e;
    }
    }
    }
    }

    2.第二步(打开与服务器的连接)
    *xmlHttp.open():用来打开与服务器的连接,它需要三个参数:
    >请求的方式:可以是GET或POST
    >请求的URL:指定服务器端资源,例如/8-8-9/AServlet
    >请求是否异步:如果为true表示发送异步请求,否则同步请求!
    *xmlHttp.open("GET","/8-8-9/AServlet",true);

    3、第三步(发送请求)
    *xmlHttp.send(null):如果不给可能会造成部分浏览器无法发送!
    >参数:就是请求内容!如果是Get请求,必须给出null。post请求例如这种模样:xmlHttp.send(username=zhangSan&password=123)

    4、第四部()
    *在xmlHttp对象的一个事件上注册监听器:onreadystatechange
    *xmlHttp对象一共有5个状态:
    0:刚创建还没有调用open()方法
    1:请求开始,调用了open()方法,但还没有调用send()方法
    2:调用完了send()方法了
    3:服务器已经开始响应,但不表示响应结束了!
    4:服务器响应结束!(通常我们只关心最后这个状态!!!)
    *得到xmlHttp对象的状态
    >var state=xmlHttp.readyState;//可能是0、1、2、3、4
    *得到服务器的响应的状态码
    >var status=xmlHttp.status;//例如为200、404、500
    *得到服务器响应的内容
    >var content=xmlHttp.responseText;//得到服务器的响应的文本内容
    >var content=xmlHttp.responseXML;//得到服务器响应的xml响应的内容,它是Document对象了

    xmlHttp.onreadystatechange=function(){//当xmlHttp的状态变化,5种状态都会调用本方法
    if(xmlHttp.readyState==4 && xmlHttp.readyState==200){//双重判断,判断是否为4状态而且是否为200
    var text=xmlHttp.responseText;//得到响应的文本内容
    }
    }

    例子:

    使用get方式的demo:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'ajax1.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
        <script type="text/javascript">
            window.onload=function(){
                var btn=document.getElementById("btn");
                btn.onclick=function(){
                    /*
                    ajax四步操作,得到服务器响应,把响应结果显示到h1元素中
                    */
                    /* 1、得到异步对象 */
                    var xmlHttp=createXMLHttpRequest();
                    /* 2、打开与服务器的连接 */
                    /* 指定请求方式
                     * 指定请求的url
                     *指定是否为异步请求
                     *
                     *这里使用jstl标签给出的解释是:jsp其实展示的是html,也就是说其实脚本是写在html内的,tomcat服务器先将jsp转换成servlet,一些元素变成html代码,里面的标签就会先变成代码,所以我们发送的url不是现在显示的标签字符串
                    */
                    xmlHttp.open("GET","<c:url value='/AServlet' />",true);
                    /* 3、发送请求 */
                    xmlHttp.send(null);//get请求没有请求体也要给出null,否则firefox可能出现问题
                    /*4、给异步对象添加监听*/
                    xmlHttp.onreadystatechange=function(){
                        if(xmlHttp.readyState==4 && xmlHttp.status==200){
                            //获取服务器的响应结果
                            var text=xmlHttp.responseText;
                            
                            var h1=document.getElementById("h1");
                            h1.innerHTML=text;
                        }
                    }
                };
            };
            
            function createXMLHttpRequest(){
                try{
                    return new XMLHttpRequest();
                }catch(e){
                    try{
                        return new ActiveXObject("Msxml2.XMLHTTP");//IE6.0
                    }catch(e){
                        try{
                            return new ActiveXObject("Microsoft.XMLHTTP");//IE5.5以及更早版本
                        }catch(e){
                            alert("哥们,你用的什么浏览器啊!");
                            throw e;
                        }
                    }
                }
            }
        </script>
      </head>
      
      <body>
        <button id="btn">点击这里</button>
        <h1 id="h1"></h1>
      </body>
    </html>
    View Code

    post方式与get方式基本一致,多了设置一个头文件,还有在send()这一栏发送参数:

    <script type="text/javascript">
            window.onload=function(){
                var btn=document.getElementById("btn");
                btn.onclick=function(){
                    /*
                    ajax四步操作,得到服务器响应,把响应结果显示到h1元素中
                    */
                    /* 1、得到异步对象 */
                    var xmlHttp=createXMLHttpRequest();
                    /* 2、打开与服务器的连接 */
                    /* 指定请求方式
                     * 指定请求的url
                     *指定是否为异步请求
                     *
                     *这里使用jstl标签给出的解释是:jsp其实展示的是html,也就是说其实脚本是写在html内的,tomcat服务器先将jsp转换成servlet,一些元素变成html代码,里面的标签就会先变成代码,所以我们发送的url不是现在显示的标签字符串
                    */
                    /**** 修改open方法,指定请求方式为post  ***/
                    xmlHttp.open("POST","<c:url value='/AServlet' />",true);
                    /***** 设置请求头 ***********/
                    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                    /* 3、发送请求 */
                    xmlHttp.send("username=张三");//get请求没有请求体也要给出null,否则firefox可能出现问题
                    /*4、给异步对象添加监听*/
                    xmlHttp.onreadystatechange=function(){
                        if(xmlHttp.readyState==4 && xmlHttp.status==200){
                            //获取服务器的响应结果
                            var text=xmlHttp.responseText;
                            
                            var h1=document.getElementById("h1");
                            h1.innerHTML=text;
                        }
                    }
                };
            };
            
            function createXMLHttpRequest(){
                try{
                    return new XMLHttpRequest();
                }catch(e){
                    try{
                        return new ActiveXObject("Msxml2.XMLHTTP");//IE6.0
                    }catch(e){
                        try{
                            return new ActiveXObject("Microsoft.XMLHTTP");//IE5.5以及更早版本
                        }catch(e){
                            alert("哥们,你用的什么浏览器啊!");
                            throw e;
                        }
                    }
                }
            }
        </script>
    View Code

    简单的验证用户是否被注册:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'ajax3.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        
        <script type="text/javascript">
            window.onload=function(){
                var uname=document.getElementsByName("username")[0];
                
                uname.onblur=function(){
                        /* 1、获取xmlHttpRequest对象 */
                    var xmlHttp=createXMLHttpRequest();
                    /* 2.打开连接 . 三个参数:请求方式,url,是否异步 */
                    xmlHttp.open("POST","<c:url value='/ValidateUsernameServlet'/>",true);
                    
                    /* 3.传递参数 */
                    /**** Post方式需要先设置响应头 *****/
                    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                    
                    xmlHttp.send("username="+uname.value);
                    
                    /* 4.监听响应  */
                    xmlHttp.onreadystatechange=function(){
                        if(xmlHttp.readyState==4 && xmlHttp.status==200){
                            var text=xmlHttp.responseText;
                            var sp=document.getElementById("sp1");
                            if(text==1){
                                sp.innerHTML="该用户名已经被注册";
                            }else{
                                sp.innerHTML="";
                            }
                        }
                    }
                }
                
            }
            
            function createXMLHttpRequest(){
                try{
                    return new XMLHttpRequest();
                }catch(e){
                    try{
                        return new ActiveXObject("Msxml2.XMLHTTP");//IE6
                    }catch(e){
                        try{
                            return new ActiveXObject("Microsoft.XMLHTTP");//IE5.5以前
                        }catch(e){
                            alert("哥们,你这是什么浏览器啊!");
                            throw e;
                        }
                    }
                }
            }
        </script>
    
      </head>
      
      <body>
        <h1>演示用户名是否被注册</h1>
        <form action="<c:url value='/AServlet' />" method="post">
            用户名:<input type="text" name="username"/><span id="sp1"></span><br/>
            密码:<input type="password" name="pasword"/><br/>
            性别:<input type="radio" name="sex" value="nan">男&nbsp;<input type="radio" name="sex" value="nv">女<br/>
            邮箱:<input type="text" name="email"/><br/>
            <input type="submit" value="注册"/>
        </form>
      </body>
    </html>
    
    public class ValidateUsernameServlet extends HttpServlet {
        
        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("utf-8");
            request.setCharacterEncoding("utf-8");
            
            String username=request.getParameter("username");
            if(username.equals("itcast")){
                response.getWriter().print(1);
            }else{
                response.getWriter().print(0);
            }
        }
    
    }
    View Code

    返回的是XML的例子:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'ajax1.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
        <script type="text/javascript">
            window.onload=function(){
                var btn=document.getElementById("btn");
                btn.onclick=function(){
                    /*
                    ajax四步操作,得到服务器响应,把响应结果显示到h1元素中
                    */
                    /* 1、得到异步对象 */
                    var xmlHttp=createXMLHttpRequest();
                    /* 2、打开与服务器的连接 */
                    /* 指定请求方式
                     * 指定请求的url
                     *指定是否为异步请求
                     *
                     *这里使用jstl标签给出的解释是:jsp其实展示的是html,也就是说其实脚本是写在html内的,tomcat服务器先将jsp转换成servlet,一些元素变成html代码,里面的标签就会先变成代码,所以我们发送的url不是现在显示的标签字符串
                    */
                    xmlHttp.open("GET","<c:url value='/BServlet' />",true);
                    /* 3、发送请求 */
                    xmlHttp.send(null);//get请求没有请求体也要给出null,否则firefox可能出现问题
                    /*4、给异步对象添加监听*/
                    xmlHttp.onreadystatechange=function(){
                        if(xmlHttp.readyState==4 && xmlHttp.status==200){
                            //获取服务器的响应结果
                            var doc=xmlHttp.responseXML;
                            //查询文档下名为student的所有元素,得到数据
                            
                            var eleArr=doc.getElementsByTagName("student")[0];
                            var number=eleArr.getAttribute("number");
                            /*
                            var number=eleArr.getAttribute("number");
                            var name=eleArr.getElementsByTagName("name")[0].innerHTML;//IE支持
                            var age=eleArr.getElementsByTagName("age")[0].innerHTML;//IE支持
                            */
                            /*
                            var name=eleArr.getElementsByTagName("name")[0].text;//IE支持,谷歌得到的是undefined
                            var age=eleArr.getElementsByTagName("age")[0].text;//IE支持
                            */
                            
                            var name=eleArr.getElementsByTagName("name")[0].firstChild.nodeValue;
                            var age=eleArr.getElementsByTagName("age")[0].firstChild.nodeValue;
                            
                            /*
                            var name=eleArr.getElementsByTagName("name")[0].textContent; //非IE
                            var age=eleArr.getElementsByTagName("age")[0].textContent;//非IE
                            */
                            
                            var text=number+", "+name+", "+age;
                            document.getElementById("h1").innerHTML=text;
                            
                        }
                    }
                };
            };
            
            function createXMLHttpRequest(){
                try{
                    return new XMLHttpRequest();
                }catch(e){
                    try{
                        return new ActiveXObject("Msxml2.XMLHTTP");//IE6.0
                    }catch(e){
                        try{
                            return new ActiveXObject("Microsoft.XMLHTTP");//IE5.5以及更早版本
                        }catch(e){
                            alert("哥们,你用的什么浏览器啊!");
                            throw e;
                        }
                    }
                }
            }
        </script>
      </head>
      
      <body>
        <button id="btn">点击这里</button>
        <h1 id="h1"></h1>
      </body>
    </html>
    
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class BServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            String xml="<students>"+
                    "<student number='ITCAST_1001'>"+
                    "<name>zhangSan</name>"+
                    "<age>18</age>"+
                    "</student>"+
                    "</students>";
            response.setContentType("text/xml;charset=utf-8");
            response.getWriter().print(xml);
        }
    }
    View Code

    级联城市菜单的例子:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'ajax5.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
    <script type="text/javascript">
       /*
        *1.在文档加载完毕时发送请求,得到所有省份名称,显示在<select name="province">中
        *2.在选择了新的省份时,删除原来的city下拉列表的第一项外所有子元素,发送请求去cityServlet,参数省份名字,根据返回来的xml给option赋值
        */    
        
        window.onload=function(){
        
            var province=document.getElementsByName("province")[0];
            var city=document.getElementsByName("city")[0];
            
            function loadProvince(){
                var xmlHttp=createXMLHttpRequest();
                xmlHttp.open("GET","<c:url value='ProvinceServlet'/>",true);
                xmlHttp.send(null);
                xmlHttp.onreadystatechange=function(){
                    if(xmlHttp.readyState==4 && xmlHttp.status==200){
                        var text=xmlHttp.responseText;
                        var pArr=text.split(",");
                        
                        for(var i=0;i<pArr.length;i++){
                            var eleNode=document.createElement("option");
                            var ele_text =document.createTextNode(pArr[i]); /* 下拉列表的value属性可以不设置,默认是下拉列表选项内容的文本值  */
                             eleNode.appendChild(ele_text);
                            province.appendChild(eleNode);
                        }
                    }
                };
            }
            loadProvince();
            
            province.onchange=function(){
            
                // 获取其所有子元素
                var optionEleList = city.getElementsByTagName("option");
                // 循环遍历每个option元素,然后在citySelect中移除
                while(optionEleList.length > 1) {//子元素的个数如果大于1就循环,等于1就不循环了!
                    city.removeChild(optionEleList[1]);//总是删除1下标,因为1删除了,2就变成1了!
                }
                var pv=province.value;
                if(pv=="===请选择省==="){
                    return;
                }
                var xmlHttp=createXMLHttpRequest();
                xmlHttp.open("POST","<c:url value='/CityServlet'/>",true);
                
                
                xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                xmlHttp.send("province="+pv);
                xmlHttp.onreadystatechange=function(){
                    if(xmlHttp.readyState==4 && xmlHttp.status==200){
                        var doc=xmlHttp.responseXML;
                        
                        var citys=doc.getElementsByTagName("city");
                        for(var i=0;i<citys.length;i++){
                            var str=citys[i].firstChild.nodeValue;
                            var eleNode=document.createElement("option");
                            var ele_text =document.createTextNode(str); /* 下拉列表的value属性可以不设置,默认是下拉列表选项内容的文本值  */
                             eleNode.appendChild(ele_text);
                            city.appendChild(eleNode);
                        }
                        
                    
                    }
                };
                
            };
            
            
        }
        
        function createXMLHttpRequest(){
            try{
                return new XMLHttpRequest();
            }catch(e){
                try{
                    return new ActiveXObject("Msxml2.XMLHTTP");
                }catch(e){
                    try{
                        return new ActiveXObject("Microsoft.XMLHTTP");
                    }catch(e){
                        alert("兄弟,你用的什么浏览器啊");
                        throw e;
                    }
                }
            }
        }
    </script>
      </head>
      
      <body>
       <h1>省市联动</h1>
       <select name="province">
           <option>===请选择省===</option>
       </select>&nbsp;&nbsp;&nbsp;
       <select name="city">
           <option>===请选择市===</option>
       </select>
      </body>
    </html>
    
    public class CityServlet extends HttpServlet {
        
        
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/xml;charset=utf-8");
                                     
            
            SAXReader reader=new SAXReader();
            Document document=null;
            String pro=request.getParameter("province");
            Element d = null;
            try {
                document=reader.read(this.getServletContext().getRealPath("/xml/china.xml"));
                List<Element> eles=document.getRootElement().elements("province");
                for(int i=0;i<eles.size();i++){
                    Element e=eles.get(i);
                    String str=e.attributeValue("name");
                    if(str.equals(pro)){
                        d=e;
                        break;
                    }
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            response.getWriter().print(d.asXML());
        }
    
    public class ProvinceServlet extends HttpServlet {
        
        
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("utf-8");
            
            SAXReader reader=new SAXReader();
            Document document=null;
            StringBuffer provinces = new StringBuffer();
            try {
                document=reader.read(this.getServletContext().getRealPath("/xml/china.xml"));
                List<Element> eles=document.getRootElement().elements("province");
                for(int i=0;i<eles.size();i++){
                    Element e=eles.get(i);
                    String str=e.attributeValue("name");
                    if(i==0){
                        provinces.append(str);
                    }else{
                        provinces.append(","+str);
                    }
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
            response.getWriter().print(provinces.toString());
        }
        
        
    }
    View Code
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5759717.html
Copyright © 2011-2022 走看看