jquery ajax同步和异步的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery ajax同步和异步的区别相关的知识,希望对你有一定的参考价值。
AJAX异步和同步区别AJAX
1、AJAX(Asynchronous javascript And XML)
主要由javascript和xml两种技术以一种新的方式组合成一门客户端技术.
AJAX:Dhtml+XMLHttpRequest(可用于发送异步请求)
DWR:ajax框架
AJAX:Asychronized JavaScript +XML的缩写
AJAX是一种客户端技术,可以和J2ee、.Net等服务器端技术进行交互。
AJAX并不是一门新的技术,它是有很多已有的技术按一定的方式组合起来的:
1)HTML,CSS实现标准的显示
2)DOM(Document Object Module)实现动态交互
3)XML,XSLT实现数据获取
4)XMLHttpRequest发送异步请求,获取异步数据
5)JavaScript将各种技术粘合起来
2、同步请求应答通信模型详解
传统web应用采用click-->wait-->refresh方式与用户交互.采用同步请求/响应的交互模式页面驱动,
以页面为中心,即使请求前后的两个页面非常类似,服务器也要重新发送.
browse-->request-->server-->response
会打断用户的操作,因客户端每次操作后都要等待服务器的响应.刷新页面会丢失用户信息,光标位置不
能对用户的请求做出立即的响应.由于HTML的限制,很多特殊效果很难实现.
富客户端的应用:
Applet,Macromedia Flash,Java WebStart,DHtml,DHtml with Hidden IFrame,AJAX
3、使用目的
解决了同 步请求应答通信模型 ( request/response 通 信模型 ) 的一些缺点:
1) 页面先前的内容丢失
2) 用户的下一步操作被中断
3) 页面信息进行局部更新时,整个页面要全部刷新. 参考技术A
同步,异步的难理解,我觉得本身是因为这两个词语在汉语中的解释与计算机中完全不同
说说我理解的同步,异步
比如说,LiLei今天约了HanMeiMei 进天来他家吃烤面包
于是LiLei有这么几件事需要做
烤面包,
煮茶,
打扫房间
他该怎么去完成这几件事情呢
ex1:先打扫房间,打扫完成,烤面包,等到面包考好了,煮茶
ex2:先准备烤面包,恩,把面包放入烤箱,设个定时提醒,去煮茶,把水烧着,水烧开了,电磁炉会响,去打扫房间,打扫完了,面包也许考完了,水也许烧开了,我可以继续煮茶,也可以继续做其他的事情。
ex1,就是同步
ex2,就是异步
这与汉语中的并行,串行有相似,但是在计算机中并行与串行与同步,异步是不同的概念
异步还涉及到回调等等
嗯,就是这样的
本回答被提问者和网友采纳 参考技术B $.ajax(type: ...,
url:..,
async:false, //默认是true:异步,false:同步。
);
alert("测试同步与异步");
就拿上面的例子说:如果是异步的话,不管ajax的执行请求有没有返回,代码会继续往下执行,
如果是同步的话,只有ajax请求完成返回数据之后代码才能继续往下执行
比方你在烤面包,当你把面包放进烤面包机里边,然后你就一直在哪儿傻等着,一直等到面包烤好了你取出面包再开始做下面的事情这个就是同步。
异步的话就是你不等面包烤好,把面包放进烤面包机之后你就去做其他事情去了,当烤面包机一声铃响提示你烤好了,你取出面包再开始做下面的事情这个就是异步。
ajax的异步和同步也是同样道理 参考技术D 同步需要等待返回结果才能继续,异步不必等待,一般需要监听异步的结果
同步是在一条直线上的队列,异步不在一个队列上 各走各的
什么是Ajax ,异步,同步,JSON,XMLHttpRequest对象,什么是JSON,使用JQuery实现Ajax
什么是Ajax
Ajax即Asynchronous Javascript And XML(异步JavaScript和XML) 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。
Ajax实质是利用浏览器提供的对象
(XMLHttpRequest)
;异步地向服务器发送请求
,服务器返回部分数据
,浏览器使用这些数据对页面做部分的更新,整个过程页面无刷新
,不打断用户的操作。
同步异步概念
同步: 当客户端与服务器交互时,不能进行其他操作,需要等服务器响应数据过来;在这个过程中,客户端的操作会被打断; 而且服务器响应的过来时会刷新数据;
异步:客户端与服务器交互时,客户端还可以进行其他操作,客户端使用的是XMLHttpRequest对象与服务器交互的,那么服务器在响应时也是通过这个对象将提示信息返回,将信息更新到页面,页面不刷新.
例如,用户正在填写某个注册的表单,信息已经全部填写了,但是点击注册后,由于数据库中已存在了这个账户名,返回给用户信息提示时,用户之前填写的所有数据都被刷新清除了.
这要是用异步交互,那么用户填的数据就不会被全部清除了.
同步异步实例案例
(1)同步:
用户实体类User
public class User {
//Id
private int uId;
//用户名;
private String account;
//密码
private String password;
//性别
private String sex;
//年龄;
private int age;
//电话;
private String mobile;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public int getuId() {
return uId;
}
public void setuId(int uId) {
this.uId = uId;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
数据访问交互层UserDao;
其中用到了自定义的JDBC工具类
public class UserDao {
//连接对象connection;
Connection connection = null;
//执行查询语句的PreparedStatement;
PreparedStatement pst = null;
//查询的结果集;
ResultSet resultSet = null;
/**
* 根据管理员账号查询管理员;
*/
public User findAdminByAccount(String account)throws SQLException{
User user=null;
try{
//加载数据库驱动;
connection=JdbcUtils.getConnection();
//定义SQL语句
String sql="select Id,account from tb_admin where account=? ";
//预编译;
pst=connection.prepareStatement(sql);
//向占位符 ? 赋值;
pst.setString(1,account);
//获取结果集;
resultSet= pst.executeQuery();
while (resultSet.next()){
user=new User();
user.setuId(resultSet.getInt("Id"));
user.setAccount(resultSet.getString("account"));
}
}finally {
//关闭资源;
JdbcUtils.closeSource(connection,pst,resultSet);
}
return user;
}
}
Jdbc工具类
public class JdbcUtils {
static {
try {
//在Web项目中仅加载一次驱动;
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//关闭资源的方法;
public static void closeSource(Connection connection, PreparedStatement ps, ResultSet resultSet) throws SQLException {
//若不为空就关闭资源;
if (connection != null) {
connection.close();
}
if (ps != null) {
ps.close();
}
if (resultSet != null) {
resultSet.close();
}
}
}
用到的Ajax01Servlet类;用于数据的获取,验证,以及跳转页面.
//使用反射;
@WebServlet(name = "byAjax01",urlPatterns = "/byAjax01")
public class Ajax01Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到账号信息;
try {
String account = req.getParameter("account");
//新建数据交互层对象;
UserDao userDao=new UserDao();
//根据账号密码--查询到管理员;
User adminByAccount = userDao.findAdminByAccount(account);
//判断是否与数据库中的用户相同;
if (adminByAccount==null) {
//账号唯一,提示;
req.setAttribute("errorMsg","☺,账号唯一,可注册.");
} else {
//若不是数据库中的账号,给出提示;
req.setAttribute("errorMsg", "该账号已被注册");
}
//将页面请求转发到原来的页面.jsp;
req.getRequestDispatcher("ajax/studyAjax01.jsp").forward(req,resp);
}catch (Exception e){
e.printStackTrace();
//若异常,则跳转到预先设置的异常页面;
resp.sendRedirect("404.jsp");
}
}
}
显示页面jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function getAcc(account){
//账号失去焦点时就把其中的账号数据返回到servlet层.
location.assign("${pageContext.request.contextPath}/byAjax01?account="+account);
}
</script>
</head>
<body>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
电话:<input type="text" name="mobile" ><br/>
<%--onblur:标签失去焦点时触发;--%>
账号:<input type="text" name="account" onblur="getAcc(this.value)">
<%--errorMsg,验证消息后返回的信息--%>
${errorMsg}<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>
在启动服务器后,输入账号,鼠标离开账号框,数据就和数据库中的账号数据进行验证,弹出提示消息,但是页面已经被刷新,前面填的数据已经没了.响应过来整个页面
(2)异步
用到的Ajax02servlet类
//使用反射;
@WebServlet(name = "byAjax02",urlPatterns = "/byAjax02")
public class Ajax02Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到账号信息;
try {
String account = req.getParameter("account");
//新建数据交互层对象;
UserDao userDao=new UserDao();
//根据账号密码--查询到管理员;
User adminByAccount = userDao.findAdminByAccount(account);
//设置响应的内容以及编码方式;
resp.setContentType("text/html;charset=UTF-8");
//使用流的方式返回信息;
PrintWriter out= resp.getWriter();
//判断是否与数据库中的用户相同;
if (adminByAccount==null) {
//账号唯一,提示;
out.print("☺,账号唯一,可注册.");
} else {
//若不是数据库中的账号,给出提示;
out.print("该账号已被注册");
}
}catch (Exception e){
e.printStackTrace();
//若异常,则跳转到预先设置的异常页面;
resp.sendRedirect("404.jsp");
}
}
}
显示的jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function getAcc(account){
//新建XMlHttpRequest对象;
var httpRes=new XMLHttpRequest();
//建立与服务器的连接;
// open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
//第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
httpRes.open("get","${pageContext.request.contextPath}/byAjax02?account="+account,true);
//发送请求;
httpRes.send();
//获取响应过来的数据信息;
//onreadystatechange:指定回调函数
httpRes.onreadystatechange=function (){
//readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
//readyState为4:表示读取响应结束;
//status:HTTP的状态码;这里判断为200是正常状态码;
if(httpRes.readyState==4 && httpRes.status==200){
//responseText:获得响应的文本内容;
document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
}
}
}
</script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>
启动服务器;账号数据验证后,并未刷新清除前面的数据;仅响应提示信息
XMLHttpRequest对象
通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更新页面的局部内容。
常用方法
open(method,URL,async)
该方法用来建立与服务器的连接;
第一个参数method:请求方式;为GET/POST;
第二个参数URL:指定请求的地址;
第三个参数async:指定是否使用异步请求;为布尔值(true/false)
send(content)
用来发送请求的方法;
content:指定请求参数;
setRequestHeader(header,value)
设置请求的头信息
在返回服务器响应的数据信息时,需要触发回调函数onreadystatechange;
常用属性
使用responseText获取响应的文本内容
可根据需要使用就绪状态码进行判断.
readyState: XMLHttpRequest的状态信息 ;就绪状态码.
就绪状态码 | 注释 |
---|---|
0 | XMLHttpRequest对象未完成初始化 |
1 | XMLHttpRequest对象开始发送请求 |
2 | XMLHttpRequest对象请求发送完成 |
3 | XMLHttpRequest对象开始读取响应,没有结束 |
4 | XMLHttpRequest对象读取响应结束 |
还可以根据HTTP状态码status进行判断
常用状态码 | 说明 |
---|---|
200 | 服务器响应正常 |
400 | 无法找到请求资源 |
403 | 无权限访问 |
404 | 访问资源不存在 |
500 | 服务器错误 |
使用Ajax时,GET与POST请求方式的区别
- Get方式提交时,建立连接后,仅需要发送请求即可;
例如:
XMLHttpRequest对象.open(“GET”,“Servlet?name=”+数据信息,true);
XMLHttpRequest对象.send(null);
- Post方式提交时,建立连接后,需要设置http的请求头,然后才发送请求.
例如:
XMLHttpRequest对象.open(“POST”,“Servlet”,true);
设置请求头时,内容提交方式为表单的默认提交方式.
XMLHttpRequest对象.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);
XMLHttpRequest对象.send(“name=”+数据信息);
这里设置请求头时的值:“application/x-www-form-urlencoded”;
这是enctype
属性规定在发送到服务器之前应该如何对表单数据进行编码;默认的表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值)
在上面同步异步案例中,已使用get请求方式;
现在试试post方式. ;注意servlet那边是doPost方法接收.
<%--异步 使用POST方式提交 ;注意servlet端--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript">
function getAcc(account){
//新建XMlHttpRequest对象;
var httpRes=new XMLHttpRequest();
//建立与服务器的连接;
// open方法:有三个参数;第一个参数是请求方式method;get或者post请求;
//第二个参数是请求地址url ;第三个参数是async;决定是否使用异步参数;(true/false)
httpRes.open("POST","${pageContext.request.contextPath}/byAjax03",true);
//设置请求头;
httpRes.setRequestHeader("content-Type","application/x-www-form-urlencoded");
//发送请求;
httpRes.send("account="+account);
//获取响应过来的数据信息;
//onreadystatechange:指定回调函数
httpRes.onreadystatechange=function (){
//readyState: XMLHttpRequest的状态信息;就绪状态码有5个;
//readyState为4:表示读取响应结束;
//status:HTTP的状态码;这里判断为200是正常状态码;
if(httpRes.readyState==4 && httpRes.status==200){
//responseText:获得响应的文本内容;
document.getElementById("errorMsgId").innerHTML=httpRes.responseText;
}
}
}
</script>
</head>
<body>
<%--onblur:标签失去焦点时触发; 将输入框中填入的值--%>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
电话:<input type="text" name="mobile" ><br/>
账号:<input type="text" name="account" onblur="getAcc(this.value)"><span id="errorMsgId"></span>
<br/>
密码:<input type="password" name="password"><br/>
</body>
</html>
启动服务器,URL并未出现参数.
在java对象中封装了数据;想要传递给Ajax这边;
而XMLHttpRequest对象属于JavaScript;
之前上面是传递的文本信息,可以实现;
但是,两种语言需要数据交换;两个不同的对象数据;就得需要一个中间的转换格式;
那么,引入JSON这个概念.
什么是JSON
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据;
约定大于配置
例如:
[ { 属性 : 值 , 属性 : 值 } , { 属性 : 值 ,属性 : 值 } ]
- 数据存在键值对中
- 多个数据使用逗号分隔
- 大括号保存对象
- 方括号保存数组
案例:根据Id查询用户信息,且其中将java对象先转为json格式的字符串,然后再把json格式的字符串转为javaScript对象;
- 用户实体类User省略…
- 数据访问层userDao;
public class UserDao {
//连接对象connection;
Connection connection = null;
//执行查询语句的PreparedStatement;
PreparedStatement pst = null;
//查询的结果集;
ResultSet resultSet = null;
/**
* 根据用户Id查询单个用户;
*/
public User findUserById(String id) throws SQLException{
//创建用户对象;
User user=new User();
try{
//加载驱动,获取连接;
connection=JdbcUtils.getConnection();
//定义SQL语句;
String sql="SELECT * " +
"FROM tb_admin " +
"WHERE id=?";
//预编译;
pst=connection.prepareStatement(sql);
//为占位符赋值;
pst.setString(1,id);
//获取结果集;
resultSet=pst.executeQuery()以上是关于jquery ajax同步和异步的区别的主要内容,如果未能解决你的问题,请参考以下文章