1. 程式人生 > 其它 >ajax、json

ajax、json

技術標籤:小知識

ajax、json

一:AJAX的特點:

(1)優點:

  1. 可以無需重新整理頁面與伺服器端進行通訊
  2. 允許你根據使用者事件來更新部分頁面內容

(2)缺點:

  1. 沒有瀏覽歷史,不能回退
  2. 存在跨域問題(同源)
  3. SEO不友好

二:原生ajax案例

(1)判斷使用者名稱是否可用前臺

//add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用者新增實現</
title
>
<script type="text/javascript"> var xhr; function checkZh(){ var val = document.getElementById("zh").value; if (val==""||val==null){ document.getElementById("zh_span").innerText="X 賬號不能為空"
; }else { //傳送ajax請求 //1.建立XMLHttpRequest物件 xhr = new XMLHttpRequest(); //2.和伺服器建立連線 //第一個引數:提交方式。第二個引數:提交地址。第三個引數:是否為非同步。 xhr.open("get","CheckNameServlet?zh="+val,true); //3.執行回撥函式
xhr.onreadystatechange=process; //4.傳送資料,get方式傳送資料就寫null,因為引數已經依附在了地址後面 xhr.send(null); } } function process(){ //狀態碼為4時,才有接收響應資料的必要 if (xhr.readyState==4){ if (xhr.status==200){ //接受響應資料 var text = xhr.responseText; document.getElementById("zh_span").innerText=text; }else if(xhr.status==404){ alert("資源找不到"); }else if (xhr.status==500){ alert("ajax請求失敗"); } } }
</script> </head> <body> <h3>yoghurt註冊</h3> <form> <p> 使用者名稱:<input type="text" name=""/> </p> <p> 賬號:<input type="text" id="zh" name="zh" onblur="checkZh()"/> <span id="zh_span"></span> </p> <p> 密碼:<input type="text" name="pwd"/> </p> <p> <input type="submit" value="提交"/> </p> </form> </body> </html>

(2)判斷使用者名稱是否可用後臺

@WebServlet("/CheckNameServlet")
public class CheckNameServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解決響應的中文亂碼問題
        resp.setContentType("text/html;charset=utf-8");
        //接受前臺傳遞的引數
        String zh = req.getParameter("zh");
        //處理判斷資料
        boolean flag = false;
        if ("zjl".equals(zh)){
            flag = true;
        }
        //根據響應的結果給使用者做出響應
        if (flag){
            resp.getWriter().print("使用者名稱被佔用");
        }else {
            resp.getWriter().print("使用者名稱可用");
        }
    }
}

拓展:

@WebServlet註解用於標註在一個繼承了HttpServlet類之上,屬於類級別的註解。
用法形如:

