AJAX 一、概述 AJAX,Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。它并不是新的编程语言,而是一种用于创建快速动态网页 的技术。
此处的异步与同步分别指,在客户端和服务器端相互通信的基础上,
同步:客户端必须等待服务器端的响应,在等待的期间客户端不能做其他操作; 异步:客户端无需等待服务器端的响应,在服务器处理请求的过程中,客户端可进行其他的操作。 AJAX ,故其最大的优点 为,不重新加载 整个页面的情况下,可与服务器进行少量数据交换并更新部分网页内容。AJAX,不需要任何浏览器插件,但需用户允许 JavaScript 在浏览器上执行。
AJAX,是基于现有的 Internet 标准,并且联合使用它们:
XMLHttpRequest 对象 (异步的与服务器交换数据)JavaScript / DOM(信息显示/交互) CSS(给数据定义格式) XML(作为转换数据的格式) 二、原生的JS实现方式 1. 创建核心对象(固定格式): 所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。IE5 和 IE6 使用 ActiveXObject
1 2 3 4 5 6 7 8 9 var xmlhttp;if (window .XMLHttpRequest ){ xmlhttp=new XMLHttpRequest (); }else { xmlhttp=new ActiveXObject ("Microsoft.XMLHTTP" ); }
2. 建立连接: 1 open (method, url, async )
(XMLHttpRequest 的方法)其三种参数:
method:请求的类型POST:请求参数 需在**send()**方法中定义 GET:请求参数在 URL 后边拼接。send() 方法为空参 url:文件在服务器上的位置async:若值为 true,则异步;若值为 false,则同步,此时 JavaScript 会等到服务器响应 就绪才继续执行(若服务器繁忙或缓慢,应用程序会挂起或停止)举例如下:
1 xmlhttp.open ("GET" , "ajaxServlet?username=Tom" , true );
3. 发送请求: 其中 string 参数仅用于 POST 请求,GET 请求无需传参。
4. 接收并处理来自服务器的响应结果:(固定格式) 当服务器响应成功时,可用XMLHttpRequest 对象的属性来获得字符串 形式的响应数据:
其固定格式如下:
1 2 3 4 5 6 7 8 xmlhttp.onreadystatechange =function ( ){ if (xmlhttp.readyState ==4 && xmlhttp.status ==200 ){ var responseText = xmlhttp.responseText ; } }
属性 描述 onreadystatechange存储函数对象(或函数名),每当 readyState 属性 改变时,就会调用该函数。 readyState存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。0: 请求未初始化;1: 服务器连接已建立;2: 请求 已接收;3: 请求处理中;4: 请求已完成,且响应已就绪 status200: “OK”;404: 未找到页面
综上,完整的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function fun ( ) { var xmlhttp; if (window .XMLHttpRequest ){ xmlhttp=new XMLHttpRequest (); } else { xmlhttp=new ActiveXObject ("Microsoft.XMLHTTP" ); } xmlhttp.open ("GET" ,"ajaxServlet?username=tom" ,true ); xmlhttp.send (); xmlhttp.onreadystatechange =function ( ){ if (xmlhttp.readyState ==4 && xmlhttp.status ==200 ){ var responseText = xmlhttp.responseText ; } } }
三、jQuery实现方式 jQuery 提供了三个简便的方法,来发送异步请求。
方法一 $.ajax({键值对1, 键值对2, ... })
举例如下:
1 2 3 4 5 6 7 8 9 10 11 12 $.ajax ({ url :"ajaxServlet" , type :"POST" , data :{"username" :"Luffy" , "age" :20 }, success :function (date ){ }, error :function ( ){ }, dataType :"text" });
方法二 $.get(url, [data], [callback], [type]):发送 GET 请求
url:请求路径data:请求参数callback:回调函数type:响应结果的类型举例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > Title</title > <script src ="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" > </script > <script > function fun ( ) { $.get ("ajaxServlet" ,{username :"rose" },function (data ) { alert (data); },"text" ); } </script > </head > <body > <input type ="button" value ="发送异步请求" onclick ="fun();" > <input > </body > </html >
方法三 $.post(url, [data], [callback], [type]):发送 POST 请求
JSON 一、概述 JSON(J avaS cript O bject N otation,JavaScript 对象表示法)是用于将结构化数据 表示为 JavaScript 对象的标准格式。
它通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。JSON 解析器和 JSON 库支持许多不同的编程语言。
它可以作为一个对象或者字符串存在,又可以被储存在它自己的文件中,一个文本文件,拓展名为:.json。其 MIME 类型为 application/json
和 XML 相比,JSON 具有自我描述性 。但不同之处在于,JSON 更短,且读写的速度更快。
二、语法 1. 语法规则 2. 获取数据 (一)json对象.键名,如:
1 2 var person = {"name" :"Luffy" , "age" :20 , "adult" :true };var name = person.name ;
(二)json对象["键名"]
1 var name = person["name" ];
(三)数组对象[索引]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var school = { "persons" :[ {"name" :"Luffy" , "age" :20 , "adult" :true }, {"name" :"Nami" , "age" :19 , "adult" :true }, {"name" :"Zoro" , "age" :25 , "adult" :true } ] };var name = school.persons [2 ].name ;var persons = [ {"name" :"Luffy" , "age" :20 , "adult" :true }, {"name" :"Nami" , "age" :19 , "adult" :true }, {"name" :"Zoro" , "age" :25 , "adult" :true } ];var name2 = persons[1 ].name ;
(四)遍历:举例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var person = {"name" :"Luffy" , "age" :20 , "adult" :true };for (var key in person){ alert (key + ":" + person[key]); };var persons = [ {"name" :"Luffy" , "age" :20 , "adult" :true }, {"name" :"Nami" , "age" :19 , "adult" :true }, {"name" :"Zoro" , "age" :25 , "adult" :true } ];for (var i = 0 ; i < persons.length ; i++){ var pe = persons[i]; for (var key in pe){ alert (key + ":" + pe[key]); } }
三、JSON数据和Java对象的相互转换 1. JSON解析器 常见的解析器:Jsonlib,Gson,fastjson,jackson
2. 导入 jackson 相关 jar 包 3. JSON 转为 Java 对象 (一)导入 jackson 的相关 jar 包后,创建 Jackson 核心对象 ObjectMapper
(二)调用 ObjectMapper 的相关方法进行转换:
readValue(json字符串数据, Class)1 2 3 String jsonStr = "{\"name\":\"Luffy\", \"age\":20, \"adult\":true}" ;ObjectMapper mapper = new ObjectMapper ();Person person = mapper.readValue(json, Person.class);
4. Java 对象转换 JSON (一)导入 jackson 的相关 jar 包后,创建 Jackson 核心对象 ObjectMapper
1 ObjectMapper mapper = new ObjectMapper ();
(二)调用 ObjectMapper 的相关方法进行转换:
转换方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Person p = new Person (); p.setName("Luffy" ); p.setAge(20 ); p.setAdult(true );ObjectMapper mapper = new ObjectMapper ();String jsonStr = mapper.writeValueAsString(p); System.out.println(jsonStr); mapper.writeValue(new File ("D://233.txt" ), p); mapper.writeValue(new FileWriter ("D://233.txt" ), p);
注解:
@JsonIgnore:排除被注解的属性,该属性将来不会被转换为 JSON 对象中的一个属性。@JsonFormat:属性值格式化1 2 3 4 5 6 7 8 9 10 11 12 13 public class Person { private String name; private int age; private boolean adult; @JsonIgnore private double score; @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; }
案例:校验用户名是否存在 客户端要想将服务器响应的数据作为JSON数据来使用,有两种解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 注册</title > <script src ="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" > </script > <script > $(function ( ){ $("#username" ).blur (function ( ) { var username = $(this ).val (); $.get ("findUserServlet" , {username :username}, function (data ) { var span = $("#legality_username" ); if (data.isExist ){ span.css ("color" , "#e74c3c" ); } else { span.css ("color" , "#52c41a" ); } span.html (data.msg ); }); }) }) </script > </head > <body > <form > <input type = "text" id = "username" name = "username" placeholder ="请输入您的用户名" > <span id = "legality_username" > </span > <br > <input type = "password" name = "password" placeholder ="请输入您的密码" > <br > <input type = "submit" value = "注册" > <br > </form > </body > </html >
findUserServlet.java 文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 package top.JoyDee.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 { String username = request.getParameter("username" ); response.setContentType("application/json;charset=utf-8" ); Map<String, Object> mymap = new HashMap <String, Object>(); if ("Luffy" .equals(username)){ mymap.put("isExist" , true ); mymap.put("msg" , "此用户名已被使用,请更换一个" ); } else { mymap.put("isExist" , false ); mymap.put("msg" , "用户名可用" ); } ObjectMapper mapper = new ObjectMapper (); mapper.writeValue(response.getWriter(), mymap); } protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doPost(request, response); } }