Ajax
学习教程:https://www.bilibili.com/video/BV1BJ411L7NR?p=21
Ajax “Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是一种交互方式。异步加载,客户端与服务器的数据交互在局部页面更新,不需要刷新整个界面
优点:
局部刷新,效率高用户体验好
为什么需要异步加载 同步加载可能导致的问题:用户想刷新某一部分的数据,刷新后在等待刷新结果时用户开始填同一页面内新的表单,同步加载会导致用户正在填写的表单也清空,降低用户体验。 因此引入异步加载,异步加载使操作之间互不影响。
传统WEB数据交互 VS AJAX数据交互
客户端请求方式不同: 传统:浏览器发送同步请求(form、a标签) AJAX:异步引擎对象发送异步请求服务器响应方式不同: 传统:响应一个完整的jsp页面 AJAX:响应需要的数据客户端处理方式不同: 传统:需要等待服务器完成响应并且重新加载整个页面之后,用户才能进行后续操作(同步) AJAX:动态更新页面的局部内容,不影响用户其他操作
AJAX原理
基于js,用户界面通过js代码,使用AJAX引擎发送异步请求到服务器,服务器返回数据(可以是text、json、html、xml),AJAX引擎获得数据后通过动态拼接DOM+CSS最终返回到用户界面。
具体使用(基于jQuery的Ajax)
1.引入JQuery,新建js目录 下载地址:http://www.jq22.com/jquery-info122
新建test.jsp,在jsp中引入
<script type
="text/javascript" src
="js/jquery-3.3.1.min.js"></script
>
验证是否引入成功 同样,在test.jsp代码中写以下的JavaScript代码,reBuild一下再启动,若弹出123则成功。
<script type
="text/javascript " >
$
(function
() {
alert(123);
})
</script
>
否则可能是JQuery没导入成功。
JQuery基本语法 https://www.w3cschool.cn/jquery/jquery-syntax.html
基于jQuery的AJAX语法
$.ajax({ 属性1:‘参数1’, 属性2:‘参数2’, }) 常用的属性参数: url:请求的后端服务地址(servlet) type:请求方式,默认get data:请求参数 dataType:服务器返回的数据类型,text、json success:请求成功的回调函数 error:请求失败的回调函数 complete:请求完成的回调函数(无论成功或者失败) 如果请求成功:先进complete再进success 如果失败:先进error再进complete
JSON
JavaScript Object Notation,轻量级数据交换格式,完成js与java等后端语言对象数据的转换。 客户端与服务器传输对象需要用到json
添加jar包:注意放的文件夹要对
Ajax使用
简单的异步传输文本
-----------------------------------------------------------------
test
.jsp代码:
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head>
<title>Title
</title
>
<script type
="text/javascript" src
="js/jquery-3.3.1.min.js"></script
>
<script type
="text/javascript " >
$
(function
() {
var btn
= $
("#btn");
btn
.click(function
() {
$
.ajax({
url
:'/test',
type
:'post',
dataType
:'text',
data
:'id=1',
success
:function
(data
) {
var text
= $
("#text");
text
.before("<span>"+data
+"</span><br/>")
}
})
});
})
</script
>
</head
>
<body>
<input id
="text" type
="text" /><br
/>
<%-- 使用button实现异步提交,不用submit
--%>
<input id
="btn" type
="button" value
="提交" /><br
/>
</body
>
</html
>
----------------------------------分割线
---------------------------------------------
TestServlet代码:
package com
.southwind
.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
;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
String id
= req
.getParameter("id");
try {
Thread
.sleep(2);
} catch (InterruptedException e
) {
e
.printStackTrace();
}
String str
= "HelloWorld";
resp
.getWriter().write(str
);
}
}
点击提交后,只返回文本,而不将整个页面刷新。 前端:不能用表单提交请求,表单提交是同步加载。要用JQuery方式动态绑定事件来提交。
$
("#btn").click(function(){})
服务端:不能跳转页面,只能将数据返回。
简单的异步传输对象
------------------------------------------------------------------------
jsp代码:
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head>
<title>Title
</title
>
<script type
="text/javascript" src
="js/jquery-3.3.1.min.js"></script
>
<script type
="text/javascript " >
$
(function
() {
$
("#btn").click(function
() {
$
.ajax({
url
:'/test1',
type
:'post',
dataType
:'json',
data
:'id=1',
success
:function
(data
) {
$
("#id").val(data
.id
);
$
("#name").val(data
.name
);
$
("#score").val(data
.score
);
},
})
});
})
</script
>
</head
>
<body>
编号:
<input id
="id" type
="text" /><br
/>
姓名:
<input id
="name" type
="text" /><br
/>
成绩:
<input id
="score" type
="text" /><br
/>
<input id
="text" type
="text" /><br
/>
<%-- 使用button实现异步提交,不用submit
--%>
<input id
="btn" type
="button" value
="提交" /><br
/>
</body
>
</html
>
-------------------------------------------------------------------------
Test2Servlet代码:
package com
.southwind
.servlet
;
import com
.southwind
.entity
.User
;
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
;
@WebServlet("/test1")
public class Test2Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{
User user
= new User(1,"张三",96.5);
JSONObject jsonObject
= JSONObject
.fromObject(user
);
resp
.setCharacterEncoding("UTF-8");
resp
.getWriter().write(jsonObject
.toString());
}
}
输出:
看到现在,如果你已经关注到了servlet是如何向前端发送信息的话,那么你应该会像我一样有个疑问,为什么servlet是通过resp.getWriter().write()这种形式来向前端发送数据的呢?这种方式不是直接输出到网页上吗?
首先AJAX能捕捉到的只是网页的内容,也就是响应体的内容。而resp.getWriter().write()正好把数据打包成ajax所需要的内容,也就是放在了响应体内,因此ajax能捕捉到服务端发送的数据。
验证:在浏览器上点开F12,进入开发者模式