目录
8.3.get() ⽅法通过远程 HTTP GET 请求载⼊信息
8.4.post() ⽅法通过远程 HTTP Post 请求载⼊信息
1.Ajax简介
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 不是新的编程语⾔,⽽是⼀种使⽤现有标准的新⽅法。
AJAX 是与服务器交换数据并更新部分⽹⻚的艺术,在不重新加载整个⻚⾯的情况下。
2.Ajax所包含的技术
AJAX 是⼏种原有技术的结合体来实现的异步操作。它由下列技术组合⽽成。
3.Ajax的⼯作原理和特点
Ajax的⼯作原理
![](https://img-blog.csdnimg.cn/20210315154531431.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210315154615229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210315154924187.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/2021031515502898.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
4.Ajax可以完成的功能
![](https://img-blog.csdnimg.cn/20210315155725773.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
5.XMLHttpRequest常⽤属性
5.1.onreadystatechange 属性
xmlHttp.onreadystatechange = function() { //我们需要在这写⼀些代码}
5.2.readyState 属性
![](https://img-blog.csdnimg.cn/20210315160043792.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
5.3.responseText 属性
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
document.myForm.time.value = xmlHttp.responseText;
}
}
5.4.其它属性如下
6.XMLHttpRequest⽅法
6.1. open() ⽅法
参数 1 :设置请求类型( GET 或 POST),
6.2. send() ⽅法
![](https://img-blog.csdnimg.cn/20210315161826139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNDU0ODYz,size_16,color_FFFFFF,t_70)
6.3.其它⽅法如下
7.Ajax实现步骤
7.1 创建XMLHttpRequest对象
创建XMLHttp对象的语法是:
//第⼀步:创建XMLHttpRequest对象
var xmlHttp;
if (window.XMLHttpRequest) {
//⾮IE
xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
//IE
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP") }
7.2 设置请求⽅式
//第⼆步:设置和服务器端交互的相应参数,向路径
http://localhost:8080/JsLearning3/getAjax准备发送数据
var url = "http://localhost:8080/JsLearning3/getAjax";
xmlHttp.open("POST", url, true);
GET 还是 POST?
异步 - True 或 False?
7.3 调⽤回调函数
//第三步:注册回调函数
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var obj = document.getElementById(id);
obj.innerHTML = xmlHttp.responseText;
} else {
alert("AJAX服务器返回错误!");
}
}
}
xmlHttp.readyState
是存有XMLHttpRequest 的状态。从 0 到 4 发⽣变化。0: 请求未初 始化。1: 服务器连接已建⽴。2: 请求已接收。3: 请求处理中。4: 请求已完成,且响应已就绪。所以这⾥我们判断只有当xmlHttp.readyState为4的时候才可以继续执⾏。
xmlHttp.status
是服务器返回的结果,其中200代表正确。404代表未找到⻚⾯,所以这⾥我们判断只有 当xmlHttp.status等于200的时候才可以继续执⾏。
xmlHttp获取后台返回的数据
xmlHttp对象有两个属性都可以获取后台返回的数据,分别是:responseText和responseXML
Ajax状态值与状态码区别
if(ajax.readyState == 4 && ajax.status == 200) {。。。。);}
AJAX运⾏步骤对应的状态值说明
ajax每一个执行步骤都对应着一个状态值,表示当前运行状态。
在AJAX实际运⾏当中,对于访问XMLHttpRequest(XHR)时并不是⼀次完成的,⽽是分别经历了多种状态后取得的结果,对于这种状态在AJAX中共有5种,分别是
AJAX状态码说明
7.4 发送请求
下面是post请求方式的ajax写法
//第四步:设置发送请求的内容和发送报送。然后发送请求
var uname= document.getElementsByName("userName")[0].value;
var upass= document.getElementsByName("userPass")[0].value ;
var params = "userName=" + uname+ "&userPass=" +upass+ "&time=" +
Math.random();
// 增加time随机参数,防⽌读取缓存
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
// 向请求添加 HTTP 头,POST如果有数据⼀定加加!!!!
xmlHttp.send(params);
7.5.Ajax案例-用户注册有效性验证
在用户注册的时候,鼠标触发离焦事件后,在脚本js中进行正则校验注册的信息是否符合要求,及时在表单中提示用户,但是要验证注册的用户名是否已存在需要提交表单去服务器验证若已存在需要重新加载整个登录页面,这个时候就可以使用ajax进行异步请求,在用户输入用户名触发鼠标离焦事件后ajax发送异步请求去验证数据库中该用户名是否已存在,并将信息反馈到页面,用户不需要去点击链接或按钮发送这个请求,ajax在不影响用户主线任务情况下执行支线任务,进行页面的局部刷新。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script>
/*ajax进行异步请求步骤*/
function test(){
//1.创建XMLHttpRequest
var xmlhttp;//声明
if (window.XMLHttpRequest){
//非IE
xmlhttp=new XMLHttpRequest();
}else if (window.ActiveXObject){
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//2.设置请求的方式、url和是否异步
var uname=document.getElementById("uname").value;
xmlhttp.open("get","/testuname?username="+uname,true);
//3.指定回调函数
xmlhttp.onreadystatechange=function () {
//3.1.判断ajax状态值4表示请求已完成,响应已就绪
if (xmlhttp.readyState==4){
//3.2.接收服务器返回的数据,插入到页面
var responseText = xmlhttp.responseText;
document.getElementById("tip").innerText=responseText;
}
}
//4.发送数据(请求)
xmlhttp.send();
}
</script>
</head>
<body>
<h1>Ajax发送异步请求,进行用户注册有效性验证</h1>
username:<input type="text" id="uname" onblur="test()"><span id="tip"></span>
</body>
</html>
后台处理
package servlet;
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;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/testuname")
public class TestUnameServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收参数
String username = req.getParameter("username");
//设置resp的文本类型和编码格式
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();//获取输出流
//向页面输入数据,ajax在回调函数中通过XMLHttpRequest的responseText接收这个数据
if ("admin".equals(username)){
writer.println("账户已被注册");
}else{
writer.println("用户可用");
}
}
}
post方式的ajax
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script>
/*ajax进行异步请求步骤*/
function test(){
//1.创建XMLHttpRequest
var xmlhttp;//声明
if (window.XMLHttpRequest){
//非IE
xmlhttp=new XMLHttpRequest();
}else if (window.ActiveXObject){
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//2.设置请求的方式、url和是否异步
var uname=document.getElementById("uname").value;
xmlhttp.open("post","/testuname",true);//post方式,url不携带参数
//3.指定回调函数
xmlhttp.onreadystatechange=function () {
//3.1.判断ajax状态值4表示请求已完成,响应已就绪
if (xmlhttp.readyState==4){
//3.2.接收服务器返回的数据,插入到页面
var responseText = xmlhttp.responseText;
document.getElementById("tip").innerText=responseText;
}
}
//4.发送数据(请求)
//post请求的ajax发送数据写法
//使⽤ setRequestHeader() 来添加HTTP 头。然后在send()⽅法中规定您希望发送的数据。
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded;charset=UTF-8");
xmlhttp.send("username="+uname);
}
</script>
</head>
<body>
<h1>Ajax发送异步请求,进行用户注册有效性验证</h1>
username:<input type="text" id="uname" onblur="test()"><span id="tip"></span>
</body>
</html>
8.jquery的ajax操作
8.1.传统⽅式实现Ajax的不⾜
8.2.ajax()⽅法
可以通过发送 HTTP请求加载远程数据,是 jQuery 最底层的 Ajax 实现,具有较⾼灵活性。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script>
/*入口函数*/
$(function(){
/*绑定离焦事件*/
$("#uname").blur(function () {
//1.获取input中输入的值
var uname = $(this).val();
//2.发送请求
$.ajax({
url:"/testuname",/*请求路径*/
data:"username="+uname,/*请求携带的参数*/
type:"post",/*请求方式*/
dataType:"text",/*服务器响应的数据类型*/
success:function (rs) {/*回调函数,接收服务器回写的数据*/
$("#tip").html(rs);
}
});
});
})
</script>
</head>
<body>
<h1>Ajax发送异步请求,进行用户注册有效性验证</h1>
username:<input type="text" id="uname"><span id="tip"></span>
</body>
</html>
package servlet;
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;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/testuname")
public class TestUnameServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收参数
String username = req.getParameter("username");
//设置resp的文本类型和编码格式
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();//获取输出流
//向页面输入数据,ajax在回调函数中通过XMLHttpRequest的responseText接收这个数据
if ("admin".equals(username)){
writer.println("账户已被注册");
}else{
writer.println("用户可用");
}
}
}
8.3.get() ⽅法通过远程 HTTP GET 请求载⼊信息
这是⼀个简单的 GET 请求功能以取代复杂 $.ajax
$.get(url,data,function(result) {
//省略将服务器返回的数据显示到⻚⾯的代码
});
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script>
/*入口函数*/
$(function(){
/*绑定离焦事件*/
$("#uname").blur(function () {
//1.获取input中输入的值
var uname = $(this).val();
//2.$.get(请求路径,请求参数,回调函数)发送请求
$.get("/testuname","username="+uname,function (rs) {
$("#tip").html(rs);
});
});
})
</script>
</head>
<body>
<h1>Ajax发送异步请求,进行用户注册有效性验证</h1>
username:<input type="text" id="uname"><span id="tip"></span>
</body>
</html>
8.4.post() ⽅法通过远程 HTTP Post 请求载⼊信息
$.post(url,data,function(result) {
//省略将服务器返回的数据显示到⻚⾯的代码
})
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script>
/*入口函数*/
$(function(){
/*绑定离焦事件*/
$("#uname").blur(function () {
//1.获取input中输入的值
var uname = $(this).val();
//2.$.post(请求路径,请求参数,回调函数)发送请求
$.post("/testuname","username="+uname,function (rs) {
$("#tip").html(rs);
});
});
})
</script>
</head>
<body>
<h1>Ajax发送异步请求,进行用户注册有效性验证</h1>
username:<input type="text" id="uname"><span id="tip"></span>
</body>
</html>
9.JSON
9.1.什么是JSON
JSON (JavaScript Object Notation) 是⼀种轻量级的数据交换格式。 易于⼈阅读和编写。同时也易于机器解析和⽣成
9.2.JSON对象定义和基本使⽤
在标准的json格式中,json对象由在括号括起来,对象中的属性也就是json的key是⼀个字符串,所以 ⼀定要使⽤双引号引起来。每组key之间使⽤逗号进⾏分隔。
JSON的定义
var 变量名 = {
“key” : value , // Number类型
“key2” : “value” , // 字符串类型
“key3” : [] , // 数组类型
“key4” : {}, // json 对象类型
“key5” : [{},{}] // json 数组
};
JSON对象的访问
访问json的json属性
访问json的json数组
<script type="text/javascript">
// json的定义
var jsons = {
"key1":"abc", // 字符串类型
"key2":1234, // Number
"key3":[1234,"21341","53"], // 数组
"key4":{ // json类型
"key4_1" : 12,
"key4_2" : "kkk"
},
"key5":[{ // json数组
"key5_1_1" : 12,
"key5_1_2" : "abc"
},{
"key5_2_1" : 41,
"key5_2_2" : "bbj"
}]
};
// 访问json的属性
alert(jsons.key1); // "abc"
// 访问json的数组属性
alert(jsons.key3[1]); // "21341"
// 访问json的json属性
alert(jsons.key4.key4_1);//12
// 访问json的json数组
alert(jsons.key5[0].key5_1_2);//"abc"
</script>
<script>
//1.定义json---单个对象
var j1={"name":"张三","age":18};
alert(j1.name+","+j1.age);
//2.数组
var j2={"name":["张三","李四"]};
alert(j2.name[1]);
//3.
var j3={"users":[{"name":"张三","age":18},{"name":"李四","age":19}]};
alert(j3.users[0].age);
</script>
9.3.JSON在java中的使⽤(重要)
我们要使⽤json和java中使⽤,我们需要使⽤到⼀个第三⽅的包。它就是
![](https://img-blog.csdnimg.cn/20210315170638168.png)
java对象和json之间的转换
单个对象与json互转
java->json:
Users user2=new Users();
user2.setUsername("李四");
user2.setPassword("abc");
user2.setAge(20);
JSONObject obj=JSONObject.fromObject(user);//obj就是json格式的
String str="{'username':'李四','password':'admin','age':19}";
JSONObject json=JSONObject.fromObject(str);
Users user=(Users)JSONObject.toBean(json,Users.class);
对象集合和json的转换
java集合->json数组:
List list=new ArrayList();
list.add("dd");
list.add("aa");
JSONArray obj=JSONArray.fromObject(list);//set也是这么转
String str2="[{'age':20,'password':'abc','username':'李四'},
{'age':10,'password':'adb','username':'张三'}
]";
JSONArray json2=JSONArray.fromObject(str2);
Object[] obj=(Object[])JSONArray.toArray(json2,Users.class);
String str3="[{'age':20,'password':'abc','username':'李四'},
{'age':10,'password':'adb','username':'展示⼲'}
]";
JSONArray json3=JSONArray.fromObject(str3);
//默认转换成ArrayList
List<Users> list=(List<Users>) JSONArray.toCollection(json3,Users.class);
ajax实例2-实现数据的⾃动填充:
当输入uid后触发离焦事件,ajax发送异步请求去数据库通过id找到对应的信息回写到页面input中,实现自动填充
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax实现自动填充功能</title>
<script src="js/jquery-3.3.1.js"></script>
<script>
/*JQery入口函数*/
$(function () {
$("#uid").blur(function () {
//1.获得uid的值
var uid = $(this).val();
//2.ajax发送异步请求
$.post("/getUserByUid","uid="+uid,function (rs) {
//转换成可以处理的js,将rs进行转义
rs=eval("("+rs+")");
//此时的rs是json格式的对象
$("#uname").val(rs.username);
$("#pass").val(rs.password);
$("#money").val(rs.money);
});
});
})
</script>
</head>
<body>
<h5>当输入uid后触发离焦事件,ajax发送异步请求去数据库通过id找到对应的信息回写到页面input中,实现自动填充</h5>
uid:<input type="text" id="uid"><br>
name:<input type="text" id="uname"><br>
pass:<input type="text" id="pass"><br>
money:<input type="text" id="money"><br>
</body>
</html>
Users
package bean;
public class Users {
private Integer uid;
private String username;
private String password;
private Double money;
public Users(Integer uid, String username, String password, Double money) {
this.uid = uid;
this.username = username;
this.password = password;
this.money = money;
}
public Users() { }
public Integer getUid() { return uid; }
public void setUid(Integer uid) { this.uid = uid; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public Double getMoney() { return money; }
public void setMoney(Double money) {this.money = money; }
@Override
public String toString() {
return "Users{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", money=" + money +
'}';
}
}
GetUserById
package servlet;
import bean.Users;
import net.sf.json.JSONObject;
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;
import java.io.PrintWriter;
@WebServlet(urlPatterns = "/getUserByUid")
public class GetUserByUid extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收参数
String uid = req.getParameter("uid");
System.out.println("uid:"+uid);
int userid = Integer.parseInt(uid);
System.out.println("int uid:"+uid);
Users users=null;
switch (userid){
case 1:
users=new Users(1,"张三","123",123.2);
break;
case 2:
users=new Users(2,"张三2","123",123.2);
break;
case 3:
users=new Users(3,"张三3","123",123.2);
break;
default:
users=new Users();
}
//java->json
JSONObject jsonObject = JSONObject.fromObject(users);//json
System.out.println(jsonObject);
//设置resp的文本类型和编码格式,获取输出流
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print(jsonObject);//页面ajax回调函数可以接收到这个json
}
}