JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
JavaEE学习日志(六十四)
AJAX
AJAX异步请求
A:异步
J:JavaScript
A:And
X:XML
同步请求:客户端请求到服务器,如果服务器没有响应,客户端只能等待,类似于卡死效果。
异步请求:客户端请求到服务器,如果服务器没有响应,客户端可以自由活动。
AJAX执行原理
浏览器内置了AJAX的引擎
原生态的JavaScript实现异步请求
实现步骤
- 获取AJAX引擎
- 设置回调函数。自定义函数,服务器响应成功后,自动调用。
- 设置请求服务器路径
- 提交
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
/*
原生态的js实现ajax异步请求
*/
function fn() {
//获取AJAX引擎对象,XMLHttpRequest
var xmlhttp = new XMLHttpRequest();
//引擎对象调用事件,监听AJAX引擎的状态变化
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
//xmlhttp.responseText:AJAX引擎对象属性,服务器响应回来的文本数据
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
//设置服务器路径
xmlhttp.open("GET","/Web09/js_ajax");
//提交请求
xmlhttp.send();
}
</script>
</head>
<body>
<input type="button" value="ajax提交" onclick="fn()">
<div id="myDiv"></div>
</body>
</html>
服务器返回一个"收到"。
此时网页无刷新,还在这个页面。
jQuery的AJAX请求
跨浏览器操作
$.get() 函数
参数:
url
:提交的服务器地址data
:提交到服务器的数据,以k=v&k=v的格式发送callback
:回调函数,服务器响应成功后,自动调用函数type
:服务器端响应回来的数据类型。返回内容格式,xml, html, script, json, text, _default。
前端
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
function fn() {
/*
jQuery中的函数get异步请求
*/
$.get(
//传递服务器地址路径
"/Web09/jquery_get",
//传递提交到服务器的参数
"username=zhangsan&age=20",
//回调函数,服务器响应成功
//服务器响应回来的数据,会直接传递到参数中
function (data) {
alert(data);
},
//服务器响应的数据格式
"text"
);
}
</script>
</head>
<body>
<input type="button" value="get请求" onclick="fn()">
</body>
</html>
servlet
package com.itheima.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(urlPatterns = "/jquery_get")
public class Jquery_GetServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
接收客户端的异步请求
响应文本类型的数据
*/
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println(username+"="+age);
response.getWriter().write("hehe");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
$.post()函数
和get函数一模一样,只不过提交的数据从请求行变成了请求体
<script type="text/javascript">
function fn() {
/*
jQuery中的函数post异步请求
*/
$.post(
//传递服务器地址路径
"/Web09/jquery_post",
//传递提交到服务器的参数
"username=zhangsan&age=20",
//回调函数,服务器响应成功
//服务器响应回来的数据,会直接传递到参数中
function (data) {
alert(data);
},
//服务器响应的数据格式
"text"
);
}
</script>
$.ajax()函数
$.ajax()
:是get和post的底层函数,使用get或者post的时候,底层调用的都是ajax函数。
上层函数:简单,可以控制的内容少
底层函数:代码多,灵活性很大,可以控制的内容多
函数的参数:
url
:服务器请求的地址async
:异步请求或者同步请求,默认是true,表示异步data
:请求到服务器的参数,k=vdataType
:接收服务器响应的数据格式,text和json类型error
:服务器响应失败的回调函数success
:服务器响应成功的回调函数type
:get请求或post请求
代码示例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
function fn() {
/*
底层ajax函数
格式
$.ajax({
k:v,
k:v
});
*/
$.ajax({
//服务器路径
url:"/Web09/jquery_ajax",
//提交服务器的数据
data:"username=zhangsan&age=20",
//设置响应失败的回调函数
error:function () {
alert("服务器响应失败");
},
//响应成功的回调函数
success:function (data) {
alert("服务器响应成功"+data);
},
//设置接收的响应数据格式
dataType:"text",
//设置请求方式
type:"GET"
});
}
</script>
</head>
<body>
<input type="button" value="ajax提交" onclick="fn()">
</body>
</html>
ajax没有中文乱码问题
这样写完全没问题,张三可以被服务器接收到
<script type="text/javascript">
function fn() {
$.get(
"/Web09/demo",
"username=张三",
function (data) {
alert(data);
},
"text"
);
}
</script>
异步请求和同步请求的差异
同步请求:没有响应会卡死
异步请求:没有响应,自由活动
好处:速度快,用户体验好,节约资源
JSON数据格式
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,就是说不同的编程语言JSON数据是一致的。JS原生支持JSON。
JSON格式
json有两种格式:
对象格式:{"key1":obj,"key2":obj,"key3":obj...}
键必须是字符串
数组格式:[obj,obj,obj...]
注意:对象格式和数组格式可以互相嵌套
JSON练习一
<script type="text/javascript">
/**
* 案例一
* {key:value,key:value}
*
* class Person{
* String firstname = "张";
* String lastname = "三丰";
* Integer age = 100;
* }
*
* Person p = new Person();
* System.out.println(p.firstname);
*/
//JSON数据格式,表示Java中的对象
var person = {"firstname":"张","lastname":"三丰","age":100};
//取出三丰
alert(person.lastname);
</script>
JSON练习二
<script type="text/javascript">
/**
* 案例二
* [{key:value,key:value},{key:value,key:value}]
* json数据本质是数组
* 有两个元素,每个元素都是一个对象
*/
var json = [
{"firstname":"张","lastname":"三丰","age":100},
{"firstname":"李","lastname":"四","age":150}
];
for (var i=0;i<json.length;i++){
alert(json[i].firstname+json[i].lastname+"=="+json[i].age);
}
</script>
JSON练习三
<script language="JavaScript">
/**
* 案例三
* {
* "param":[{key:value,key:value},{key:value,key:value}]
* }
* json本质是对象
* 对应的键是param
* 对应的值是数组
* 数组有两个元素
* 每个元素都是一个对象
*
*
*/
var json = {
"param":[
{"firstname":"张","lastname":"三丰","age":100},
{"firstname":"李","lastname":"四","age":150}
]
}
//取出李四
alert(json.param[1].firstname+json.param[1].lastname);
</script>
JSON练习四
<script language="JavaScript">
/**
* 案例四
* {
* "param1":[{key:value,key:value},{key:value,key:value}],
* "param2":[{key:value,key:value},{key:value,key:value}],
* "param3":[{key:value,key:value},{key:value,key:value}]
* }
*
*
*/
var json = {
"param1":[
{"firstname":"张","lastname":"三丰","age":100},
{"firstname":"李","lastname":"四","age":150}
],
"param2":[
{"firstname":"张","lastname":"四丰","age":200},
{"firstname":"李","lastname":"五","age":250}
],
"param3":[
{"firstname":"张","lastname":"五丰","age":300},
{"firstname":"李","lastname":"六","age":350}
]
}
//取出李四
alert(json.param1[1].firstname+json.param1[1].lastname)
</script>
AJAX响应JSON数据
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
<script type="text/javascript">
function fn() {
/*
发送AJAX请求
获取服务器响应的数据,使用JSON格式
*/
$.get(
"/Web09/jquery_json",
"username=张三",
function (data) {
alert(data.lastname);
},
"json"
);
}
</script>
</head>
<body>
<input type="button" value="json提交" onclick="fn()">
</body>
</html>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(request.getParameter("username"));
//向客户端响应JSON数据格式
response.setContentType("text/html;charset=utf-8");
//定义一个JSON数据 {"firstname":"张","lastname":"三丰","age":100}
String json = "{\"firstname\":\"张\",\"lastname\":\"三丰\",\"age\":100}";
response.getWriter().write(json);
}
JSON-LIB工具
作用:把java中的数据转成JSON格式的数据
包含:对象,数组,集合…
缺点:
- jar包太多,需要全部使用才能生效。
- 有两个不同的方法来转换对象和集合
- JSON-LIB工具把对象person中的数据转成json格式
方法:JSONObject.fromObject(person)
返回值是本类的对象,需要再次调用方法toString()
来获得字符串
public void objectToJson(){
Person person = new Person("张三",30,"浙江省杭州市");
//JSON-LIB工具:JSONObject类静态方法fromObject
//方法返回值是本类的对象,再次调用方法toString()
String json = JSONObject.fromObject(person).toString();
System.out.println(json);//{"address":"浙江省杭州市","age":30,"name":"张三"}
}
- 集合或数组转成json
方法:JSONArray.fromObject(list)
需要再次调用方法toString()
来获得字符串
public void listToJson(){
List<Person> list = new ArrayList<>();
list.add(new Person("张三",20,"浙江省杭州市"));
list.add(new Person("李四",33,"浙江省宁波市"));
list.add(new Person("王五",44,"浙江省温州市"));
//JSON-LIB工具:JSONArray类静态方法fromObject
String json = JSONArray.fromObject(list).toString();
System.out.println(json);
//[{"address":"浙江省杭州市","age":20,"name":"张三"},{"address":"浙江省宁波市","age":33,"name":"李四"},{"address":"浙江省温州市","age":44,"name":"王五"}]
String[] str = {"qq","wx","msn"};
String json2 = JSONArray.fromObject(str).toString();
System.out.println(json2);//["qq","wx","msn"]
}
Gson工具(用它)
谷歌公司开发的一个转换工具和JSON-LIB工具一样
把java中的数据转成JSON格式的数据
优点:
- 就一个jar包
- 一个方法就能转换所有数据
使用步骤:
- 创建Gson对象
Gson gson = new Gson();
- 调用方法
gson.toJson(任意数据)
public void listToJson() {
List<Person> list = new ArrayList<>();
list.add(new Person("张三", 20, "浙江省杭州市"));
list.add(new Person("李四", 33, "浙江省宁波市"));
list.add(new Person("王五", 44, "浙江省温州市"));
//gson工具实现转换
Gson gson = new Gson();
//对象调用一个方法叫toJson(任意数据)
String json = gson.toJson(list);
System.out.println(json);
//[{"name":"张三","age":20,"address":"浙江省杭州市"},{"name":"李四","age":33,"address":"浙江省宁波市"},{"name":"王五","age":44,"address":"浙江省温州市"}]
}