一、同步请求与异步请求
如果提交表单给服务器,当服务器处理完成之后,响应给浏览器,你发现浏览器显示页面时,闪烁了一下。
这种方式不是异步提交,而是同步提交,闪烁是页面整体刷新了。
1、什么是同步,什么是异步
普通B/S模式(同步)AJAX技术(异步)
- 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态。
- 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随意做其他事情,不会被卡死。
2、两种方式有什么不同?
- 同步请求,服务器响应时,页面整体刷新(响应了整个页面)
- 异步请求,服务器响应时,页面局部刷新(响应了字符串或者json)
3、异步请求有什么优点?
异步请求可以提高用户的体验性
4、异步请求应用场景有哪些?
- 用户名检测
- 搜索的自动补全
- 页面的局部刷新
二、js原生的Ajax技术(了解)
1、传统的程序运行原理
用户发送请求,服务器接受请求,处理后返回数据,浏览器接受响应数据,进行显示数据,这个时间就会有处理和接受之间的空闲,导致用户的等待时间。
2、Aajx的程序运行原理
页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,可以一直和Ajax进行交流,减少处理时间。直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面功能。
3、js原生的Ajax
其实就是围绕浏览器内内置的Ajax引擎对象进行学习的,要使用js原生的Ajax完成异步操作,有如下几个步骤:
1)创建Ajax引擎对象
2)为Ajax引擎对象绑定监听(监听服务器已将数据响应给引擎)
3)绑定提交地址
4)发送请求
5)接受响应数据
web\0-base-ajax-index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript">
function clickFn() {
//1)创建Ajax引擎对象
var xmlHttp = new XMLHttpRequest();
//2)为Ajax引擎对象绑定监听(监听服务器已将数据响应给引擎)
//存储函数(或函数名),每当readyState属性改变时,就调用该函数。
xmlHttp.onreadystatechange = function (ev) {
/*readyState:存有XMLHttpRequest的状态。从0到4发生变化。
* 0:请求未初始化;
* 1:服务器连接已建立
* 2:请求已接收
* 3:请求处理中
* 4:请求已完成,且相响应已就绪*/
/*status状态码:
200:"OK",说明服务器正常响应
404:未找到页面*/
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
// 5)接受响应数据
//获取响应数据
alert(xmlHttp.responseText); //response.getWriter().write("hello")
}
}
//3)绑定提交地址
// 参1:表示请求方式
// 参2:表示服务器的资源访问路径,不用加项目名,
// 参3:表示是否异步,true是异步
xmlHttp.open("get","s1",true);
//4)发送请求
/*注意:如果是post提交
在发送请求之前设置一个头*/
//xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send();
}
</script>
</head>
<body>
<!--设计一个按钮,一点击这个按钮,就向服务器发出异步请求-->
<input type="button" value="点我,发出异步请求" onclick="clickFn()"/>
</body>
</html>
src\com\wzx\pack01_ajax\BaseAjaxServlet.java
@WebServlet("/s1")
public class BaseAjaxServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//响应给浏览器
System.out.println("s1 doGet");
//响应
response.getWriter().println("hello");
}
}
总结:所有异步访问都是 ajax 引擎。
三、jQuery的Ajax技术(重点)
1、原生Ajax编程为什么不用?
代码量大,使用不方便,封装成函数,直接调用
2、jQuery框架的ajax函数
jquery是一个优秀的js框架,自然对js原生的ajax进行了封装,封装后的ajax的操 作方法更简洁,功能更强大,与ajax操作相关的jquery方法有如下几种,
但开发中经常使用的有三种:
2.1、$.get请求 和 $.post请求 原理
(1)格式
$.get(url, [data], [callback], [type])
$.post(url, [data], [callback], [type])
- url:表示服务器的访问路径,如:“s1”。即代表请求的服务器端地址
- data:表示向服务器发送的参数。即代表请求服务器端的数据(可以是key=value形式也可以是json格式)
格式1:字符串
:"username=jack&password=123"
格式2:json串
:{"username":"jack","password":123}
- callback:匿名函数,使用时其参数随便取名,表示服务器端成功响应 所触发的函数(只有正常成功返回才执行,自动执行)
- type:表示浏览器期望服务器发送过来的数据类型(jquery会根据指定的类型自动类型转换),常用的返回值类型:“text” “json”
(2)返回值为 “json” 使用该方法 处理 页面返回的数据
(3)示例
- 使用 $.get 请求,传给服务器 字符串(不含中文),期望返回 “text”
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$(function () {
$("#btn").on("click",function () {
//$.get请求
$.get(
"s2",
"username=jack&password=123",//字符串,key=value
function(data){ //这个data就是服务器返回的数据
//处理数据,字符串直接打印即可
alert(data)//success
},
"text"
);
})
})
</script>
</head>
<body>
<!--设计一个按钮,一点击这个按钮,就向服务器发出异步请求-->
<input id="btn" type="button" value="点我,发出异步请求"/>
</body>
</html>
@WebServlet("/s2")
public class Demo02Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//由于是异步请求服务端不能请求转发,或者重定向,因为二者会让页面整体刷新
System.out.println(username);
System.out.println(password);
//前台$.get()请求期望返回"text"格式,所以只能返回字符串
response.getWriter().write("success");
}
}
- 使用 $.post 请求,传给服务器 json串(不含中文),期望返回 “json”
//$.post请求
$.post(
"s2",
{"username":"rose","password":123},//json格式
function(data){ //这个data就是服务器返回的字符串 var data = []
//处理数据
alert(data)//[object Object]
alert(data.name)//大大
},
"json"
);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//由于是异步请求服务端不能请求转发,或者重定向,因为二者会让页面整体刷新
System.out.println(username);
System.out.println(password);
//返回的数据中 含中文时,需设置编码格式
response.setContentType("text/html;charset=utf-8");
//response.setContentType("text/json;charset=utf-8");
//前台$.post()请求期望返回"json"格式,所以只能返回json串
//双引号中不能直接用双引号,需转义
response.getWriter().println("{\"name\":\"大大\",\"age\":18}");
}
- 使用 $.get 和 $.post请求,传给服务器 字符串(含中文)
tomcat8中已解决了get方式提交中文乱码问题
所以在服务器就不用重复设置request.setCharacterEncoding(“utf-8”);
如果对get方式进行iso解码后再有utf-8编码:username = new String(username.getBytes(“ISO-8859-1”), “utf-8”);会适得其反,再次乱码。
var url = "s2";
var param = "username=小明&password=123";
var func = function(data){
//处理数据
};
var type = "json";
//使用get请求,传入中文会乱码
//但我用的tomcat8,所以不会乱码
$.get(url,param,func,type);
//post本来就不会出现乱码
$.post(url,param,func,type);
2.2、$.ajax请求方式***
(1)什么是$.ajax
请求方式
这种方式是将$.get
和$.post
方式合成一种请求
(2)如何调用
$.ajax({键:值,键:值,键:值});
(3)$.ajax()中的参数
url
:服务器的访问路径
async
:默认是true,表示异步请求,false为同步请求
data
:向服务器发送的参数
type
:默认值 GET ,也可写 POST
contentType:"application/json;charset=UTF-8"
:发送信息至服务器时内容编码类型
success
:请求成功后的回调函数。
error
:请求失败时调用此函数
dataType
:预期服务器返回的数据类型
(4) 示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="jquery-3.3.1.js"></script>
<script type="text/javascript">
function clickFn() {
$.ajax({
url:"s2",
async:true,
data:"username=bingbing&password=456",
type:"post",
dataType:"text",
success:function (data) {
alert(data)
},
error:function () {
alert("服务器发生了错误")
}
});
}
</script>
</head>
<body>
<!--设计一个按钮,一点击这个按钮,就向服务器发出异步请求-->
<input type="button" value="点我,发出ajax异步请求" onclick="clickFn()"/>
</body>
</html>
- 以上调用$.ajax的函数代码最好是复制过来,因为方法内的键不能随意修改。
jquery3.0新特性ajax请求
- 什么是juqery3.0新特性GET/POST请求
$.get({键:值,键:值});
$.post({键:值,键:值});
- 因为方法指定get与post,所以要比$.ajax少一个键,type:post或者type:get,其他都一样。
- 企业中一般还是使用1.x