AJAX
一、概述
概念:Asynchronous JavaScript And XML 异步的JavaScript和XML
-
本身不是一种新技术,而是多个技术综合。用于快速创建动态网页的技术。
-
一般的网页如果需要更新内容,必需重新加载个页面。
-
而 AJAX 通过浏览器与服务器进行少量数据交换,就可以使网页实现异步更新。也就是在不重新加载整个页
面的情况下,对网页的部分内容进行局部更新。
同步和异步的区别
-
同步方式:正常情况下,浏览器与服务器之间是串行操作,类似于一个Java线程的操作。
-
异步方式:浏览器与服务器是并行操作,类似于Java中多个线路同时工作。
ajax使用的技术
- JavaScript:用于后台发送数据给服务器,并且对服务器返回的结果进行处理
- XML:用于接收服务器返回的数据,但是已经被JSON格式代替。
二、原生JavaScript实现AJAX
流程说明:
- 用户在浏览器端由JS创建一个对象XMLHttpRequest对象
- 这个对象是ajax的核心对象,由它发送请求给服务器
- 将请求的数据发送到服务器
- 在服务器处理数据,从数据库中查询用户是否存在,通过XML(JSON)把数据返回
- 在回调函数中得到服务器返回的数据,使用HTML和CSS更新页面的信息
- 核心对象:XMLHttpRequest
用于在后台与服务器交换数据。可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
- 打开链接:open(method,url,async)
method:请求的类型 GET 或 POST。
url:请求资源的路径。
async:true(异步) 或 false(同步)。
-
发送请求:send(String params)
params:请求的参数(POST 专用)。
-
处理响应:onreadystatechange
readyState:0-请求未初始化,1-服务器连接已建立,2-请求已接收,3-请求处理中,4-请求已完成,且 响应已就绪。
status:200-响应已全部 OK。
-
获得响应数据形式
responseText:获得字符串形式的响应数据。
responseXML:获得 XML 形式的响应数据。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户是否存在</title>
</head>
<body>
用户名:<input type="text" id="user"> <span id="info"></span>
<script type="text/javascript">
/*用户注册时输入一个用户名,失去焦点以后,通过ajax后台判断用户名是否存在。
服务器先不访问数据库,直接判断用户名,如果用户名为newboy,则表示用户已经存在,否则用户名可以注册使用。 */
//用户名的改变事件
document.getElementById("user").onchange = function () {
//创建XMLHttpRequest对象
let request = new XMLHttpRequest();
//打开服务器的连接,参数:GET或POST,服务器地址,true
request.open("GET", "json/users.json", true);
//发送请求给服务器
request.send();
//设置回调函数,准备状态发生改变时激活这个函数
request.onreadystatechange = function () {
//准备状态等于4,服务器状态码等于200
if (request.readyState == 4 && request.status == 200) {
//接收服务器返回的数据
let text = request.responseText; //字符串
//将字符串转成JSON
let users = JSON.parse(text); //所有用户的数组
//得到用户在文本框中输入的数据
let user = document.getElementById("user").value;
//设置标记
let exists = false;
//遍历服务器返回的数组
for (let u of users) {
if (u == user) { //当前元素等于输入的用户名
exists = true; //修改标记
break;
}
}
//判断标记
if (exists) { //用户名已经存在
document.getElementById("info").innerText = "用户名已经存在";
}
else { //不存在
document.getElementById("info").innerText = "恭喜,可以注册";
}
}
}
}
</script>
</body>
</html>
三、jQuery实现ajax
jQuery 的 GET 方式实现 AJAX
核心语法:$.get(url,[data],[callback],[type]);
url:请求的资源路径。
data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
jQuery 的 POST 方式实现 AJAX
核心语法:$.post(url,[data],[callback],[type]);
url:请求的资源路径。
data:发送给服务器端的请求参数,格式可以是key=value,也可以是 js 对象。
callback:当请求成功后的回调函数,可以在函数中编写我们的逻辑代码。
type:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
区别: 两者的使用方法是一致的,但是本质上的实现方式是不一样的。get是将参数拼接到地址栏上的,post是将请求参数放在请求体中进行发送的。
演示案例(get)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户是否存在</title>
<script src="js/jquery-3.3.1.js"></script>
</head>
<body>
用户名:<input type="text" id="user"> <span id="info"></span>
<script type="text/javascript">
/*
用户注册时输入一个用户名,失去焦点以后,通过ajax后台判断用户名是否存在。
服务器先不访问数据库,直接判断用户名,如果用户名为newboy,则表示用户已经存在,否则用户名可以注册使用。
$.get(url,data,callback,type) $.post(url,data,callback,type)
只有第1个是必须的选项
1. url: 表示请求服务器地址
2. data: 发送给服务器的数据
格式1:键1=值2&键2=值2
格式2:{键:值,键:值}
3. callback:回调函数,参数是服务器返回的数据
4. type:从服务器返回的数据类型,默认是字符串类型
取值:xml, html, script, json, text
*/
//用户名的改变事件
$("#user").change(function () {
//访问服务器获取数据,参数是服务器返回的数据,返回的类型是json格式
$.get("json/users.json", function (users) {
//判断用户名是否存在
let user = $("#user").val(); //得到文本框的值
//1.设置标记
let exists = false;
//2.遍历数组,查找名字是否存在
for (let u of users) {
if (u == user) {
exists = true; //找到
break;
}
}
//3.根据查找的结果显示信息
if (exists) { //用户存在
$("#info").text("用户名已经存在");
}
else {
$("#info").text("恭喜可以注册");
}
},"json");
});
</script>
</body>
</html>
jQuery 的通用方式实现 AJAX
核心语法:$.ajax({name:value,name:value,…});
url:请求的资源路径。
async:是否异步请求,true-是,false-否 (默认是 true)。
data:发送到服务器的数据,可以是键值对形式,也可以是 js 对象形式。
type:请求方式,POST 或 GET (默认是 GET)。
dataType:预期的返回数据的类型,取值可以是 xml, html, js, json, text等。
success:请求成功时调用的回调函数。
error:请求失败时调用的回调函数。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<script src="js/jquery-3.3.1.js"></script>
</head>
<body>
<h2>用户登录</h2>
<form id="loginForm">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" id="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" id="password"/></td>
</tr>
<tr>
<!--登录按钮是一个普通按钮-->
<td colspan="2" align="center"><input type="button" value="登录" id="btnLogin"/></td>
</tr>
</table>
</form>
<script type="text/javascript">
/*
$.ajax({键:值,键:值})
url : 服务器访问地址
async :默认是异步,取值是true,设置为false表示同步
异步:不会等服务器处理完,会一直向后执行
同步:等服务器处理完毕,才执行后面的JS代码
method: GET或POST方法,默认是get方法
data : 发送给服务器的数据,2种格式:1. 键=值&键=值 2. {键:值, 键:值}
dataType : 服务器返回的数据类型<br />取值:xml, html, script, json, text
success : 服务器正常响应的回调函数,参数就是服务器返回的数据
error : 服务器出现异常的回调函数,参数是XMLHttpRequest对象
*/
//登录按钮的点击事件
$("#btnLogin").click(function () {
//1.获取用户输入的用户名和密码
let username = $("#username").val();
let password = $("#password").val();
//2.使用$.ajax访问服务器
$.ajax({
url: "json/login.json",
data: "a=1&b=2", //发送的数据,可以在浏览器上按f12,选network可以看到
//async: false, //默认是true,表示异步
//服务器正常响应的回调函数,参数就是返回的用户数据
success: function (users) {
let exists = false;
//遍历数组中每个用户
for (let user of users) {
//比较用户名和密码是否相同
if (user.name == username && user.password == password) {
exists = true;
break;
}
}
//输出登录成功或失败
if (exists) {
alert("登录成功,欢迎您:" + username);
}
else {
alert("登录失败,请重试");
}
},
dataType: "json", //指定返回数据类型是json
error: function (request) { //出现异常回调函数,参数是XMLHttpRequest对象
alert("服务器出现异常,状态码是:" + request.status);
}
});
//alert("浏览器端的代码继续执行"); //不会等服务器处理完,会一直向后执行
});
</script>
</body>
</html>
JSON
- JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。
- 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于计算机解析和生成,并有效的提升网络传输效率。
JSON 的处理
- 我们除了可以在 JavaScript 中来使用 JSON 以外,在 JAVA 中同样也可以使用 JSON。
- JSON 的转换工具是通过 JAVA 封装好的一些 JAR 工具包。
- 可以将 JAVA 对象或集合转换成 JSON 格式的字符串,也可以将 JSON 格式的字符串转成 JAVA 对象。
- Jackson:开源免费的 JSON 转换工具,SpringMVC 转换默认使用 Jackson。
需要的jar包:
当集合里面使用的是自定义对象时,就需要使用 TypeReference
方法演示:
//User对象转json
User user = new User("张三",23);
String json = mapper.writeValueAsString(user);
System.out.println("json字符串:" + json);
//json转User对象
User user2 = mapper.readValue(json, User.class);
System.out.println("java对象:" + user2);
//--------------------------------------------------
//map<String,String>转json
HashMap<String,String> map = new HashMap<>();
map.put("姓名","张三");
map.put("性别","男");
String json = mapper.writeValueAsString(map);
System.out.println("json字符串:" + json);
//json转map<String,String>
HashMap<String,String> map2 = mapper.readValue(json, HashMap.class);
System.out.println("java对象:" + map2);
//----------------------------------------------------
//map<String,User>转json
HashMap<String,User> map = new HashMap<>();
map.put("黑马一班",new User("张三",23));
map.put("黑马二班",new User("李四",24));
String json = mapper.writeValueAsString(map);
System.out.println("json字符串:" + json);
//json转map<String,User>
//因为Map集合的值使用的是自定义对象,所以在json转map时需要使用TypeReference方法
HashMap<String,User> map3 = mapper.readValue(json,new TypeReference<HashMap<String,User>>(){});
System.out.println("java对象:" + map3);
搜索框联想Demo
浏览器端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户搜索</title>
<style type="text/css">
.content {
width: 643px;
margin: 100px auto;
text-align: center;
}
input[type='text'] {
width: 530px;
height: 40px;
font-size: 14px;
}
input[type='button'] {
width: 100px;
height: 46px;
background: #38f;
border: 0;
color: #fff;
font-size: 15px
}
.show {
position: absolute;
width: 535px;
height: 100px;
border: 1px solid #999;
border-top: 0;
display: none;
}
</style>
</head>
<body>
<form autocomplete="off">
<div class="content">
<img src="img/logo.jpg">
<br/><br/>
<input type="text" id="username">
<input type="button" value="搜索一下">
<!--用于显示联想的数据-->
<div id="show" class="show"></div>
</div>
</form>
</body>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
//1.为用户名输入框绑定鼠标点击事件
$("#username").mousedown(function () {
//2.获取输入的用户名
let username = $("#username").val();
//3.判断用户名是否为空
if(username == null || username == "") {
//4.如果为空,将联想框隐藏
$("#show").hide();
return;
}
//5.如果不为空,发送AJAX请求。并将数据显示到联想框
$.ajax({
//请求的资源路径
url:"userServlet",
//请求参数
data:{"username":username},
//请求方式
type:"POST",
//响应数据形式
dataType:"json",
//请求成功后的回调函数
success:function (data) {
//将返回的数据显示到show的div
let names = "";
for(let i = 0; i < data.length; i++) {
names += "<div>"+data[i].name+"</div>";
}
$("#show").html(names);
$("#show").show();
}
});
});
</script>
</html>
控制层代码,省略的 service 和dao代码
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求和响应的编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//1.获取请求参数
String username = req.getParameter("username");
//2.调用业务层的模糊查询方法得到数据
UserService service = new UserServiceImpl();
List<User> users = service.selectLike(username);
//3.将数据转成JSON,响应到客户端
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(users);
resp.getWriter().write(json);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
}