# Ajax
# Ajax概述
Ajax(asynchronous javascript and xml):异步的javascript 和xml。它能使用javascript 异步访问服务器
同步和异步:客户端和服务器端相互通信的基础上,客户端发送请求到服务器端
- 同步:客户端必须等待服务器端的响应,在等待的期间客户端不能做其他操作
- 异步:客户端不需要等待服务器端的响应,在服务器处理请求的过程中,客户端可以进行其他的操作
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,提升用户的体验。传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。
Ajax运行原理
页面发起请求,会将请求发送给==浏览器内核中的Ajax引擎==,Ajax引擎会提交请求到服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面功能
Ajax应用场景
- 谷歌/百度的搜索框自动补全
- 用户注册时(校验用户名是否被注册过)
- 下拉框联动
# JS 原生的 Ajax 技术
JS 原生的Ajax其实就是围绕浏览器内内置的Ajax引擎对象进行学习的,使用js原生的Ajax完成异步操作:
创建Ajax引擎对象XHR
var xmlHttp = new XMLHttpRequest(); //var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE5和IE6,现在基本没了吧为Ajax引擎对象绑定监听onreadystatechange(监听服务器已将数据响应给引擎),每当 readyState 改变时,就会触发 onreadystatechange 事件
xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ document.getElementById("myDiv").innerHTML=xmlhttp.responseText; //还有responseXml这个方法 } } /* readyState有如下5个状态 - 0: 请求未初始化 - 1: 服务器连接已建立 - 2: 请求已接收 - 3: 请求处理中 - 4: 请求已完成,且响应已就绪*/ /* status情况 - 200: "OK" - 404: 未找到页面*/绑定提交地址open
xmlHttp.open("GET", "/day23_1/AServlet", true); //- 请求方式:可以是GET或POST //- 请求的URL:指定服务器端资源,例如;/day23_1/AServlet //- 请求是否为异步:如果为true表示发送异步请求,否则同步请求!发送请求
//如果是发送POST请求,需要设置Content-Type请求头 xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.send();//POST请求参数写在方法里;如果是GET请求参数可以写在open中URL后接受响应数据:写在onreadystatechange事件函数中
# jQuery 的 Ajax 技术
jQuery是一个优秀的js框架,自然对js原生的ajax进行了封装,封装后的ajax的操作方法更简洁,功能更强大,与ajax操作相关的jQuery方法有如下几种,但开发中经常使用的有三种
$.ajax( url [, settings ] ):是ajax在jquery中的底层实现,最复杂,最强功能。url必须有,也可在settings中设置
$.ajax({
url: "AjaxServlet", //请求路径,不加/
type: "POST", //请求方式
async: true, //是否异步
data: {"name": "zhangsan", "age": 22},
//contentType: 设置发送信息的MIME类型,可以不设置,默认application/x-www-form-urlencoded
success: function (data) {
alert(data.name);
},
error: function () {
alert("请求失败");
},
dataType: "json" //服务器返回的数据类型,若不指定S将根据HTTP包MIME信息来智能判断
});
$.get( url [, data ] [, success ] [, dataType ] ):发送get请求
$.post( url [, data ] [, success ] [, dataType ] ):发送post请求
$.get( //$.post和get没区别
"AjaxServlet", //url:待载入页面的URL地址,不加/
{"name":"zhangsan","age":22}, //data:待发送 Key/value 参数
function (data) { //callback:载入成功时回调函数;data是接收服务端发送的数据
alert(data.name+":"+data.age)
},
"json" //type:返回内容格式xml, html, script, json, text, _default
);
$.getJSON( url [, data ] [, success ] ):getJSON专门用于请求json数据
$.getScript(url[,callback])
load(url[,data][,callback])
- GET和POST提交基本差不多,有一个地方不一样就是提交的数据是中文的话,Servlet需要编码,解码
- 若是POST提交,可以设置request.setCharacterEncoding("utf-8")或者不用管,Ajax本身就解决了
- 若是GET提交,则需要编码解码
serialize():jQuery中序列表单内容为字符串。可用于Ajax提交表单
Ajax的其他delete、put等查看HTML章节介绍
# JSON
# 简介
JSON(JavaScript Object Notation):JavaScript对象表示法
JSON是一种与语言无关的数据交换的格式,作用:
- JSON现在多用于存储和交换文本信息的语法
- 进行数据的传输
- JSON 比 XML 更小、更快,更易解析
语法
基本规则
- 数据在名称/值对中,**键用双引号(严格模式,但在js中可以不用)**引起来
- 值的取值类型:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
{"persons":[{},{}]} - 对象(在花括号中)
{"address":{"province":"陕西"....}} - null
- 数据由逗号分隔:多个键值对由逗号分隔
- 花括号保存对象:使用{}定义json 格式
- 方括号保存数组:[]
获取数据:JSON 是JavaScript的原生内容,也就是JavaScript可以直接取出JSON 对象中的数据
JSON对象.键名JSON对象["键名"]数组对象[索引]遍历:
for...in:遍历属性,即key字符串。普通for循环也可以for(let key in person){ //alert(key + ":" + person.key); //这样不能获取到。因为key值为字符串,相当于person."name" alert(key+":"+person[key]); }for...of:遍历值for(let value of person){ alert(value.name); }
# JSON和Java对象的转换
- 常见的JSON解析器:Jsonlib,Gson(谷歌),fastjson(阿里),jackson(Spring内置)
- 使用步骤
- 导入jackson的相关jar包
- 创建Jackson核心对象
ObjectMapper - 如下:
# Java对象转换JSON
- 调用ObjectMapper的相关方法进行转换
- 转换方法
writeValueAsString(obj):将对象转为json字符串writeValue(参数1,obj),参数1如下:- File:将obj对象转换为JSON字符串,并保存到指定的文件中
- Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
- OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
- 注解(在JavaBean的属性上注解)
@JsonIgnore:排除属性@JsonFormat(pattern = "yyyy-MM-dd"):属性值得格式化,pattern自定义
- 复杂java对象转换
- List:数组
- Map:对象格式一致
- 转换方法
# JSON转为Java对象
- 调用ObjectMapper的相关方法进行转换:
readValue(json字符串数据,Class)
# 案例
# 异步校验用户名是否存在
$("#inputusername").blur(function () {
var username = $(this).val();
//期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
// {"userExsit":false,"msg":"用户名可用"}
$.post(
"/CheckServlet",
{"username":username},
function(data){
if(data.userExsit){
$("#usernameTag").text(data.msg);
$("#usernameTag").css("color","red")
} else {
$("#usernameTag").text(data.msg);
$("#usernameTag").css("color","green")
}
},
"json"
)
});
//设置响应的数据格式为json
response.setContentType("application/json;charset=utf-8");
String username = request.getParameter("username");//获取用户名
//期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"}
// {"userExsit":false,"msg":"用户名可用"}
Map<String,Object> map = new HashMap<String,Object>();
if("tom".equals(username)){ //存在
map.put("userExsit",true);
map.put("msg","此用户名太受欢迎,请更换一个");
}else{ //不存在
map.put("userExsit",false);
map.put("msg","用户名可用");
}
//将map转为json,并且传递给客户端
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(response.getWriter(),map);
- 服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
$.get()或$.post()或$.ajax():将参数dataType指定为"json"- 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");