• 原生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
  • 相关阅读:
    nrm安装与使用
    10、ReactJs基础知识10--组件组合 vs 继承
    9、ReactJs基础知识09--状态提升
    8、ReactJs基础知识08--表单
    7、ReactJs基础知识07--列表渲染 & Key
    6、ReactJs基础知识06--条件渲染
    5、ReactJs基础知识05--事件处理
    L2-030 冰岛人 (25分)
    进阶实验5-3.4 迷你搜索引擎 (35分)
    进阶实验2-3.4 素因子分解 (20分)
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5759717.html
Copyright © 2020-2023  润新知