JavaWeb之Ajax&json

一、ajax

1.1 ajax概述

ajax(Asynchronous JavaScript and XML) 异步的JavaScript 和 XML,是指一种创建交互式、快速动态网页应用的网页开发技术,通过在后台与服务器进行少量数据交换 , 无需重新加载整个网页的情况下,能够更新部分网页的技术。

ajax可以在页面进行局部刷新时完成和后台的数据交互。

1.2 同步与异步

同步:

  • 当浏览器发送请求之后,在服务器处理请求时,浏览器处于同步等待状态,不能做其他的事情
  • 当请求执行完成,浏览器处理响应时,可能会出现页面跳转(转发,重定向)

异步:

  • 当浏览器发送请求之后,在服务器处理请求时,浏览器不受影响,可以执行其他操作
  • 当服务器处理完成请求之后,把数据响应回浏览器采用的方式只能是:用流输出

1.3 原生ajax

在这里插入图片描述
原生ajax的核心对象是XmlHttpRequest

原生ajax执行过程:

  1. 打开和服务器的连接:open(请求的方式,请求的地址)
  2. 真正发送请求:send()
  3. 处理服务器响应:onreadystatechange()
    处理时机:

执行状态为4
响应状态为200

原生ajax代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script>
       
function btnClick(){
         //1.创建核心对象XMLHttpRequest
        let xmlhttp = null;
        if (window.XMLHttpRequest) {// code for Firefox, Opera, IE7, etc.
            xmlhttp = new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {// code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        //2.设置回来的地址(回调函数)
        xmlhttp.onreadystatechange = function () {
            //当响应回来的时候,且正常响应结束的时候,才处理结果
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                //获取响应的结果
                alert(xmlhttp.responseText);

                //找到input框 id=name的
                document.querySelector("#name").value = xmlhttp.responseText;
            }
        }

       //3.设置服务器地址 参数1: 请求方式 参数2: 请求地址
       //xmlHttp.open(method , url)
        xmlhttp.open("post", "${pageContext.request.contextPath}/ajaxServlet?message=你好a");

      //4.发送请求  xmlHttp.send(请求体)
            xmlHttp.send();
        }
    </script>
</head>
<body>
    用户名:<input type="text" >
    <input type="button" onclick="btnClick()" value="点我发送ajax" id="name">
</body>
</html>

readyState属性存有服务器响应的状态信息,每当readyState改变时,onreadystatechange()函数就会执行。

readyState属性值与对应状态:

状态描述
0请求未初始化(在调用open()之前)
1请求已提出(调用send()之前)
2请求已发送(这里通常可以从响应得到内容头部)
3请求处理中(响应中通常有部分数据可用,但服务器还没有完成响应)
4请求已完成(可以访问服务器响应并使用响应)

1.4 axios组件

axios组件底层就是原生的ajax代码 , 只不过在原生代码上进行了封装, 简化了代码。

常用语法:

  • axios.request(config)
  • axios.get(url[, config])
  • axios.delete(url[, config])
  • axios.head(url[, config])
  • axios.options(url[, config])
  • axios.post(url[, data[, config]])
  • axios.put(url[, data[, config]])
  • axios.patch(url[, data[, config]])

使用方式:
axios.请求方式(url?参数).then()

  • url : 请求地址
  • then(function(响应对象){}) : 回调函数只有当XmlHttpResquest.status为200时才执行
  • 响应对象.data : 响应的数据

二、json

2.1 json概述

JSON(JavaScript Object Notation) JavaScript对象表示法,是基于ECMAScript子集的一种轻量级数据交换格式。

JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,易于人阅读和编写,同时也易于机器解析和生成;这些特性使JSON成为理想的数据交换语言。

JSON特点:速度快,占用小,易于解析。

JSON一般用于主要实现信息的存储与交换 。

2.2 语法规则

  1. json 中的数据由键值对组成,键值对之间用,分隔开
    — 键:由双引号或者单引号括起来。
    — 值:数值(小数、整数),字符串,布尔值(false,true),数组
  2. 数组使用中括号
  3. json对象使用大括号
{ "name" : "张三","age" : 20,"gender" : "男", "isStudent" : true}
{ "users" : [
    { "name" : "张三","age" : 20,"gender" : "男" , "isStudent" : true},
    { "name" : "李四","age" : 21,"gender" : "女" , "isStudent" : true},
    { "name" : "王五","age" : 20,"gender" : "男" , "isStudent" : true},
    ...
]}

2.3 json数据的获取

  • json对象.键
  • json对象[“键”]
  • 数组对象[索引]

三、省市联动

效果展示:当切换省份的时候 , 出来对应的市区
在这里插入图片描述
jsp代码:

<div>
    <h1>基本资料</h1>
    <form>
        <div class="form-inline">
            <label>昵称:</label>
            <input type="text" class="form-control"  name="age" placeholder="请输入昵称">
        </div>
        <div class="form-inline">
            <label>性别:</label>
            <input type="text" class="form-control"  name="gender" placeholder="请输入性别">
        </div>
        <div class="form-inline">
            <label>生日:</label>
            <input type="text" class="form-control"  name="birthday" placeholder="请输入生日">
        </div>
        <div class="form-inline" >
            <label for="provinces">省份: </label>
            <select id="provinces" class="form-control" style="width: 200px">
                <option value="">请选择省</option>
            </select>
        </div>
        <div class="form-inline" >
            <label for="cities" >市区:</label>
            <select id="cities"  class="form-control" style="width: 200px">
                <option value="">请选择市区</option>
            </select>
        </div>

        <div class="form-inline" >
            <input type="submit"  class="form-control" value="立即注册" style="background-color: deepskyblue;color: white;">
        </div>

    </form>
    <script type="text/javascript">
        let provinces = document.querySelector("#provinces");
        let cities = document.querySelector("#cities");
        let provinceArr = new Array();
        onload = function () {
            //发生axios异步请求,加载city.json  axios可以直接访问json文件
            axios.get("${pageContext.request.contextPath}/json/city.json").then(function (resp) {
               //取出省份的数组
                provinceArr = resp.data.provinces;
                //遍历省份数组
                for (let i=0;i<provinceArr.length;i++){
                    provinces.innerHTML += "<option value='"+provinceArr[i].code+"'>"+provinceArr[i].name+"</option>";
                }
            });

            //给省份下拉列表绑定onchange事件
            provinces.onchange = function () {
                //找到当前省份选项对应的code值
                let provinceCode = provinces.options[provinces.selectedIndex].value;
                //城市的下拉列表
                let citiesArr = new Array();
                for (let i=0;i<provinces.length;i++){
                    if (provinceCode==provinceArr[i].code){
                        citiesArr = provinceArr[i].cities;
                        break;
                    }
                }
                //重置城市下拉列表的长度
                cities.length = 1;

                //遍历城市数组
                for (let i=0;i<citiesArr.length;i++){
                    cities.innerHTML += "<option value='"+citiesArr[i].code+"'>"+citiesArr[i].name+"</option>";
                }
            }
        }
    </script>
</div>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值