zoukankan      html  css  js  c++  java
  • AjaxDay1

    1.Ajax

    Ajax(Asynchronous JavaScript And XML)异步的JavaScript(编程语言)和XML(文件格式)。

    AJAX不是一门新的编程语言,是多门语言与已有技术组合后创新产生的技术。

    核心点:

      核心编程语言是JS

      数据交换的工具是XML(现在已经被JSON替代)

      AJAX是一种异步请求方式

    2同步请求与异步请求

    使用Ajax需要先在页面导入相应的js文件

    <!--引入jquery和MyAjax文件-->
    <script type="text/javascript" src="${pageContext.request.contextPath}js/jquery-1.12.4.js"></script>
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/MyAjax.js"></script>

    MyAjax.js

    function myAJax(url,data,type,success){
    // 1. 创建xhr对象
        var xhr;
        try{
            xhr= new XMLHttpRequest();
        }catch(e){
            try{
                xhr = new ActiveXObject("Msxml2.XMLHTTP");
            }catch(e){
                try{
                    xhr = new ActiveXObject("Microsoft.XMLHTTP");
                }catch(e){
                    alert("您的浏览器不支持AJAX,请更换!");
                    return false;
                }
            }
        }
    // 2. 发起请求
    // 2.1 设置请求方式和请求地址
    // 2.2 发送数据
        if(type.toUpperCase() == "GET"){
            xhr.open("get",url+"?"+data);
            xhr.send();
        }else{
            xhr.open("post",url);
            //post方式必须设置Content-Type请求头,必须在open和send方法之前设置
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xhr.send(data);
        }
    
    // 3. 监听响应
        xhr.onreadystatechange= function(){
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    //xhr.responseText;//获取响应的字符串
                    //通过dom操作,将结果显示到页面
                    //不同情况下,对于 结果字符串 的处理的代码是不同的
                    success(xhr.responseText);
    
                }else{
                    console.log(xhr.responseText);//获取到异常信息
                }
            }
        };
    }

    2 同步请求和异步请求

    2.1 同步请求

    浏览器发起的传统请求(表单、超链接、地址栏、location.href),都是同步请求。

    用户从发起请求开始,到服务端响应结果完毕,这段时间内不能再操作页面。如果服务端响应结果耗时很长,用户在这段时间一直等待,用户体验很差。

    同步请求的特点:

    • 一定刷新页面

    • 地址栏一定改变

    • 发起同步请求,会阻塞用户的其它操作

    2.2 异步请求

    AJAX是一种浏览器端的异步请求技术。

    AJAX请求,服务端响应回不是一个完整页面,而是字符串(页面局部),不会刷新页面。

    用户在JS发起请求开始,到服务端响应结果完毕,不用等待。用户可以一直操作页面,用户体验好。

    异步请求的特点:

    • 不刷新页面

    • 地址栏不改变

    • 异步请求不会阻塞用户的其它操作

    3 AJAX开发思路

    AJAX技术核心对象是XMLHttpRequest对象,JS通过它和服务端建立连接,交换数据。

    4 实战案例:校验用户名是否存在

    4.1 同步方式

    4.2 异步方式

     

    asynchronousCheckUsername.jsp:

    <html>
    <head>
        <title>异步请求</title>
    </head>
    <body>
    <form action="">
        用户名: <input type="text" name="username" id=""> <span id="usernameSpan"></span><br>
        <input type="button" value="校验">
    </form>
    <!--引入jquery.js -->
    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.1.js"></script>
    <script type="text/javascript">
        //通过jquery绑定事件
        $(function(){
            //进行事件绑定,保证一定在页面加载完毕时执行
            $("input:button").click(function(){
                //alert("单击了");
                //通过ajax发起用户名的校验请求
                // 获取到用户名
                var usernameVal = $("input[name='username']").val();
    
                // 1. 创建xhr对象
                var xhr;
                try{
                    xhr= new XMLHttpRequest();
                }catch(e){
                    try{
                        xhr = new ActiveXObject("Msxml2.XMLHTTP");
                    }catch(e){
                        try{
                            xhr = new ActiveXObject("Microsoft.XMLHTTP");
                        }catch(e){
                            alert("您的浏览器不支持AJAX,请更换!");
                            return false;
                        }
                    }
                }
                // 2. 发起请求
                // 2.1 设置请求方式和请求地址
                xhr.open("get","${pageContext.request.contextPath}/user/asynchronousCheckUsername?username="+usernameVal);
    
                // 2.2 发送数据
                xhr.send();
    
    
    
    
    
                // 3. 监听响应
               /* xhr.readyState
                属性值:0  刚新建xhr,没有open()
                1  xhr调用send(),建立连接
                2  开始接收到响应
                3  正在处理接收的数据
                4  接收处理数据完毕*/
               /* xhr.onreadystatechange
                事件:在readyState属性改变时触发*/
    
    
                xhr.onreadystatechange= function(){
                    if(xhr.readyState == 4){
                        //获取到服务端响应的数据
                        //xhr.status 表示HTTP状态码
                        /*200 表示成功
                        302 表示重定向
                        404 资源找不到
                        500 服务器内部异常*/
                        if(xhr.status == 200){
                            //xhr.responseText;//获取响应的字符串
                            //通过dom操作,将结果显示到页面
                            $("#usernameSpan").html(xhr.responseText);
                        }else{
                            console.log(xhr.responseText);//获取到异常信息
                        }
                    }
                };
    
            });
        })
    </script>
    </body>
    </html>

    AsynchronousCheckUsernameAction.java

    public class AsynchronousCheckUsernameAction {
        private String username;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String check() throws InterruptedException, IOException {
            //校验
            //根据结果跳转
            // 调用业务层的校验方法
            //通过线程休眠,模拟耗时操作
            Thread.sleep(5000);
            //通过流响应结果
            HttpServletResponse response = ServletActionContext.getResponse();
            response.setCharacterEncoding("utf-8");
            PrintWriter pw = response.getWriter();
            if("xushy".equals(username)){
                pw.print("用户名已存在");
            }else{
                pw.print("用户名可以使用");
            }
            pw.flush();
            //不再跳转
            return null;
        }
    
    }

    5 AJAX发送post请求

    1. 创建xhr对象
    var xhr = new XMLHttpRequest();
    2. 发起请求
       2.1 设置请求方式和请求地址
       xhr.open("post",url);
        //设置请求头
        xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
       2.2 发送数据
       xhr.send(data);//data: key=value的数据
    
    3. 监听响应
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                //请求正确,通过xhr.responseText获取结果字符串
            }else{
                //通过xhr.responseText获取异常信息
            }
        }
    }

    6 封装AJAX函数

    function myAJax(url,data,type,success){
    // 1. 创建xhr对象
            var xhr;
            try{
                xhr= new XMLHttpRequest();
            }catch(e){
                try{
                    xhr = new ActiveXObject("Msxml2.XMLHTTP");
                }catch(e){
                    try{
                        xhr = new ActiveXObject("Microsoft.XMLHTTP");
                    }catch(e){
                        alert("您的浏览器不支持AJAX,请更换!");
                        return false;
                    }
                }
            }
    // 2. 发起请求
    // 2.1 设置请求方式和请求地址
    // 2.2 发送数据
            if(type.toUpperCase() == "GET"){
                xhr.open("get",url+"?"+data);
                xhr.send();
            }else{
                xhr.open("post",url);
                //post方式必须设置Content-Type请求头,必须在open和send方法之前设置
                xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                xhr.send(data);
            }
    
    // 3. 监听响应
            xhr.onreadystatechange= function(){
                if(xhr.readyState == 4){
                    if(xhr.status == 200){
                        //xhr.responseText;//获取响应的字符串
                        //通过dom操作,将结果显示到页面
                        //不同情况下,对于 结果字符串 的处理的代码是不同的
                        success(xhr.responseText);
    
                    }else{
                        console.log(xhr.responseText);//获取到异常信息
                    }
                }
            };
        }

    为保证myAjax在多个页面都可以重用:

    1. 定义外部js文件myajax.js

    2. 在页面通过script标签引入,并使用

      7 实战案例

      7.1 登录

      同步请求的流程:异步请求的流程:login.jsp

    3. <html>
      <head>
          <title>登录页面</title>
      </head>
      <body>
      <span id="msg" style="color:red"></span>
      <form action="${pageContext.request.contextPath}/user/login">
          用户名: <input type="text" name="username" id=""> <br>
          密码: <input type="password" name="password" id=""> <br>
          <input type="button" value="登录">
      </form>
      
      <!-- 引入jQuery和自定义的js文件-->
      <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.10.1.js"></script>
      <script type="text/javascript" src="${pageContext.request.contextPath}/js/myajax.js"></script>
      <script type="text/javascript">
          //为input:button绑定单击事件
          $(function(){//保证页面加载完毕后执行
              //绑定事件
              $("input:button").click(function(){
                  var usernameVal = $("input[name='username']").val();
                  var passwordVal = $("input[name='password']").val();
                  var url = "${pageContext.request.contextPath}/user/login";
                  var data = "username="+usernameVal+"&password="+passwordVal;
                  var type="post";
                  myAJax(url,data,type,function(result){
                      if(result == "success"){
                          //登录成功,跳转到查询所有
                          location.href="${pageContext.request.contextPath}/student/showAllStudents";
                      }else{
                          //登录失败,回显错误信息
                          $("#msg").html(result);
                      }
                  })
              })
          });
      </script>
      </body>
      </html>

      UserAction.java

      public class UserAction {
          private String username;
          private String password;
      
          public String getPassword() {
              return password;
          }
      
          public void setPassword(String password) {
              this.password = password;
          }
      
          public String getUsername() {
              return username;
          }
      
          public void setUsername(String username) {
              this.username = username;
          }
      
          public String login() throws IOException {
              //调用业务层方法
              //模拟
              HttpServletResponse response = ServletActionContext.getResponse();
              response.setCharacterEncoding("utf-8");
              PrintWriter pw = response.getWriter();
              if("xushy".equals(username) && "123456".equals(password)){
                  //登录成功
                  pw.print("success");
              }else{
                  //登录失败
                  pw.print("用户名或密码错误");
              }
              pw.flush();
              return null;
          }
      }

      7.2 回显个人信息

     

      同步方式:

    异步方式:

    8 异步请求的编程模型

    以粮为纲全面发展
  • 相关阅读:
    [arc067F]Yakiniku Restaurants[矩阵差分]
    [2016北京集训测试赛3]masodik-[凸包]
    [WC2010][BZOJ1758]重建计划-[二分+分数规划+点分治]
    [2016北京集训测试赛7]isn-[树状数组+dp+容斥]
    [BZOJ1565][NOI2009]植物大战僵尸-[网络流-最小割+最大点权闭合子图+拓扑排序]
    [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]
    [2016北京集训测试赛1]奇怪的树-[树链剖分]
    [2016北京集训测试赛1]兔子的字符串-[后缀数组+二分]
    模拟 [Sdoi2010]猪国杀
    DP 小奇挖矿2
  • 原文地址:https://www.cnblogs.com/alexliuf/p/13811678.html
Copyright © 2011-2022 走看看