我们知道 无论是 重定向 还是 转发,都会 刷新页面重新加载。那么 有么有 一种技术,可以不刷新页面 去更新 页面上的 数据呢。答案是 “有的!”
iframe测试体验页面无刷新
其实最接近于 AJAX 的东西,就是 iframe。没有刷新页面,却能 改变 页面的某个内容。
如下:
DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>iframe测试体验页面无刷新title>
<script>
function a(){
let i = document.getElementById("iframe1");
let url = document.getElementById("url");
i.src = url.value;
}
script>
head>
<body>
<div>
<p>请输入地址:p>
<p>
<input type="text" id="url">
<input type="button" value="提交" onclick="a()">
p>
div>
<div>
<iframe id="iframe1" src="https://www.yuque.com/muquanyu/mhu1q5" frameborder="0" style="width:100%; height: 500px">iframe>
div>
body>
html>

利用AJAX可以做:
纯JS 原生态实现的 AJAX 我们不太建议学习和使用。直接 使用 JQuery 提供的 AJAX 即可。学习成本低,并且使用起来 不是那么麻烦。


@RequestMapping("/a1")
public void a1(String name, HttpServletResponse resp) throws IOException {
/*我们接收到的数据,是AJAX的data 传递过来的,并没有利用表单和传统传参*/
System.out.println("a1:param=>" + name);
if("mqy".equals(name)){
resp.getWriter().println("true"); // resp 响应一个数据,至于这个数据是 啥格式,咱们可以不管。
}else{
resp.getWriter().println("false");
}
}
<%--
Created by IntelliJ IDEA.
User: muqua
Date: 2022/7/24
Time: 19:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$title>
<script src="${pageContext.request.contextPath}/static/js/jquery-3.6.0.js">script>
<script>
function a(){
$.post({
url: "${pageContext.request.contextPath}/a1",
data: {
"name": document.getElementById("username").value
//"name": $("#username").val()
},
success: (res) => {
alert(res);
}
/*
success: function (data) {
alert(data);
}
*/
})
}
script>
head>
<body>
<%-- 失去焦点的时候,发起一个请求到 后端--%>
用户名:<input type="text" id="username" onblur="a()"/>
body>
html>
如果 并没有什么反应,没有发送请求。那么 你就得 clear 一下项目,并且重启IDEA和重启tomcat项目。

clear 项目





xhr 请求 状态码:
404 :找不到 请求得 url / 资源500 :回调函数 有误。可能 无法 从 Contoller 那里 有效的 返回数据。我们在 回调函数这里,可以 拿到 状态码


package top.muquanyu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
private String gender;
}

2. 写 Controller 代码
@RequestMapping("/a2")
public List<User> a2(){
User A = new User("A", 18, "男");
User B = new User("B", 19, "女");
User C = new User("C", 20, "男");
List<User> userList = new ArrayList<>();
userList.add(A);
userList.add(B);
userList.add(C);
return userList;
}
其实 SpringMVC 是支持 返回 一个 对象 或者 集合的。 也就是说 不光光是 返回 JSON 字符串。这也是它 强大的 一个地方。这样进行 数据的传输 会更加的方便!

那么 如何 让 这个 数据 通过 AJAX 异步请求 展示到 一个 界面上呢?
<%--
Created by IntelliJ IDEA.
User: muqua
Date: 2022/7/26
Time: 18:31
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Titletitle>
<script src="${pageContext.request.contextPath}/static/js/jquery-3.6.0.js">script>
head>
<body>
<input type="button" value="加载数据" id="btn">
<table>
<tr>
<th>姓名th>
<th>年龄th>
<th>性别th>
tr>
<tbody id="content">
tbody>
table>
<script>
$("#btn").click(function (){
$.post({
url: "${pageContext.request.contextPath}/a2",
success: (res) => {
let html = "";
for(let i = 0; i < res.length; ++i){
html += "" +
"" + res[i].name + " " +
"" + res[i].age + " " +
"" + res[i].gender + " "
+" "
}
console.log(html);
$("#content").html(html);
}
});
// 在这个地方写 会失效。必须在 success 里面 及时的去 执行相关代码
});
script>
body>
html>
success 接收过来数据,最好 就即使的 去处理。别放到 外面的作用域,否则会出现 一些 取不到数据或数据自动消失的情况。
