Ajax

Ajax

Ajax

Asynchronous JavaScript And XML:异步的JavaScript和XML

Ajax并不是新的编程语言,指的是一种交互方式,异步加载,客户端和服务器的数据交互更新在局部页面的技术,不需要刷新整个页面(局部刷新)。

优点:

1.局部刷新,效率更高。 2.用户体验更好。

示例:同步加载

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>同步加载</title>
</head>
<body>
    ${str}
    <form action="/AjaxServlet1" method="post">
        <input type="text" name="text">
        <input type="submit">
    </form>
</body>
</html>
package com.wildfire.servlet.Ajax;

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

@WebServlet("/AjaxServlet1")
public class AjaxServlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String str="HelloWord!";
        req.setAttribute("str",str);
        req.getRequestDispatcher("Ajax1_tongbu.jsp").forward(req,resp);
    }
}

image-20201112162134544

image-20201112162226893

先点击提交查询按钮,然后开始在文本框中输入内容,三秒后,当文本框前弹出“HelloWord”的时候,会中断你的录入。而使用Ajax就不会这样。

基于JQuery的Ajax

导入JQuery:在web下新建js,将jquery-3.4.1.js粘贴到js文件下,在jsp页面中加入如下代码:

<script type="text/javascript" src="js/jquery-3.4.1.js"></script>

IDEA--》工具栏--》Build--》Rebuild Project(使js下的jquery-3.4.1.js同步到out中)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ajax2</title>
    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
    <script>
        $(function(){
            var btn=$("#btn");
            btn.click(function () {
                $.ajax({
                    //相当于form表中的action
                    url:'/AjaxServlet1',
                    //相当于form表单中的method
                    type:'post',
                    //传到Servlet的参数,相当于地址栏拼接了一个id=1
                    data:'id=1',
                    //服务端返回的数据类型(该实例中返回的是HelloWord)
                    dataType:'text',
                    //成功
                    success:function (data) {
                        var text=$("#text")
                        text.before("<span>"+data+"</span><br>")
                    }
                })
            })
        })
    </script>
</head>
<body>
    ${str}
    <input type="text" name="text" id="text">
    <input type="submit" id="btn">
</body>
</html>
package com.wildfire.servlet.Ajax;

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

@WebServlet("/AjaxServlet1")
public class AjaxServlet1 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id=req.getParameter("id");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String str="HelloWord!";
        resp.setContentType("UTF-8");
        //不能跳转到Jsp(会将所有的Jsp源代码加载回去),只能将所需数据返回。
        resp.getWriter().write(str);
        /*req.setAttribute("str",str);
        req.getRequestDispatcher("Ajax2.jsp").forward(req,resp);*/

    }
}

image-20201116211950802

使用Ajxa,点击提交查询按钮后开始书写,三秒钟后弹出“HelloWord?”,但是同时你仍然可以继续在输入框中输入你想输入的内容。

使用Ajax的注意点:

1.前端:不能使用表单提交(表单提交是同步),改用JQuery的方式动态绑定事件提交。

2.后端:不能跳转到Jsp(会将所有的Jsp源代码加载回去),只能将所需数据返回。

如果使用跳转到Jsp,返回的代码如图:

image-20201116212852321

如果我们用alert(data)将它输出出来,如下图:

image-20201116213259246

传统WEB数据交互和Ajax数据交互的区别:

客户端请求方式不同:

​ 传统WEB数据交互:浏览器发送同步请求(form表单、a标签)。

​ Ajax:异步引擎对象发送异步请求。

服务器响应方式不同:

​ 传统WEB数据交互:响应一个完整的JSP页面(视图)。

​ Ajax:响应需要的数据。

客户端处理方式不同:

​ 传统:需要等待服务器完成响应并且重新加载整个页面之后,用户才能进行后续的操作

​ Ajax:动态更新页面中的局部内容,不影响其他操作。

Ajax原理(了解)

image-20201119223807213

Ajax语法(基于JQuery)

$.ajax({属性})

常用属性:

url:请求的后端服务地址

type:请求⽅式,默认 get

data:请求参数

dataType:服务器返回的数据类型,多数是text/json

success:请求成功的回调函数

error:请求失败的回调函数

complete:请求完成的回调函数(⽆论成功或者失败,都会调⽤)

JSON

JavaScript Object Notation,⼀种轻量级数据交互格式,完成 js 与 Java 等后端开发语⾔对象数据之间 的转换。

例如,在java中创建一个User对象:

package com.wildfire.javabean;

public class User {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}
User user=new User(20183694,"张三",21);

而使用JSON:

var user = {
    id:20183694,
	name:"张三",
	age:21
}

使用JSON

要导入六个jar包:

image-20201119232615745

示例:

package com.wildfire.servlet.Ajax;

import com.wildfire.javabean.User;
import net.sf.json.JSONObject;

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

@WebServlet("/AjaxServlet")
public class AjaxServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user=new User(20183694,"张三",21);
        resp.setCharacterEncoding("UTF-8");
        //将java对象转化为JSON格式
        JSONObject jsonObject =JSONObject.fromObject(user);
        resp.getWriter().write(jsonObject.toString());

    }
}
<%--
  Created by IntelliJ IDEA.
  User: DELL
  Date: 2020/11/19
  Time: 23:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Ajax3</title>
    <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
    <script>
        $(function(){
            var btn=$("#btn");
            btn.click(function(){
                $.ajax({
                    url:'/AjaxServlet',
                    type:'post',
                    dataType:'json',
                    success:function(data){
                        $("#id").val(data.id);
                        $("#name").val(data.name);
                        $("#age").val(data.age);
                    }

                });
            });
        })
    </script>
</head>
<body>
    学号<input type="text" name="id" ><br>
    姓名<input type="text" name="name"><br>
    年龄<input type="text" name="age"><br>
    <input type="submit" value="查找" id="btn">

</body>
</html>

image-20201120000555193

Ajax实例:省市区三级联动

参考博客:

原文地址:https://www.cnblogs.com/wind-and-sky/p/14012103.html