@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet{
  //處理 GET 方法請求的方法
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
  //處理POST方法請求的方法
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

該註解的作用等價於 在web.xml中配置的該servlet的元素中的配置

原生ajax傳送post請求

<script type="text/javascript">
        var xhr;
        function checkZh(){
            var val = document.getElementById("zh").value;
            if (val==""||val==null){
                document.getElementById("zh_span").innerText="X 賬號不能為空";
            }else {
                //傳送ajax請求
                //1.建立XMLHttpRequest物件(解決瀏覽器之間的差異)
                if (window.ActiveXObject){
                    xhr = new ActiveXObject("Microsoft XMLHTTP");
                }else {
                    xhr = new XMLHttpRequest();
                }
                //2.和伺服器建立連線
                //第一個引數:提交方式。第二個引數:提交地址。第三個引數:是否為非同步。
                //post請求方式
                xhr.open("post","CheckNameServlet",true);
                //post方式提交資料,需要設定請求頭為普通文字資料提交
                xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                //3.執行回撥函式
                xhr.onreadystatechange=process;
                //4.傳送資料,get方式傳送資料就寫null,因為引數已經依附在了地址後面                 
                xhr.send("zh="+val);
            }
        }
        function process(){
            //狀態碼為4時,才有接收響應資料的必要
            if (xhr.readyState==4){
                if (xhr.status==200){
                    //接受響應資料
                    var text = xhr.responseText;
                    document.getElementById("zh_span").innerText=text;
                }else if(xhr.status==404){
                    alert("資源找不到");
                }else if (xhr.status==500){
                    alert("ajax請求失敗");
                }
            }
        }
    </script>

三:回撥函式多次被呼叫問題

(1)XMLHTTPRequest的幾種狀態

0:請求沒有發出(在呼叫open()之前)
1:請求已經建立但是還沒有發出(呼叫send()之前)
2:請求已經發出正在處理之中(這裡通常可以從響應的內容頭部)
3:請求已經處理,響應中有資料可用,但是伺服器還沒有完成響應
4:響應已經完成,可以訪問伺服器並使用他
在AJAX中有以上五種狀態,但是通常只使用狀態4。
status代表響應狀態碼:
200
400

四:響應格式之JSON物件

(1)方式一——更改toString()方法

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        var xhr;
        function change1(){
            //1.建立XML物件
            xhr = new XMLHttpRequest();
            //2.和伺服器建立連線
            xhr.open("get","AjaxResponseText",true);
            //3.執行回撥函式
            xhr.onreadystatechange=process;
            //4.傳送資料
            xhr.send(null);
        }
        function process(){
            if (xhr.readyState==4&&xhr.status==200){
                //Student{sid=1, sname='zs', sex='男'}
                var text = xhr.responseText;
                eval("var json="+text)
                console.log(json.sname);
            }
        }
    </script>
</head>
<body>
    <button onclick="change1()">JSON</button>
</body>
</html>
@WebServlet("/AjaxResponseText")
public class AjaxResponseText extends HttpServlet {
    /**
     *  響應的資料格式
     *      1.普通文字
     *      2.JSON格式
     			(1)更改Student類的toString()方法
                    @Override
                    public String toString() {
                        return "Student{" +
                                "sid:" + sid +
                                ", sname:'" + sname + '\'' +
                                ", sex:'" + sex + '\'' +
                                '}';
                    }
                (2)eval("var json="+text)
     *      3.XML格式
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //響應的資料格式之普通文字
        //resp.getWriter().print("bjset");
        /**********響應資料之JSON************/
        //模擬查詢操作
        Student student = new Student(1,"zs","男");
        resp.getWriter().print(student);
        System.out.println(student);
    }
}

(2)方式二——手動拼接json字串

(3)獲得JSON格式之GSON依賴(最佳)

@WebServlet("/AjaxResponseText")
public class AjaxResponseText extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //響應的資料格式之普通文字
        //resp.getWriter().print("bjset");
        /**********響應資料之JSON************/
        //模擬查詢操作
        Student student = new Student(1,"zs","男");
        //gson依賴方式
        //1.建立Gson物件
        Gson gson = new Gson();
        String json = gson.toJson(student);
        
        resp.getWriter().print(json);
        System.out.println(json);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        var xhr;
        function change1(){
            //1.建立XML物件
            xhr = new XMLHttpRequest();
            //2.和伺服器建立連線
            xhr.open("get","AjaxResponseText",true);
            //3.執行回撥函式
            xhr.onreadystatechange=process;
            //4.傳送資料
            xhr.send(null);
        }
        function process(){
            if (xhr.readyState==4&&xhr.status==200){
                var text = xhr.responseText;
                //方式一:通用的
                //eval("var json="+text)
                //方式二:一定需要注意:下面這一方式中json中key必須使用引號引出來
                var json = JSON.parse(text);
                console.log(json.sname);
            }
        }
    </script>
</head>
<body>
    <button onclick="change1()">JSON</button>
</body>
</html>

五:JSON更多格式的獲得

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript">
        var xhr;
        function change1(){
            //1.建立XML物件
            xhr = new XMLHttpRequest();
            //2.和伺服器建立連線
            xhr.open("get","AjaxResponseText",true);
            //3.執行回撥函式
            xhr.onreadystatechange=process;
            //4.傳送資料
            xhr.send(null);
        }
        function process(){
            if (xhr.readyState==4&&xhr.status==200){
                var text = xhr.responseText;
                //方式一:通用的
                //eval("var json="+text)
                //方式二:一定需要注意:下面這一方式中json中key必須使用引號引出來
                var json = JSON.parse(text);
                for (var i in json){
                    console.log(json[i].sid);
                }
            }
        }
    </script>
</head>
<body>
    <button onclick="change1()">JSON</button>
</body>
</html>