Ajax讲解
1.ajax是什么?
asynchronous javascript and xml:一部的js和xml
它能使js访问服务器,而且是异步访问
服务器给客户端的响应一般是整个页面,一个html完整页面!但在ajax中因为是局部刷新,那么服务器就不用再响应整个页面,而只是数据
- text:纯文本
- xml:
- json:它是js提供的数据交互格式,它在ajax中最受欢迎
2.异步交互和同步交互
-
同步
- 发一个请求,就要等待服务器的响应结束,然后才能发第二个请求,中间这段时间就是一个字“卡”
- 刷新的是整个页面
-
异步
- 发一个请求后,无序等待服务器的响应,然后就可以发第二个请求
- 可以使用js接收服务器的响应,然后使用js来局部刷新
3.ajax应用场景
- 百度的搜索框
- 用户注册时(校验用户名是否被注册过)
4.ajax的优缺点
-
优点:
- 异步交互:增强了用户的体验
- 性能:因为服务器无需再响应整个页面,只需要响应部分内容,所以服务器的压力减轻了
-
缺点:
- ajax不能应用在所有场景
- ajax无端的增多了对服务器的访问次数,给服务器带来了压力
5.ajax发送异步请求(四步操作)
1.第一步
- ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax
-
得到XMLHttpRequest
大多数浏览器都支持:var xmlHttp = new XMLHttpRequest();
IE6.0:var xmlHttp = new ActiveXObject(“Msxml2.XMLHTTP”);
IE5.5以及更早版本的IE:var xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”); -
编写创建XMLHttpRequest对象的函数
function creatXMLHttpRequest(){
try {
return new XMLHttpRequest();
} catch(e) {
try{
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e){
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch(e){
alert("您用的是什么浏览器啊?");
throw e;
}
}
}
}
2.第二步(打开与服务器的连接)
-
xmlHttp.open():用来打开与服务器的连接,它需要三个参数:
请求方式:可以是GET或POST
请求的URL:指定服务器端资源,例如:/day23_1/AServlet
请求是否为异步:如果为true表示发送异步请求,否则同步请求 -
xmlHttp.open(“GET”, “/day23_1/AServlet”, true);
3.第三步(发送请求)
-
xmlHttp.send(null):如果不给可能会造成部分浏览器无法发送
参数:就是请求体内容!如果是GET请求,必须给出null
4.第四步()
- 在xmlHttp对象的一个事件上注册监听器:onreadystatechange
-
xmlHttp对象一共有5个状态:
- 0状态:刚创建,还没有调用open()方法;
- 1状态:请求开始,调用了open()方法,但还没有调用send()方法
- 2状态:调用完了send()方法
- 3状态:服务器已经开始响应,但不表示响应结束了
- 4状态:服务器响应结束(通常我们只关心这个状态)
-
得到xmlHttp对象的状态
var state = xmlHttp.readyState;//可能是0、1、2、3、4 -
得到服务器响应的状态码
var status = xmlHttp.status;//例如200、404、500 -
得到服务器响应的内容
- var content = xmlHttp.responseText;//得到服务器的响应的文本格式的内容
- var content = xmlHttp.responseXML;//叨叨服务器的响应的xml响应的内容,xmlHttp对象会自动对响应的字符串进行解析,它是Document
示意代码:
双重判断
xmlHttp.onreadystatechange = function(){//xmlHttp的5种状态都会调用本方法
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){//双重判断:判断是否为4状态,而且还要判断是否为200
//获取服务器的响应内容
var text = xmlHttp.responseText;
}
}
Ajax练习
第一例:Ajax的HelloWorld
Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello xiaohei");
response.getWriter().print("Hello xiaohei");
}
JSP:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
//创建异步对象
function creatXMLHttpRequest(){
try {
return new XMLHttpRequest();
} catch (e) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("您用的是什么浏览器啊?");
throw e;
}
}
}
}
window.onload = function(){//文档加载完毕后执行
var but = document.getElementById("but");
but.onclick = function(){//给按钮的点击事件注册监听
//ajax四步操作
//1.得到异步对象
var xmlHttp = creatXMLHttpRequest();
//2.打开数据库连接,这里是在jsp页面中使用标签,客户端看到jsp页面的时候是服务端tomcat把jsp页面变成html页面才发送过来的,到客户端就没有jsp标签了,已经变成字符串"/day23_1_itcast/AServlet"
xmlHttp.open("GET","<c:url value='/AServlet'/>", true);
//3.发送请求
xmlHttp.send(null);//GET请求没有请求体,但也要给出null,不然FireFox可能会不能发送
//4.给异步对象的onreadystatechange注册监听器
xmlHttp.onreadystatechange = function(){//当xmlHttp的状态发生变化时执行
//双重判断
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
var h4 = document.getElementById("h4");
var text = xmlHttp.responseText;
h4.innerHTML = text;
}
}
}
}
</script>
</head>
<body>
<button id="but">点击这里</button>
<h4 id="h4"></h4>
</body>
第二例:发送POST请求(如果发送请求时需要带有参数,一般都用POST请求)
- open:xmlHttp.open(“POST”…)
-
添加一步:设置Content-Type请求头:
xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); -
send:xmlHttp.send(“username=zhangsan&password=123”);发送请求时指定请求体
Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
System.out.println("(Post)...Hello xiaohei" + username);
response.getWriter().print("(Post:)...Hello xiaohei" + username);
}
JSP:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
function creatXMLHttpRequest(){
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("您用的是什么浏览器啊?");
throw e;
}
}
}
}
window.onload = function(){
var but = document.getElementById("but");
but.onclick = function(){
//ajax四步操作
//1.得到异步对象
var xmlHttp = creatXMLHttpRequest();
//2.打开数据库连接
/********修改open方法,指定请求方式为POST**********/
xmlHttp.open("POST","<c:url value='/AServlet'/>", true);
/*********设置请求头:Content-Type*********/
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//3.发送请求
/*********发送时指定请求体*********/
xmlHttp.send("username=张三");
//4.给异步对象的onreadystatechange注册监听器
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
var h4 = document.getElementById("h4");
var text = xmlHttp.responseText;
h4.innerHTML = text;
}
}
}
}
</script>
</head>
<body>
<button id="but">点击这里</button>
<h4 id="h4"></h4>
</body>
</html>
第三例:用户名是否已被注册
Servlet:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
if(username.equalsIgnoreCase("itcast")){
response.getWriter().print("1");
}else{
response.getWriter().print("0");
}
}
JSP:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function creatXMLHttpRequest(){
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("您用的是什么浏览器啊?");
throw e;
}
}
}
}
window.onload = function(){
//获取文本框,给它的失去焦点事件注册监听
var nameele = document.getElementById("usernameele");
nameele.onblur = function(){
//1.得到异步对象
var xmlHttp = creatXMLHttpRequest();
//2.开启与服务器的连接
xmlHttp.open("POST", "<c:url value='/ValidateUsernameServlet' />", true);
//3.设置请求头:Content-Type
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//4.发送请求,给出请求体
xmlHttp.send("username=" + nameele.value);
//5.给xmlHttp的onreadystatechange事件注册监听
xmlHttp.onreadystatechange = function(){
//双重判断
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
var text = xmlHttp.responseText;
var spanele = document.getElementById("errorspan");
if(text == "1"){
spanele.innerHTML = "该用户名已被注册";
} else {
spanele.innerHTML = "";
}
}
}
};
};
</script>
</head>
<body>
<form action="" method="post">
name:<input type="text" name="username" id="usernameele" /><span id="errorspan"></span><br/>
password:<input type="password" name="password" /><br/>
<input type="submit" value="Submit" />
</form>
</body>
第四例:响应XML
如果服务端响应内容为xml数据:
- 服务器端:设置响应头ContentType=“text/xml;charset=utf-8”
-
客户端:var doc = xmlHttp.responseXML;//得到的是document对象
Servlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String xml = "<students>" +
"<student number='ITCAST_1001'>" +
"<name>zhangsan</name>" +
"<age>18</age>" +
"<sex>male</sex>" +
"</student>" +
"</students>";
response.setContentType("text/xml);charset=UTF-8");
response.getWriter().print(xml);
}
JSP:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script>
function creatXMLHttpRequest(){
try {
return new XMLHttpRequest();
} catch (e) {
try {
return ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("您用的是什么浏览器啊?");
throw e;
}
}
}
}
window.onload = function(){
var but = document.getElementById("but");
but.onclick = function(){
//ajax四步操作
//1.得到异步对象
var xmlHttp = creatXMLHttpRequest();
//2.打开数据库连接
xmlHttp.open("GET","<c:url value='/BServlet'/>", true);
//3.发送请求
xmlHttp.send(null);
//4.给异步对象的onreadystatechange注册监听器
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState == 4 && xmlHttp.status == 200){
//获取服务器响应结果(xml)
var doc = xmlHttp.responseXML;
var ele = doc.getElementsByTagName("student")[0];
//获取元素名为number的属性值
var number = ele.getAttribute("number");
var name;
var age;
var sex;
if(window.addEventListener){
name = ele.getElementsByTagName("name")[0].textContent;//其他浏览器
} else{
name = ele.getElementsByTagName("name")[0].text;//IE浏览器
}
if(window.addEventListener){
age = ele.getElementsByTagName("age")[0].textContent;//其他浏览器
} else{
age = ele.getElementsByTagName("age")[0].text;//IE浏览器
}
if(window.addEventListener){
sex = ele.getElementsByTagName("sex")[0].textContent;//其他浏览器
} else{
sex = ele.getElementsByTagName("sex")[0].text;//IE浏览器
}
var text = number + "," + name + "," + age + "," + sex;
var h4 = document.getElementById("h4");
h4.innerHTML = text;
}
}
}
}
</script>
</head>
<body>
<button id="but">点击这里</button>
<h4 id="h4"></h4>
</body>
</html>
JSON
JSON基础
1.json是什么?
它是js提供的一种数据交换格式
2.json语法
{ }:是对象,对象的属性名可以不用双引号括起来
但JSON的属性名必须使用双引号括起来,单引号不行
属性值可以是:null,数值,字符串,数组(使用[ ]括起来),boolean值(true和false)
3.应用json
var person = {“name”:”zhangsan”, “age”:18, “sex”:”male”};
服务端向客户端发送json串
String str = “{\”name\”:\”zhangsan\”, \”age\”:18, \”sex\”:\”male\”}”;
需要转义,为了能在字符串中正确的表示双引号,双引号是字符串内容的一部分
通常,我们在jsp页面中获取到服务器响应来的json串后,需要去执行它,就需要调用eval方法,然后在json串两边加上括号
var text = xmlHttp.responseText;
var person = eval(“(” + text + “)”);
json-lib
json-lib的核心jar包:json-lib.jar
json-lib的依赖jar包:
- commons-lang.jar
- commons-beanutils.jar
- commons-logging.jar
- commons-collections.jar
- ezmorph.jar
核心类:
JSONObject:类似于Map
- toString();返回一个JSON串
-
fromObject(Object arg);这是一个静态方法,可以把一个对象转成JSONObject类型
JSONObject map = JSONObject.fromObject(person);
JSONArray:类似于List
- toString();返回一个JSON串
-
-
fromObject(Object arg);
JSONArray jsonArray = JSONObject.fromObject(list);把一个List转换成JSONArray
-
fromObject(Object arg);