? Ajax(Asynchronous JavaScript and XML)异步请求是现代Web开发中不可或缺的技术组件,它允许网页在不刷新整个页面的情况下从服务器获取并更新数据,从而实现动态、流畅的交互体验。
浏览器访问服务器的方式
? 该技术广泛应用于各类Web应用,如用户登录验证、动态加载内容、实时数据更新等场景。
? 利用XMLHttpRequest发起HTTP请求,包括GET、POST等各种方法,以及处理响应数据,使用ajax接收响应,使用jS进行页面刷新。
界面代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>new jsp</title>
<%--导入远程jQuery依赖--%>
<script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script>
//原生JS方式发送 Ajax请求
function run() {
//1.核心对象
var xmlhttp;
//2.判断浏览器类型
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//3.建立连接
xmlhttp.open("GET","/origin_ajax?username=tom",true);
//4.发送请求
xmlhttp.send();
//5.获取响应结果
xmlhttp.onreadystatechange=function() {
//readyState==4 请求已完成,且响应已就绪
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var text =xmlhttp.responseText;
alert("响应结果: " + text);
}
}
}
</script>
</head>
<body>
<input type="button" value="原生JS发送异步请求" οnclick="run()"><br>
异步请求不影响文本框 <input type="text"><br>
</body>
</html>
servlet代码
package com.example.ajax_demo02;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "OriginAjaxServlet", urlPatterns = "/origin_ajax")
public class OriginAjaxServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、获取请求参数
String username = request.getParameter("username");
System.out.println(username);
//模拟请求处理延迟
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//2、响应
response.getWriter().write(username);
}
}
测试结果
如图,发送ajax请求,并不会重刷界面。
原生ajax缺点:
jquery是一个优秀的js框架,对js原生的ajax进行了封装,封装后的ajax的操作方法更简洁,功能更强大.开发中经常使用的方式有三种:POST、GET、AJAX
界面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax的get请求</title>
</head>
<script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function run() {
var url = "${pageContext.request.contextPath}/origin_ajax";
var data = {username:"lucky"};
$.get(url, data, function (param) {
alert("get请求的响应:" + param);
}, "text")
}
</script>
<body>
<input type="button" value="get异步请求" οnclick="run()">
</body>
</html>
servlet代码不变
测试结果
界面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax的post请求</title>
</head>
<script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function run() {
var url = "${pageContext.request.contextPath}/origin_ajax";
var data = {username:"lucky"};
$.post(url, data, function (param) {
alert("post请求的响应:" + param);
}, "text")
}
</script>
<body>
<input type="button" value="post异步请求" οnclick="run()">
</body>
</html>
servlet代码不变
测试结果
界面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax的ajax请求</title>
</head>
<script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script>
function run() {
$.ajax({
url:"${pageContext.request.contextPath}/origin_ajax",
async:true, //是否异步
data:{username:"zhangsan"},
type:"GET", //请求方式
dataType:"text", //返回数据的数据类型
success:function (param) {
alert("响应成功!" + param);
},
error:function () {
alert("响应失败!")
}
});
}
</script>
<body>
<input type="button" value="ajax异步请求" οnclick="run()">
</body>
</html>
servlet代码不变
测试结果
需求
界面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ajax的ajax请求</title>
</head>
<script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(function () {
$("#username").blur(function () {
//获取用户名
var name = $(this).val();
//判断用户名不为空和空串
if(name != null && name != ""){
//向后台发送请求,验证用户名
$.ajax({
url:"${pageContext.request.contextPath}/checkName",
type:"GET",
data:{username:name},
dataType:"json",
success:function (data) {
if(data.flag){
//设置span的内容体
$("#spanMsg").html("<font color='red'>" +data.msg+"</font>");
}else if(!data.flag){
$("#spanMsg").html("<font color='green'>" +data.msg+"</font>");
}
},
error:function () {
alert("请求处理失败!");
}
});
}
})
});
</script>
<body>
<form action="#" method="post">
用户名: <input type="text" id="username" name="username" placeholder="请输入用户名">
<span id="spanMsg" style="color: red"></span> <br>
密码:<input type="text" id="password" name="password" placeholder="请输入密码">
</form>
</body>
</html>
servlet代码
package com.example.ajax_demo02;
import com.alibaba.fastjson.JSON;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.HashMap;
@WebServlet(name = "CheckNameServlet", value = "/checkName")
public class CheckNameServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取用户名
String username = req.getParameter("username");
//Map封装数据
HashMap<String,Object> map = new HashMap<>();
//判断用户是否存在
if("tom".equals(username)){
//用户名存在
map.put("flag",true);
map.put("msg","用户名已经被占用!");
//响应JSON格式的数据
String data = JSON.toJSONString(map);
resp.getWriter().print(data);
}else{
//用户名不存在
map.put("flag",false);
map.put("msg","用户名可以使用!");
String data = JSON.toJSONString(map);
resp.getWriter().print(data);
}
}
}
测试结果