AJAX介绍
AJAX(Asynchronous Javascript And XML)异步Javascript和XML,是一种通过JS和后台服务器进行交互的技术。
和传统的表单和服务器交互的方式相比,区别是:
1、传统的方式会刷新整个页面
2、AJAX刷新局部页面,提升用户体验
AJAX的实现
核心类:XMLHttpRequest(目前主流浏览器都支持,IE5\IE6支持ActiveXObject)
作用是:和后台服务器进行交互,应用Http协议和数据格式进行数据通信。
创建:
XMLHttpRequest xhr = new XMLHttpRequest();
方法:
- open(“GET/POST”,“服务器URL”,是否异步);
是否异步为true代表是异步,不需要等待服务器响应,执行后面的代码,不会阻塞。
如果是false代表同步,产生阻塞,需要等服务器响应才能执行后面操作。
推荐使用异步方式。 - send(字符串)
主要用于POST请求给服务器发送数据,如:“username=zhangsan&password=123”
事件:
- onreadystatechange Ajax对象状态变化的事件回调
状态:
- 0 初始化状态
- 1 连接状态,调用了open方法
- 2 发送状态,调用了send方法
- 3 接受状态,开始接受服务器数据
- 4 接受完成状态,完全接受服务器数据
属性:
- status 响应码,200、403、404、500…
- readyState 状态码,从0到4
- responseText 服务器的响应数据
原生AJAX的实现
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试Ajax的使用</title>
<style type="text/css">
#test{
width:100px;
height:100px;
background:yellow;
}
</style>
</head>
<body>
<div id="test" onclick="testAjax()">连接服务器</div>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript">
function testAjax(){
//创建XHR对象
var xhr = new XMLHttpRequest();
//监听onreadystatechange事件
xhr.onreadystatechange = function(){
console.log("readyState:"+xhr.readyState);
//如果状态为全部接受并且响应码为200
if(xhr.readyState == 4 && xhr.status == 200){
//更新页面内容
$("#test").text("服务器说:"+xhr.responseText);
}
};
//调用open方法,发送请求
xhr.open("POST","ajax.do",true);
//设置请求头,数据的类型
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
//调用send方法,发送参数
xhr.send("username=张三");
}
</script>
</body>
</html>
Servlet代码
/**
* 测试Ajax
* @author xray
*
*/
@WebServlet("/ajax.do")
public class AjaxServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//获得Ajax发送的参数
String name = req.getParameter("name");
//给浏览器发送数据
resp.getWriter().print(name+"你好啊,我是服务器!!!");
}
}
JQuery的Ajax
JQuery提供了几种ajax方法:
- $.ajax
参数:
type 请求方法类型,GET、POST
url 服务器地址,必须
data 请求参数
async 是否异步
success 成功接收数据的回调函数
error 错误情况的回调函数
$.ajax({type:"post",url:"ajax.do",data:{username:"张三"},
success:function(text){
更新text数据到页面
}
});
- $.post
$.post("URL",{参数名:值},
function(text){
更新页面
}
);
- $.get
$.get("URL?参数",
function(text){
...
});
使用JQuery的ajax方法
$(function(){
//设置点击事件
$("#test").click(function(){
//使用ajax方法连接服务器
/* $.ajax({type:"POST",data:{username:"李四"},url:"ajax.do",
success:function(text){
//更新页面内容
$("#test").text("服务器说:"+text);
}
}); */
//使用post方法
/* $.post("ajax.do",{username:"王五"},
function(text){
//更新页面内容
$("#test").text("服务器说:"+text);
}
); */
//使用get方法
$.get("ajax.do?username=赵六",
function(text){
//更新页面内容
$("#test").text("服务器说:"+text);
}
);
});
});
Ajax案例
案例:验证注册用户手机号是否存在
1、在UserDAO、UserService添加手机号是否存在查询方法
2、创建Servlet,接受Ajax传来的手机号,进行查询,将结果用流发送给浏览器
3、在添加用户的页面添加Ajax方法,在手机输入框失去焦点时调用验证。
/**
* 查询用户电话是否存在
* @author xray
*
*/
public class FindUserTelServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接受Ajax函数传来的手机号
String user_tel = req.getParameter("user_tel");
//调用数据库查询
UserService service = new UserServiceImpl();
boolean find = service.findUserTel(user_tel);
//将结果发送给Ajax
resp.getWriter().print(find);
}
}
注册表单
<form action="register.do" method="post" enctype="multipart/form-data">
<span id="user_tel_msg"></span><br>
<input name="user_tel" type="text" placeholder="请输入手机号"><br>
...
</form>
</div>
<script type="text/javascript" src="js/jquery-3.3.1.js"></script>
<script type="text/javascript">
$(function(){
//绑定手机号输入框的失去焦点事件
$(":text[name='user_tel']").blur(function(){
//调用post方法
$.post("findTel.do",{user_tel:$(this).val()},function(text){
//修改user_tel_msg的文字内容
if("false" == text){
$("#user_tel_msg").text("该手机号可以使用").css("color","green");
}else{
$("#user_tel_msg").text("该手机号已经存在").css("color","red");
}
});
});
});
</script>