13-Ajax & JSON

1.AJAX

1.概念

ASynchronous JavaScript And XML:异步的JavaScript 和 XML

1.1异步和同步

异步和同步:客户端服务器端相互通信的基础上

  • 同步:客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作
  • 异步:客户端不需要等待服务器的响应。在服务器处理请求的过程中,客户端可以进行其他的操作
  • Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
  • 通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
  • 传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。
  • 提升用户的体验

2.实现方式

1.原生的JS实现方式(了解)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        //定义方法
        function fun(){
            //发送异步请求
            //1.创建核心对象
            var xmlhttp;
            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }

            //2.建立连接
            /*
                参数:
                    1.请求方式:GET、POST
                        get方式,请求参数在URL后边拼接。send方法为空参
                        post方式,请求参数在send方法中定义
                    2.请求的URL
                    3.同步或异步请求:true(异步)或 false(同步)

             */
            xmlhttp.open("GET","ajaxServlet?username=tom",true);

            //3.发送请求
            xmlhttp.send();

            //4.接受并处理来自服务器的响应结果
            //获取方式:xmlhttp.responseText
            //什么时候获取?当服务器响应成功后再获取

            //当xmlhttp对象的就绪状态改变时,触发事件onredystatechange。
            xmlhttp.onreadystatechange=function()
            {
                //判断readyState就绪状态是否为4,判断status响应状态码是否为200
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                    //获取服务器的响应结果
                    var responseText = xmlhttp.responseText;
                    alert(responseText)

                }
            }
        }
    </script>
</head>
<body>
    <input type="button" value="发送异步请求" onclick="fun();">
    <input>
</body>
</html>
2.JQuery实现方式
  • 1.$.ajax()
    • 语法:$.ajax({键值对});
<script>
    //定义方法
    function fun(){
        //使用$.ajax()发送异步请求
        $.ajax({
            url:"ajaxServlet1", //请求路径
            type:"POST", //请求方式
            //data:"username=jack&age=23",//请求参数
            success:function (data) {
                alert(data)
            }, //响应成功后的回调函数
            error:function () {
                alert("出错啦")
            }, //表示如果请求响应出现错误,会执行的回调函数
            dataType:"text" //设置接收到的响应数据的格式
        });
    }
</script>
  • 2.$.get():发送get请求
    • 语法:$.get(url,[data],[callback],[type])
      • 参数:
        • url:请求路径
        • data:请求参数
        • callback:回调函数
        • type:响应结果的类型
<script>
   //定义方法
   function fun(){
       $.get("ajaxServlet",{username:"rose"},function (data) {
           alert(data);
       },"text");
   }
</script>
3.$.post():发送post请求
  • 语法:$post(url,[data],[callback],[type])
    • 参数:
      • url:请求路径
      • data:请求参数
      • callback:回调函数
      • type:响应结果的类型
<script>
   //定义方法
   function fun(){
       $.post("ajaxServlet",{username:"rose"},function (data) {
           alert(data);
       },"text");
   }
</script>

2.JSON

1.概念

JavaScript object Notation:JavaScript对象表示法

//java的面对对象表示法
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");

//JavaScript对象表示法
var p = {"name":"张三","age":23,"gender":"男"};
  • json现在多用于存储和交换文本信息的语法
  • 进行数据的传输
  • JSON 比 XML 更小、更快、更容易解析

2.语法

  • 1.基本规则
    • 数据在名称/值对中:json数据是由键值对构成的
      • 键用引号(单双引号)引起来,也可以不使用引号
      • 值的取值类型
        • 1.数字(整数或浮点数)
        • 2.字符串(在双引号中)
        • 3.逻辑值(true 或 false)
        • 4.数组(在方括号中) {“persons”:[{},{}]}
        • 5.对象(在花括号中){“address”:{“province”:“陕西”…}}
        • 6.null
    • 数据由逗号分隔:多个键值对由逗号分隔
    • 花括号保存对象:使用{}定义json格式
    • 方括号保存数组:[]
<script>
        //1.定义基本格式
        var person = {"name":"张三",age:23,'gender':true};
//        alert(person.name);
        //2.嵌套格式{}——》[]
        var persons = {
            "person":[
            {"name":"张三","age":23,"gender":true},
            {"name":"李四","age":24,"gender":true},
            {"name":"王五","age":25,"gender":false}
            ]};
//        alert(persons);
        //2.1嵌套格式[]——》{}
        var psersons2 = [{"name":"张三","age":23,"gender":true},
            {"name":"李四","age":24,"gender":true},
            {"name":"王五","age":25,"gender":false}];
        alert(psersons2);
</script>
  • 2.获取数据:

    • 1.json对象.键名
    • 2.json对象[“键名”]
    • 3.数组对象[索引]
    • 4.遍历
    <script>
            //1.定义基本格式
            var person = {"name":"张三",age:23,'gender':true};
    //        alert(person.name);
            //获取name的值
    //        var name = person.name;
    //        var name = person["name"];
    //        alert(name);
    
            //获取person对象中所有的键和值
            //for in 循环
            /*for(var key in person){
                //这样的方式获取不行。因为相当于person."name"
    //            alert(key+":"+person.key);
                alert(key+":"+person[key]);
            }*/
    
            //2.嵌套格式{}——》[]
            var persons = {
                "person":[
                {"name":"张三","age":23,"gender":true},
                {"name":"李四","age":24,"gender":true},
                {"name":"王五","age":25,"gender":false}
                ]};
    //        alert(persons);
            var name = persons.person[1].name;
            var name2 = persons["person"][2].name;
    //        alert(name);
    //        alert(name2);
    
    
            //2.1嵌套格式[]——》{}
            var psersons2 = [{"name":"张三","age":23,"gender":true},
                {"name":"李四","age":24,"gender":true},
                {"name":"王五","age":25,"gender":false}];
    //        alert(psersons2);
            var name3 = psersons2[0].name;
            var name4 = psersons2[0]["age"];
    //        alert(name3);
    //        alert(name4);
    
            //获取psersons2|对象中所有的键和值
            for(var i = 0;i < psersons2.length;i++){
                var psersons = psersons2[i];
                for(var key in psersons){
                    alert(key+":"+ psersons[key]);
                }
            }
    </script>
    
  • 3.JSON数据和Java对象的相互转换

    • JSON解析器:
      • 常见的解析器:Jsonlib,Gson,fastjson,jackson
    • 1.JSON转为对象
      • 1.导入Jackson的相关jar包
      • 2.创建Jackson核心对象ObjectMapper
      • 3.调用ObjectMapper的相关方法进行转换
        • readValue(json字符串数据,Class)
        //演示Json字符串转为Java对象
    	@Test
        public void test5() throws Exception {
            //1.初始化JSON字符串
            String json = "{\"gender\":\"女\",\"name\":\"张三\",\"age\":23}";
            //2.创建ObjectMapper对象
            ObjectMapper mapper = new ObjectMapper();
            //3.转换为Java对象 Person对象
            Person person = mapper.readValue(json, Person.class);
            System.out.println(person);
        }
    
    • 2.Java对象转换JSON

      • 1.使用步骤:

        • 1.导入jackson的相关jar包

        • 2.创建Jackson核心对象ObjectMapper

        • 3.调用ObjectMapper的相关方法进行转换

          • 1.转换方法:
            • writeValue(参数1,obj):
              • 参数1:
                • File:将obj对象转换为JSON字符串,并保存到指定的文件中
                • Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
                • OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
            • writeValueAsString(obj):将对象转为json字符串
          public class JacksonTest {
              //Java对象转为JSON字符串
              @Test
              public void test1() throws IOException {
                  //1.创建Person对象
                  Person p = new Person();
                  p.setName("张三");
                  p.setAge(23);
                  p.setGender("男");
          
                  //2.创建Jackson的核心对象 ObjectMapper
                  ObjectMapper mapper = new ObjectMapper();
          
                  String json = mapper.writeValueAsString(p);
                  //期望:{"name":"张三","age":23,"gender":"男"}
                  System.out.println(json);
          
                  //writeValue,将数据写到d://a.txt中
                  mapper.writeValue(new File("d://a.txt"),p);
          
                  //writeValue,将数据关联到Writer中
                  mapper.writeValue(new FileWriter("d://b.txt"),p);
              }
          }
          
          • 2.注解:
            • 1.@JsonIgnore:排除属性
            • 2.@JsonFormat:属性值的格式化
              • @JsonFormat(pattern = “yyyy-MM-dd”)
          //    @JsonIgnore //忽略该属性
              @JsonFormat(pattern = "yyyy-MM-dd")
              private Date birthday;
          
          • 3.复杂java对象转换
            • 1.List:数组
            • 2.Map:对象格式一致
          @Test
          public void test3() throws Exception {
              //1.创建Person对象
              Person p = new Person();
              p.setName("张三");
              p.setAge(23);
              p.setGender("男");
              p.setBirthday(new Date());
      
              Person p1 = new Person();
              p1.setName("张三");
              p1.setAge(23);
              p1.setGender("男");
              p1.setBirthday(new Date());
      
              Person p2 = new Person();
              p2.setName("张三");
              p2.setAge(23);
              p2.setGender("男");
              p2.setBirthday(new Date());
      
              List<Person> lp = new ArrayList<Person>();
              lp.add(p);
              lp.add(p1);
              lp.add(p2);
      
              //转换
              ObjectMapper mapper = new ObjectMapper();
              String json = mapper.writeValueAsString(lp);
              System.out.println(json);
          }
      
          @Test
          public void test4() throws Exception {
              //1.创建map对象
              Map<String,Object> map = new HashMap<String, Object>();
              map.put("name","张三");
              map.put("age",23);
              map.put("gender","女");
      
              ObjectMapper mapper = new ObjectMapper();
              String json = mapper.writeValueAsString(map);
      
              System.out.println(json);
          }
      

3.案例

校验用户名是否存在

regist.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册页面</title>
    <script src="js/jquery-3.2.1.min.js"></script>
    <script>
        //页面加载完成后
        $(function () {
            //给username绑定blur(失去焦点)事件
            $("#username").blur(function () {
                //获取username文本输入框的值
                //var username = $("#username").val();
                var username = $(this).val();
                //发送ajax请求
                $.get("findUserServlet",{username:username},function (data) {
                    //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
                    //                            {"userExsit":false,"msg":"此用户名可用"}
                    var u_span = $("#u_span");
                    //判断userExsit键的值是否是true
                    if(data.userExsit){
                        //用户名存在
                        u_span.css("color","red");
                        u_span.html(data.msg);
                    }else {
                        //用户名不存在
                        u_span.css("color","green");
                        u_span.html(data.msg);
                    }
                },"json");
            });
        });
    </script>
</head>
<body>
    <form>
        用户名:<input type="text" placeholder="请输入用户名" id="username" name="username">
        <span id="u_span"></span>
        <br>
        密码:<input type="password" placeholder="请输入密码" name="password"><br>
        <input type="submit" value="注册"><br>
    </form>
</body>
</html>

FindUserServlet.java

package com.java.servlet;

import com.fasterxml.jackson.databind.ObjectMapper;

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;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        response.setContentType("text/html;charset=utf-8");
        //设置响应的数据格式为json
        response.setContentType("application/json;charset=utf-8");
        //1.获取用户名
        String username = request.getParameter("username");
        //2.调用service层判断用户名是否存在
        //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
        //                            {"userExsit":false,"msg":"此用户名可用"}
        Map<String ,Object> map = new HashMap<String, Object>();
        if("tom".equals(username)){
            //存在
            map.put("userExsit",true);
            map.put("msg","此用户名太受欢迎,请更换一个!");
        }else{
            //不存在
            map.put("userExsit",false);
            map.put("msg","此用户名可用!");
        }

        //将map转为json,并且传递给客户端
        //将map转为json
        ObjectMapper mapper = new ObjectMapper();
        //并且传递给客户端
        mapper.writeValue(response.getWriter(),map);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}
  • 服务器响应的数据,在客户端使用时,要想当做json的数据格式使用。有两种解决方案:
    • 1.$get(type):将最后一个参数type指定为“json”
    • 2.在服务器设置MIME类型
      • response.setContentType(“application/json;charset=utf-8”);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现省市区三级联动的关键是建立好数据库,并且编写好对应的 SQL 语句。以下是一个简单的数据库设计: - 省份表 province,包括字段 id 和 name。 - 城市表 city,包括字段 id、name 和省份的外键 province_id。 - 区县表 district,包括字段 id、name 和城市的外键 city_id。 接下来是建表语句: ```sql -- 省份表 CREATE TABLE `province` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 城市表 CREATE TABLE `city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `province_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `province_id` (`province_id`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `province` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 区县表 CREATE TABLE `district` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `city_id` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `city_id` (`city_id`), CONSTRAINT `district_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 接下来是查询省份、城市、区县的 SQL 语句: ```sql -- 查询所有省份 SELECT id, name FROM province; -- 查询某个省份下的所有城市 SELECT id, name FROM city WHERE province_id = ?; -- 查询某个城市下的所有区县 SELECT id, name FROM district WHERE city_id = ?; ``` 在 Java Web 项目中,可以使用 Ajax 和 JSON 技术实现省市区三级联动。前端页面发送 Ajax 请求,后端通过 JDBC 连接数据库,查询对应的省份、城市、区县信息,并以 JSON 格式返回给前端页面。前端页面再解析 JSON 数据,更新页面的省份、城市、区县下拉框选项。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值