02.ajax介绍与应用场景【理解】
浏览器请求服务器获取资源数据包含2种方式:
1.页面有刷新请求服务器资源数据,我们之前使用的方式。
2.页面无刷新请求服务器资源数据,那么什么是无刷新请求呢?就是Ajax
ajax介绍
***A***synchronous ***J***avaScript ***A***nd ***X***ML(异步的JavaScript和XML)。使用ajax可以进行异步请求,无刷新获取服务器的数据。以前是浏览器发送有刷新同步请求,现在是js发送无刷新异步请求。
异步无刷新AJAX应用场景
-
异步检验用户名
-
内容自动补全
小结
-
什么是ajax?
无刷新技术,局部刷新,js发送异步请求,异步无刷新技术
03.同步与异步请求区别和ajax实现原理过程【理解】
同步与异步请求区别
同步方式发送请求
浏览器发送请求,服务器处理(用户处于等待),服务器返回数据给浏览器,浏览器加载整个页面
异步方式发送请求
js发送异步请求,服务器处理(用户不需要等待),服务器返回的数据给js,js操作dom更新局部页面,也叫局部刷新
04.原生js实现ajax案例1-servlet处理异步校验请求【应用】
需求
实现用户注册功能异步校验用户名是否存在
效果
注册页面素材
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>
用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
//目标:提交异步请求验证用户名是否已被注册
</script>
</body>
</html>
实现步骤
服务器返回true,代表已被注册
服务器返回false,代表可以使用
CheckUserNameServlet代码
package com.itheima.web;
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;
@WebServlet(name = "CheckUserNameServlet",urlPatterns = "/CheckUserNameServlet")
public class CheckUserNameServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求数据username
String username = request.getParameter("username");
//2.校验用户名是否为admin
if("admin".equals(username)) {
//3.是admin,返回true,代表用户名已被注册
response.getWriter().write("true");
}else {
//4.不是,返回false,代表用户名可以使用
response.getWriter().write("false");
}
}
}
05.原生js实现ajax案例2-前端发送异步请求与更新页面【了解】
发送异步请求语法
原生api方法,原生异步核心js对象XMLHttpRequest
ajax连接状态
// readyState存有ajax连接状态,从 0 到 4 发生变化。
// 0: 请求未初始化
// 1: 服务器连接已建立
// 2: 请求已接收
// 3: 请求处理中
// 4: 请求已完成,且响应已就绪
实现代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>
用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
//目标:提交异步请求验证用户名是否已被注册
//1.给文本框注册失去焦点事件
document.getElementById("username").onblur=function () {
//2.获取输入的用户名
var username = this.value;
//3.用户名有值,发送异步请求
if(username){
//4.发送异步请求
//4.1 创建ajax引擎对象【重点】
var xmlHttp = new XMLHttpRequest();
//4.2 设置异步请求回调函数,用于获取服务器返回的数据更新到页面上
xmlHttp.onreadystatechange = function () {
//获取服务器返回的数据有2个前提:
// 1.ajax引擎与服务器通信状态readyState=4, 代表获取服务器响应的数据完成
// 2.http协议通信状态码status=200, 代表通信正常
if(xmlHttp.readyState==4 && xmlHttp.status==200){
//获取服务器返回的数据
var isRegister = xmlHttp.responseText;//返回数据有:"true"或“false”
if(isRegister=="true"){
//如果服务器返回“true”,显示已被注册
document.getElementById("info").innerHTML="已被注册";
}else{
//如果服务器返回“false”,显示可以使用
document.getElementById("info").innerHTML="可以使用";
}
}
};
//4.3 初始化请求,设置请求提交数据方法、访问服务器的资源路径
xmlHttp.open("get","CheckUserNameServlet?username="+username,true);
// 参数1:设置提交请求数据的方法,get或post
// 参数2:访问服务器的资源路径
// 参数3:设置是否异步提交请求,true代表异步,并且是默认值,可以省略
//4.4 发送异步请求
xmlHttp.send();
}
}
</script>
</body>
</html>
小结
-
ajax引擎核心操作对象叫什么?
XMLHttpRequest
-
服务器处理异步请求返回数据给前端,前端如何将数据更新到页面上?
js操作dom
06.原生js实现ajax案例3-调试测试运行【应用】
目标
使用debug调试条码运行,观察整个异步发送请求、服务器处理、js更新页面的运行过程。
实现步骤
前端调试
-
使用浏览器的开发者工具
-
设置断点
-
每一行运行
后端调试
-
设置断点
-
每一行运行
小结
-
如何调试知道前端发送异步请求成功了?
在后端设置断点,并能进入运行
-
如何调试知道服务器成功处理了异步请求?
在前端回调函数里面设置断点,并能进入运行
07.jq实现ajax的五种方式1-全局对象get方法【应用】
jq五种常用ajax方法语法
实现代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<p>
用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
//目标:提交异步请求验证用户名是否已被注册
//1.给文本框注册失去焦点事件
$("#username").blur(function () {
//2.获取输入的用户名
var username = $(this).val();
//3.用户名有值,发送异步请求
if(username){
//4.使用jquery的全局get方法发送异步请求
/*
* 语法:
* $.get(url[,data][,callback][,type]);
* 参数1:url,设置提交请求的服务器资源路径地址
* 参数2:data,提交的请求数据,支持2中提交数据格式:
* 格式1:键值对的字符串格式,"key1=value1&key2=value2..."
* 格式2:js对象格式(json对象)格式,{key1:value1,key2:value2,...}
* 参数3:callback,服务返回数据成功的回调函数
* 参数4:type,设置服务返回的数据类型,默认返回文本字符串
* type="text",默认值,返回的文本字符串
* type="html",默认值,返回的文本html代码
* type="scripts",默认值,返回的文本js代码
* type="xml",默认值,返回的文本xml数据
* type="json",默认值,返回的文本json字符串数据,jquery并且将其转换为js对象(json对象)
* json字符串='{"key1":value1,"key2":value2,....}'; json字符串格式规范要求里面的key必须使用双引号括起来
* 这里会将其服务器发很好的json字符串转换为json对象={key1:value1,key2:value2,...}
* 疑问:返回js对象有什么好处?答:方便解析数据,格式=对象.属性名 获取数据
* 例子:var person={username:"张三",age:20}
* 获取张三格式,person.username
*
* 注意:此方法url参数是必须有的,其他参数可有可无
* */
$.get(
"CheckUserNameServlet",//服务器资源地址
"username="+username,//提交的请求数据
function (isRegister) { //服务器成功返回数据的回调函数
//isRegister是服务器返回的数据
if(isRegister=="true"){
//如果服务器返回“true”,显示已被注册
$("#info").html("已被注册");
}else{
//如果服务器返回“false”,显示可以使用
$("#info").html("可以使用");
}
}
);
}
});
</script>
</body>
</html>
小结
-
get异步请求的参数有几个?哪一个参数是必须的?
4个,url是必须的。
-
异步请求传递请求参数数据格式有几种?分别是什么?
2种
格式1:以key=value字符串形式,例如:'key1=value1&key2=value2...' 格式2:json普通对象格式,{key1:value1,key2:value2}
08.jq实现ajax的五种方式2-全局对象post方法【应用】
实现步骤
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<p>
用户名:<input type="text" id="username" name="username"><span id="info"></span>
</p>
<script type="text/javascript">
//目标:提交异步请求验证用户名是否已被注册
//1.给用户名文本框注册失去焦点事件
$("#username").blur(function () {
//2.获取输入的用户名
var username = $(this).val();
//3.校验用户名是否有值
if(username){
//4.用户名有值提交异步请求【jquery的post方法实现ajax异步请求】
/*
* 语法:$.post(url[,data][,callback][,type]);
* 参数1: url, 设置服务器资源地址,这是必须的参数
* 参数2: data, 设置提交的请求数据,支持2种格式
* 格式1:键值对的字符串形式,eg:"key1=value1&key2=value2..."
* 格式2:js对象方式(json对象),eg:{key1:value1,key2:value2,...}
* 参数3: callback, 设置成功的回调函数
* 格式:function(result){...}
* result是服务器返回的结果,使用一个参数接收
* 参数4:设置服务器返回数据的类型,默认文本字符串
* type="xml",设置服务器返回xml格式的字符串
* type="text",设置服务器返回文本字符串,默认值
* type="script",设置服务器返回javascript字符串
* type="html",设置服务器返回html格式字符串
* type="json",设置服务器返回json格式字符串,并将其转换为json对象(js对象)
* json格式字符串:'{"key1":value1,"key2":value2,...}' 注意:要求json字符串里面的可以必须使用双引号括起来
* */
$.post(
"CheckUserNameServlet",
{name:username},
function (result) {
//更新页面显示
//result有2个值true或false字符串
if(result=="true"){
//页面显示“已被注册”
$("#info").text("已被注册");
}else{
//页面显示“可以使用”
$("#info").text("可以使用");
}
}
);
}
});
</script>
</body>
</html>
小结
-
post提交异步请求比get好在哪里?
提交数据大小没有限制
09.jq实现ajax的五种方式3-全局对象ajax方法【应用】
目标
实现异步登录
效果
页面素材
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post" id="loginForm">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" id="username" placeholder="请输入用户名"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" id="password" placeholder="请输入密码"/></td>
</tr>
<tr>
<td colspan="2"><input type="button" value="登录" id="btnLogin"/></td>
</tr>
</table>
</form>
<script type="text/javascript">
</script>
</body>
</html>
ajax方法语法
* 语法:$.ajax(json对象) --api文档写法$.ajax([settings])
* json对象常用属性如下:
* url 服务器访问地址
async 设置后台发送类型,是异步或同步发送。通常省略
默认值:true,异步发送请求
data 发送给服务器的数据的格式
格式1:键=值
格式2:{键:值} 里面可以有多个键值对
method 发送请求的方式:GET或POST,早期的版本这个属性叫:type
默认的请求方式,GET方式
dataType 服务器返回的数据类型
取值可以是 xml, html, script, json, text, _default等
success 服务器响应成功以后调用的回调函数
回调函数的参数是服务器返回的数据
error 如果服务器出现异常调用这个函数
实现代码
LoginServlet代码
package com.itheima.web;
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;
@WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int a=1/0;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求数据username和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.校验用户名必须为admin,密码必须为123
if("admin".equals(username) && "123".equals(password)) {
//3.校验通过,返回true,代表登录成功
response.getWriter().write("true");
}else {
//4.校验失败,返回false,代表登录失败
response.getWriter().write("false");
}
}
}
04.jquery_ajax_ajax.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
<h2>用户登录</h2>
<form action="login" method="post" id="loginForm">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" id="username" placeholder="请输入用户名"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password" id="password" placeholder="请输入密码"/></td>
</tr>
<tr>
<td colspan="2"><input type="button" value="登录" id="btnLogin"/></td>
</tr>
</table>
</form>
<script type="text/javascript">
//1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
$("#btnLogin").click(function () {
//2.获取用户名与密码
var username = $("#username").val();
var password = $("#password").val();
//3.使用jquery的ajax全局方法提交异步请求
/*
* 语法:$.ajax(json对象)
* 这个全局方法参数json对象常用的属性如下:
* url 服务器访问地址
async 设置后台发送类型,是异步或同步发送。通常省略
默认值:true,异步发送请求
data 发送给服务器的数据的格式
格式1:键=值
格式2:{键:值} 里面可以有多个键值对
method 发送请求的方式:GET或POST,早期的版本这个属性叫:type
默认的请求方式,GET方式
dataType 服务器返回的数据类型
取值可以是 xml, html, script, json, text, _default等
success 服务器响应成功以后调用的回调函数
回调函数的参数是服务器返回的数据
error 如果服务器出现异常调用这个函数
* 总结:ajax全局方法功能比全局的get,post方法强大如下:
* 1.ajax全局方法可以设置是否异步,全局get,post只能异步
* 2.ajax全局方法可以设置错误回调函数,全局get,post只有成功回调函数
* */
$.ajax({
url:"LoginServlet",
data:{username:username,password:password},
method:"post",
success:function (isLogin) {
//isLogin服务器返回数据“true”或“false”
if("true"==isLogin){
//返回“true”,代表登录成功
alert(username+"登录成功了");
}else {
//返回“false”,代表登录失败
alert(username+"登录失败");
}
},
error:function () {
alert("服务器忙。。。"); //简单输出消息,以后会跳转到友好页面显示
}
});
});
</script>
</body>
</html>
小结
-
ajax方法发送异步请求比get/post方法更好在什么地方?
功能多
可以传入是否是发送异步请求
服务器发生异常的错误回调函数
10.jq3.0新增get-post签名方法发送异步请求【应用】
get签名方法方式
<script type="text/javascript">
//1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
$("#btnLogin").click(function () {
//2.获取用户名与密码
var username = $("#username").val();
var password = $("#password").val();
//3.使用jquery的get全局方法提交异步请求
/*
* 语法:$.get(json对象) 由于明确写了get,所以叫get签名方法
*
* 这个全局方法参数json对象常用的属性如下:
* url 服务器访问地址
async 设置后台发送类型,是异步或同步发送。通常省略
默认值:true,异步发送请求
data 发送给服务器的数据的格式
格式1:键=值
格式2:{键:值} 里面可以有多个键值对
dataType 服务器返回的数据类型
取值可以是 xml, html, script, json, text, _default等
success 服务器响应成功以后调用的回调函数
回调函数的参数是服务器返回的数据
error 如果服务器出现异常调用这个函数
* 总结:jquery3.0新特性get全局方法与ajax全局方法功能对比如下:
* 新特性方法少写method参数,达到了简化,可读性更强
* */
$.get({
url:"LoginServlet",
data:{username:username,password:password},
success:function (isLogin) {
//isLogin服务器返回数据“true”或“false”
if("true"==isLogin){
//返回“true”,代表登录成功
alert(username+"登录成功了");
}else {
//返回“false”,代表登录失败
alert(username+"登录失败");
}
},
error:function () {
alert("服务器忙。。。"); //简单输出消息,以后会跳转到友好页面显示
}
});
});
</script>
post签名方法方式【推荐使用】
<script type="text/javascript">
//1.给登录按钮注册点击事件【注意,不可以使用表单的提交事件,因为提交是有刷新请求】
$("#btnLogin").click(function () {
//2.获取用户名与密码
var username = $("#username").val();
var password = $("#password").val();
//3.使用jquery的post全局方法提交异步请求
/*
* 语法:$.post(json对象) 由于明确写了post,所以叫post签名方法【推荐使用】
*
* 这个全局方法参数json对象常用的属性如下:
* url 服务器访问地址
async 设置后台发送类型,是异步或同步发送。通常省略
默认值:true,异步发送请求
data 发送给服务器的数据的格式
格式1:键=值
格式2:{键:值} 里面可以有多个键值对
dataType 服务器返回的数据类型
取值可以是 xml, html, script, json, text, _default等
success 服务器响应成功以后调用的回调函数
回调函数的参数是服务器返回的数据
error 如果服务器出现异常调用这个函数
* 总结:jquery3.0新特性post全局方法与ajax全局方法功能对比如下:
* 新特性方法少写method参数,达到了简化,可读性更强
* */
$.post({
url:"LoginServlet",
data:{username:username,password:password},
success:function (isLogin) {
//isLogin服务器返回数据“true”或“false”
if("true"==isLogin){
//返回“true”,代表登录成功
alert(username+"登录成功了");
}else {
//返回“false”,代表登录失败
alert(username+"登录失败");
}
},
error:function () {
alert("服务器忙。。。"); //简单输出消息,以后会跳转到友好页面显示
}
});
});
</script>
小结
-
jq3.0新增get/post签名方法比原有ajax方法更好在什么地方?
简化了请求方式的设置,少设置一个参数