Java学习路线-47:Ajax学习XMLHttpRequest、XStream、json-lib(1)

简介: Java学习路线-47:Ajax学习XMLHttpRequest、XStream、json-lib

课时1 1.ajax简介(异步与同步)

asynchronous javascript and xml

异步js和xml


1、异步交互和同步交互

同步 发送,等待 整个页面刷新

异步 发送,不等待 局部刷新


示例:异步刷新


<button id="btn">点击</button> 
<h2 id="text"></h2>
<script>
// 文档加载完成后马上执行
window.onload = function(){
    let btn = document.getElementById("btn");
    // 给btn注册点击事件监听
    btn.onclick = function(){
        let text = document.getElementById("text");
        text.innerHTML= "hello!";
    }
}
</script>


课时2 2.异步和同步交互图

数据格式

text、xml、json

同步:


请求 ->

响应 <-


请求 ->

响应 <-



异步:


请求 ->

请求 ->


响应 <-

响应 <-



课时3 3.ajax的应用场景和优缺点

优点:

异步交互,增强用户体验

性能:只需要响应部分内容,服务器压力减少


缺点:

ajax不能应用在所有场景

ajax增多了对服务器的请求,给服务器增加压力


课时4 4.ajax四步操作

1、获取XMLHttpRequest


// 大多数浏览器
var xmlHttp = new XMLHttpRequest();
// IE6.0
var xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
// IE<=5.5
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
1


编写一个创建XMLHttpRequest对象的函数


function createXMLHttpRequest(){
    try{
        // 大多数浏览器
        return new XMLHttpRequest();
    }catch(e){
        try{
            // IE6.0
            new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                // IE<=5.5
                new ActiveXObject("Microsoft.XMLHTTP");
            }catch(e){
                console.log("浏览器版本太老了!"); 
                throw e;
            }   
        }   
    }
}




2、连接服务器


xmlHttp.open("GET", "/url", true);

// 参数:请求方式,请求url,是否为异步


3、发送请求


xmlHttp.send(null);

// 参数:请求体内容,如果是GET,必须给出null,不然FireFox可能不发送


4、注册事件监听器

(1)5个状态:


0 刚创建

1 请求开始,调用open

2 请求发送完成 调用send

3 服务器开始响应

4 服务器响应结束



(2)获取响应内容


// 获取状态
var state = xmlHttp.readyState; 
// 得到服务器响应状态码 200, 404, 500
var status = xmlHttp.status;
// 得到服务器响应内容 
var content = xmlHttp.responseText; // 文本格式
var content = xmlHttp.responseXml; // xml格式,document对象



(3)注册监听事件


xmlHttp.onreadystatechange = function(){
    // 双重判断 xmlHttp状态为服务器响应结束,服务器状态响应结束
    if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
        var text = xmlHttp.responseText;
    }
}



课时5 5.ajax第一例:helloworld

为了便于测试,服务端使用Python语言

服务端 hello.py


# pip install flask, flask-cors
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, supports_credentials=True)
@app.route("/")
def index():
    return "<h2>Hello!</h2>"
if __name__ == '__main__':
    app.run()



客户端 demo.html


<button id="btn">点击</button> 
<h2 id="text"></h2>
<script>
// 获取XMLHttpRequest对象
function createXMLHttpRequest(){
    try{
        // 大多数浏览器
        return new XMLHttpRequest();
    }catch(e){
        try{
            // IE6.0
            new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                // IE<=5.5
                new ActiveXObject("Microsoft.XMLHTTP");
            }catch(e){
                console.log("浏览器版本太老了!"); 
                throw e;
            }   
        }   
    }
}
// 文档加载完成后马上执行
window.onload = function(){
    let btn = document.getElementById("btn");
    // 给btn点击事件注册监听
    btn.onclick = function(){
        let xmlHttp = createXMLHttpRequest();
        xmlHttp.open("GET", "http://127.0.0.1:5000/", true);
        xmlHttp.send();
        xmlHttp.onreadystatechange = function(){
            // 双重判断 xmlHttp状态为服务器响应结束,服务器状态响应结束
            if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
            var text = xmlHttp.responseText;
            let h2 = document.getElementById("text");
            h2.innerHTML= text;
        }
}
    }
}
</script>




6.ajax第二例:发送POST请求

多添加一个请求头


// 设置请求头
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 发送请求体
xmlHttp.send("username=Tom&age=23");


服务端接收函数 hello.py



@app.route("/post", methods=['POST'])
def post():
    username = request.form.get("username")
    age = request.form.get("age")
    return f"<h2>username: {username}, age: {age}</h2>"



客户端修改 demo.html


xmlHttp.open("POST", "http://127.0.0.1:5000/post", true);

xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

xmlHttp.send("username=Tom&age=23");


课时7 7.ajax第三例:用户名是否已被注册

客户端要求:

1、注册表单

2、监听用户名文本框失去焦点onblur事件

3、获取文本框内容,通过ajax异步发送给服务器

4、如果为1 显示:用户名已被注册

如果为0 什么都不显示


<meta charset="utf-8">
<style>
    #errorText {
        color: red;
    }
</style>
<form action="">
    <input type="text" name="username" id="username">
    <span id="errorText"></span>
</form>
<script>
    // 获取XMLHttpRequest对象
    function createXMLHttpRequest() {
        try {
            // 大多数浏览器
            return new XMLHttpRequest();
        } catch (e) {
            try {
                // IE6.0
                new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    // IE<=5.5
                    new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    console.log("浏览器版本太老了!");
                    throw e;
                }
            }
        }
    }
    // 文档加载完成后马上执行
    window.onload = function () {
        let username = document.getElementById("username");
        // 失去焦点注册事件监听
        username.onblur = function () {
            let xmlHttp = createXMLHttpRequest();
            xmlHttp.open("POST", "http://127.0.0.1:5000/validate", true);
            xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xmlHttp.send("username=" + username.value);
            xmlHttp.onreadystatechange = function () {
                // 双重判断 xmlHttp状态为服务器响应结束,服务器状态响应结束
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
                    var text = xmlHttp.responseText;
                    let errorText = document.getElementById("errorText");
                    if (text == '1') {
                        errorText.innerHTML = "用户名已被注册";
                    } else {
                        errorText.innerHTML = "";
                    }
                }
            }
        }
    }
</script>




服务端要求:

1、获取客户端传递的用户名参数

2、判断是否为demo,是返回1,否返回0


@app.route("/validate", methods=['POST'])
def validate():
    username = request.form.get("username")
    if username == "demo":
        return "1"
    else:
        return "0"
相关文章
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
210 1
|
2月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
284 0
|
3月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
155 1
|
2月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
266 7
|
3月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
76 5
|
3月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
149 5
|
3月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
177 3
|
3月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
82 1
|
3月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
141 1
|
3月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
85 2