原生方式實現Ajax技術


一:什么是Ajax?

Ajax:異步的JavaScript和XML,用於完成網頁局部刷新功能(修改少量數據只用局部刷新,不用再整個網頁重新加載);

  XML的作用:1.是用於數據傳輸,但現在都在使用JSON

        2.用於存取數據(已經不用),被數據庫取代

        3.用於寫配置文件,現在還在少量使用,逐漸被注解取代

 

注意:Ajax請求不能寫跳轉(1.會報錯。2.把跳轉的頁面當作字符串傳回去)

 

 

二:使用原生的方式實現Ajax

1、創建一個Ajax對象

  從Ajax對象xhr創建開始,它的所有操作都被監聽

  xhr本身是有一個狀態的概念,這個狀態:readyState

  0(為初始化):對象已經建立,但是尚未初始化(尚未調用open)方法

  1(初始化):對象已建立,尚未調用send方法

  2(發送數據):send方法已經調用,但是當前的狀態及http頭未知

  3(數據發送中):已接收部分數據,因為響應及http頭不全,這時通過responseBody和responseText獲取部分數據會出現錯誤

  4(完成):數據接收完畢,此時可以通過responseBody和responseText獲取完整的回應數據

  

   //內置了一個類:XMLHttpRequest;兼容IE需要創建ActiveXobject

  //在js中,所有變量定義都使用var

  var xhr= new XMLHttpRequest();    

 

2、准備請求 .open(methodType(請求類型),methodUrl(請求到后端的地址),isSys(是否異步)):請求類型:get/post。是否異步:默認為true

  注意:如果要傳參的話,get請求在路徑中傳參數,post請求在send中傳參

復制代碼
//get請求
xhr.open("get","/地址?傳到后台的參數");
//post請求
xhr.open("post","/login");

//如果是post請求,必須設置請求頭的類型,后台才能夠接收到前台傳過去的相應的數據;當然,get請求不需要設置
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

復制代碼

 

3、准備監聽Ajax相應的狀態變化:on(監聽),readystate(狀態) ,change(匿名方法)

  

復制代碼
xhr.onreadystatechange = function() {

    //xhr.status:請求狀態(200表示成功)

    //xhr.readyState:獲取到響應的值:(當它的狀態等於4-->整個請求已經完成,你就可以獲取數據了 )

    if(xhr.status==200 && xhr.readyState == 4){

      //獲取相應的值

      var result= xhr.responseText;

      //放到相應的位置

      document.getElementById("寫id").imnnerHTML = result;

    }

  }
復制代碼

 

4、發送請求  .sed(varBody)---->varBody:post請求傳參要寫(key=value&key=value&...);get請求不用寫

  

//get請求
xhr.sed();
//post請求
xhr.send("userName="+userName+"&pwd="+pwd);

 

 

get請求前端完整的html代碼:

 

復制代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>原生Ajax測試</title>
<script type="text/javascript">
    function getTime(){
        //1.創建ajax對象
        var xhr= new XMLHttpRequest();
        //2.准備請求(請求類型,后端地址):此處請求並沒有傳數據出去,只是發送了一個請求
        xhr.open("get","/gettime");
        //3.監聽ajax的狀態變化
        xhr.onreadystatechange= funtion(){
            if(xhr.status==200 && xhr.readyState==4){
                var result = xhr.responseText;
                //放到相應的位置
                document.getElementById("time").innerHTML = result;
            }
        }
        //4.發送請求
        xhr.send();
    }
</script>
</head>
<body>
 <button onclick="getTime()">得到時間</button><span id="time"></span>
</body>
</html>
復制代碼

 

 get請求后端的java代碼:

 

復制代碼
package ajax.servlet;

import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/gettime")//前端請求過來的地址
public class GetTimeServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //用於前后台交互數據測試
        String date = new Date().toLocaleString();
        //通過響應返回相應的數據
        resp.getWriter().print(date);
    }
}
復制代碼

 

post請求前端完整的html代碼:

復制代碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function login(){
        //1.獲取到用戶名與密碼
        var userName = document.getElementById("userName").value;
        var pwd = document.getElementById("pwd").value;
        //2.創建ajax對象
        var xhr= new XMLHttpRequest();
        //3.准備請求(請求類型,后台地址)
        xhr.open("post","/login");
        //如果是post請求,必須設置請求頭的類型,后台才能夠接收到前台傳過去的相應的數據
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        //3.監聽ajax的狀態變化
        xhr.onreadystatechange= function(){
            if(xhr.status==200 && xhr.readyState==4){
                var result = xhr.responseText;
                // responseText獲取到的都是字符串
                if(result == "true"){//登錄成功
                    window.location.href="https://www.baidu.com";
                }else{//登錄失敗
                    document.getElementById("erSpan").innerHTML="用戶名或密碼錯誤!";
                }
            }
        }
        //4.發送請求:post請求必須通過.send()傳數據到后台
        xhr.send("userName="+userName+"&pwd="+pwd);
    }
</script>
</head>
<body>
    <span id="erSpan"></span>
    <form action="/login" method="post">
        用戶名:<input type="text" name="userName" id="userName" /> <br />
        密碼<input type="text" name="pwd" id="pwd" /><br />
        <input type="button" value="ajax提交" onclick="login()" />
    </form>
</body>
</html>
復制代碼

post請求后端的java代碼:

復制代碼
package ajax.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/login")
public class LoginServlet extends HttpServlet{
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //字符集編碼,必須寫,不然中文會亂碼
        req.setCharacterEncoding("utf-8");
        resp.setContentType("utf-8");
        
        //接收到前台傳過來的值
        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");
        
        //System.out.println(userName+":"+pwd);
        //測試
        if("流星".equals(userName) && "123".equals(pwd)){
            //向前端返回Boolean類型的true,但前端接收到的是String類型
            resp.getWriter().print(true);
        }else{
            resp.getWriter().print(false);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM