AI智能
改变未来

AJAX & JSON


AJAX:

  1. 概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML

    异步和同步:客户端和服务器端相互通信的基础上
    * 客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。
    * 客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作。

  2. Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分 网页的技术。
    通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
    传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。
    作用:提升用户的体验

2 实现方式:

  1. 原生的JS实现方式(了解)
//服务器端@WebServlet(\"/ajaxServlet\")public class ajaxServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 获取请求参数String username = request.getParameter(\"username\");//2 处理业务逻辑,耗时try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(username);//3 响应response.getWriter().write(\"hello:\"+username);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
//前端页面<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, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");}//2 建立连接/*method:请求的类型;GET 或 POST* get方式:请求参数在url后拼接,send方法为空参* post方式:请求参数在send方法中定义url:文件在服务器上的位置async:true(异步)或 false(同步)*/xmlhttp.open(\"GET\",\"ajaxServlet?username=tom\",true);//3 发送请求xmlhttp.send();//4 接受并处理来自服务器的响应结果//获取方式:xmlhttp.responseText//什么时候获取?当服务器响应成功后获取//当xmlHttp对象的就绪状态改变时,触发事件onreadystatechangexmlhttp.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 type=\"text\"> <!--当ajax异步时,文本框中数据不会被提交--></body>
  1. JQeury实现方式
  • $.ajax()
//定义方法function fun() {//使用$.ajsx()发送异步请求$.ajax({url:\"ajaxServlet\", //请求路径type:\"POST\",       //请求方式// data:\"username=jack&age=23\",//请求参数data:{\"username\":\"jack\",\"age\":23},  //json数据格式success:function (data) { //data会接受服务器给的响应结果的值//请求相应成功后的回调函数alert(data);},error:function () { //请求出现错误,会执行的回调函数alert(\"出错了...\");},dataType:\"text\"  //设置接受到相应数据的格式});}
  • $.get():发送get请求
  • $.post():发送post请求语法:$.get(url, [data], [callback], [type])参数:
    * url:请求路径
    * data:请求参数
    * callback:回调函数
    * type:响应结果的类型
//get方式function fun() {$.get(\"ajaxServlet\",{username:\"rose\"},function (data) {alert(data);},\"text\");}
//post方式function fun() {$.post(\"ajaxServlet\",{username:\"rose\"},function (data) {alert(data);},\"text\");}

JSON:

  1. 概念: JavaScript Object Notation JavaScript对象表示法
    Person p = new Person();
    p.setName(“张三”);
    p.setAge(23);
    p.setGender(“男”);
    JSON: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 格式
      * 方括号保存数组:[ ]
//1 定义基本格式var person = {\"name\": \"张三\", age: 23, \'gener\': true};//获取name的值// var name = person.name;var name = person[\"name\"];alert(name);// alert(person);//2 嵌套格式 {} --> []var persons = {\"persons\": [{\"name\": \"张三\", \"age\": 23, \"gender\": true},{\"name\": \"李四\", \"age\": 24, \"gender\": true},{\"name\": \"万五\", \"age\": 25, \"gender\": false}]};//获取王五//第一个persons是json,第二个persons是键名,获取值是一个数组,通过索引得到的还是一个json对象,使用name键名获取数据var name1 = persons.persons[2].name;alert(name1);// alert(persons);//3 嵌套格式 [] --> {}var ps = [{\"name\": \"张三\", \"age\": 23, \"gender\": true},{\"name\": \"李四\", \"age\": 24, \"gender\": true},{\"name\": \"万五\", \"age\": 25, \"gender\": false}];//获取李四var name2 = ps[1].name;alert(name2);// alert(ps);
  1. 获取数据:
    1. json对象.键名
    2. json对象[“键名”]
    3. 数组对象[索引]
    4. 遍历
//遍历获取数据var person = {\"name\": \"张三\", age: 23, \'gener\': true};var ps = [{\"name\": \"张三\", \"age\": 23, \"gender\": true},{\"name\": \"李四\", \"age\": 24, \"gender\": true},{\"name\": \"万五\", \"age\": 25, \"gender\": false}];//获取person对象所有键和值//for in循环for(var key in person){//这样的方式获取不行,相当于person.\"name\",因为key默认获取出来是字符串格式// alert(key + \":\" + person.key);alert(key+\":\"+person[key]); //json提供的第二种获取值方式 key ---> json.[\"key\"]}//获取ps中的所有值 --- 双层循环for(var i=0;i<ps.length;i++){var p = ps[i];for(var key in p){alert(key+\":\"+p[key]);}}
  1. JSON数据和Java对象的相互转换
    * JSON解析器:
    常见的解析器:Jsonlib,Gson,fastjson,jackson[ol]

    JSON转为Java对象
    01. 导入jackson的相关jar包
    02. 创建Jackson核心对象 ObjectMapper
    03. 调用ObjectMapper的相关方法进行转换
    * readValue(json字符串数据,Class)

  2. Java对象转换JSON
    * 使用步骤:
    1. 导入jackson的相关jar包
    2. 创建Jackson核心对象 ObjectMapper
    3. 调用ObjectMapper的相关方法进行转换

  • 转换方法:
    * writeValue(参数1,obj):
    参数1:
    – File:将obj对象转换为JSON字符串,并保存到指定的文件中
    – Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
    – OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
    * writeValueAsString(obj):将对象转为json字符串

  • 注解:
    1. @JsonIgnore:排除属性。
    2. @JsonFormat:属性值得格式化
    * @JsonFormat(pattern = “yyyy-MM-dd”)

  • 复杂java对象转换
    1. List:数组
    2. Map:对象格式一致

[/ol]

//Java对象转换JSONpublic class JacksonTest {//Java对象转为json字符串@Testpublic void test1() throws Exception {//1 创建Person对象Person p = new Person();p.setName(\"张三\");p.setAge(23);p.setGender(\"男\");//2 创建jackson的核心对象,ObjectMapperObjectMapper mapper = new ObjectMapper();//3 转换/*转换方法:writeValue(参数1,obj):参数1:方法的重载File:将obj对象转换为json字符串,并保存到指定文件中Writer:将obj对象转换为json字符串,并将json数据填充到字符输出流中OutputStream:将obj对象转换为json字符串,并将json数据填充到字节输出流中writeValueAsString(obj);将对象转为json字符串*/String json = mapper.writeValueAsString(p);  //直接以字符串形式获得//      System.out.println(json); //{\"name\":\"张三\",\"age\":23,\"gender\":\"男\"}//writeValue,将数据写到d://a.txt文件中//      mapper.writeValue(new File(\"d://a.txt\"),p);  //json数据保存到指定文件中//writeValue将数据关联到Writer中//        mapper.writeValue(new FileWriter(\"d://b.txt\"),p);mapper.writeValue(new FileOutputStream(\"d://c.txt\"),p);  //关联到OutputStream}//json数据格式化@Testpublic void test2() throws Exception {//1 创建Person对象Person p = new Person();p.setName(\"张三\");p.setAge(23);p.setGender(\"男\");p.setBirthday(new Date());//转换ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(p);System.out.println(json);  //{\"name\":\"张三\",\"age\":23,\"gender\":\"男\",\"birthday\":1596124268309}//1 使用注解@JsonIgnore:排除属性。  {\"name\":\"张三\",\"age\":23,\"gender\":\"男\"}//2 生日是一个毫秒值,需要转换//@JsonFormat(pattern = \"yyyy-MM-dd\")//{\"name\":\"张三\",\"age\":23,\"gender\":\"男\",\"birthday\":\"2020-07-30\"}}//list集合的转换@Testpublic 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对象List<Person> ps = new ArrayList<Person>();ps.add(p);ps.add(p1);ps.add(p2);//转换ObjectMapper mapper = new ObjectMapper();String json = mapper.writeValueAsString(ps);System.out.println(json);/*[{\"name\":\"张三\",\"age\":23,\"gender\":\"男\",\"birthday\":\"2020-07-30\"},{\"name\":\"张三\",\"age\":23,\"gender\":\"男\",\"birthday\":\"2020-07-30\"},{\"name\":\"张三\",\"age\":23,\"gender\":\"男\",\"birthday\":\"2020-07-30\"}]*/}//map集合的转换@Testpublic void test4() throws Exception {//1 创建Person对象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);  //{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}}//演示json字符串转换为java对象@Testpublic 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);  //Person{name=\'张三\', age=23, gender=\'男\', birthday=null}}}

案例:

  • 校验用户名是否存在
    1. 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
      $.get(type):将最后一个参数type指定为\”json\”
    1. 在服务器端设置MIME类型
      response.setContentType(“application/json;charset=utf-8”);
@WebServlet(\"/findUserServlet\")public class findUserServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 获取用户名String username = request.getParameter(\"username\");//2 调用service层判断用户名是否存在//期望服务器响应回的数据格式,{\"userExit\":true,\"msg\":\"用户名已存在“}{\"userExit\":false,\"msg\":\"用户名可用“}//2.1 设置响应的数据格式为jsonresponse.setContentType(\"application/json;charset=utf-8\");Map<String,Object> map = new HashMap<String, Object>();if(\"tom\".equals(username)){//存在map.put(\"userExit\",true);map.put(\"msg\",\"用户名已存在\");}else {//不存在map.put(\"userExit\",false);map.put(\"msg\",\"用户名可用\");}//3 将map转为json,并且传递给客户端ObjectMapper mapper = new ObjectMapper();mapper.writeValue(response.getWriter(),map);  //response.getWriter()写数据到客户端的流}...}
//在页面加载完成后$(function () {//给username绑定blur事件 -- 焦点失去$(\"#username\").blur(function () {//获取username文本输入框值var username = $(this).val();//发生ajax请求//期望服务器响应回的数据格式,{\"userExit\":true,\"msg\":\"用户名已存在“}{\"userExit\":false,\"msg\":\"用户名可用“}$.get(\"findUserServlet\",{username:username},function (data) {//判断userExit值是否为truevar span = $(\"#s_username\");if(data.userExit){//用户名存在span.css(\"color\",\"red\");span.html(data.msg);}else {//用户名不存在span.css(\"color\",\"green\");span.html(data.msg);}},\"json\"); //1 指定接收类型是json数据//当在服务器端设置响应数据格式后,这个dataType可以省略});});
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » AJAX & JSON