简介

已经知道,JavaScript是一种浏览器脚本语言,Ajax是一种内嵌到浏览器中的一种技术

jQuery是一个以JavaScript为基础的plugin,即jQuery可以简化JavaScript开发;jQuery也可以简化Ajax的开发

Ajax的流程包括创建XmlHttpRequest对象,发送Ajax请求,处理服务器响应三个步骤;比较麻烦;jQuery也提供了对Ajax的支持;在jQuery中对Ajax进行了大幅度的简化和封装

jQuery对Ajax的支持

简单示例

为了使用jQuery需要先引入jQuery文件导入

jajax1

NewListServlet类:稍微修改一下

(1)后台处理后的数据向前台传的时候,需要转成JSON字符串;这需要引入fastjson的jar包

(2)这个Servlet并没有主动重定向至news.html;而是在这儿默默的等待,等待news.html的Ajax的XmlHttpServlet主动去请求访问这个servlet

(3)这个Servlet通过,response.getWritwe().println(newsJsonStr);将JSON字符串回显到html中

(4)为了演示$.ajax()中的data传递参数,servlet中设置了if()else if()判断语句;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import com.alibaba.fastjson.JSON;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "NewsListServlet", value = "/news_list")
public class NewsListServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String type = request.getParameter("t");//获取发送请求中的参数t(key)
List<News> list = new ArrayList<News>();//创建集合对象list
if(type !=null && type.equals("tiobe")) {//如果有带参且参数的值匹配字符串tiobe,增加下列的集合
list.add(new News("标题1", "2022-1-1", "TIOBE", "内容1"));//在集合中增加内容
list.add(new News("标题2", "2022-1-2", "TIOBE", "内容2"));
list.add(new News("标题3", "2022-1-3", "TIOBE", "内容3"));
} else if (type == null || type.equals("pypl")) {//如果上面的不匹配,不带参数或者带参的值为pypl,增加下列集合中的内容
list.add(new News("标题1","2021-1-1","TIOBE","内容1"));
list.add(new News("标题2","2021-1-2","TIOBE","内容2"));
list.add(new News("标题3","2021-1-3","TIOBE","内容3"));

}

//在Servlet处理后,对外进行字符串序列化的时候,一律将其转化为JSON:通过JSON,可以对数据进行有效的描述
//然后在前端的html中,再通过javaScript自带的JSON处理方式,将从这儿发送过去的数据进行解析
//将集合对象list转成JSON需要,引入fastjson包,可以这样想回显是需要字符串的
String newsjsonstr = JSON.toJSONString(list);
System.out.println(newsjsonstr);
response.setContentType("text/html;charset=UTF-8");//json字符串中包含中文需要设置编码
response.getWriter().println(newsjsonstr);//回显从list集合对象序列化成json字符串,回显到html中


}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

新增jquery_news.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Inset title here</title>
<script type="text/javascript" src="JS/jquery-3.6.0.js"></script>
<script>
$(function (){//创建一个页面就绪函数,其用途是在页面加载完毕后,执行这个function里面的代码
$.ajax({
"url":"/ajax/news_list",
"type":"get",
"data":"t=pypl",
"dataType":"json",//服务器响应的数据类型为json,也就说这里将回显的JSON字符串转变为JOSN对象
"success":function (json){//这里的json只是一个变量,用来接受服务器返回的数据,也就是说这里接受到从JSON字符串转变的JSON对象
console.log(json);
for (var i=0;i<json.length;i++){
//append()作用可以将append()中的html代码追加到div中
$("#container").append("<h1>"+json[i].title+"</h1>")
}
}
})
});
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>

效果:在div中输出JSON对象调用的title属性,在控制台中输出接受服务器的数据也就是JSON对象

jajax2

$.ajax({})中的JSON表达式添加error项

jquery_news.html文件中的$.ajax({})的JSON表达式添加error项。为了演示执行error内容的效果,,故意将JSON表达式中的type改成了post,而Servlet中是get方式,所以会报错,会执行error的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Inset title here</title>
<script type="text/javascript" src="JS/jquery-3.6.0.js"></script>
<script>
$(function (){//创建一个页面就绪函数,其用途是在页面加载完毕后,执行这个function里面的代码
$.ajax({
"url":"/ajax/news_list",
"type":"post",
"data":"t=pypl",
"dataType":"json",//服务器响应的数据类型为json,也就说这里将回显的JSON字符串转变为JOSN对象
"success":function (json){//这里的json只是一个变量,用来接受服务器返回的数据,也就是说这里接受到从JSON字符串转变的JSON对象
console.log(json);
for (var i=0;i<json.length;i++){
//append()作用可以将append()中的html代码追加到div中
$("#container").append("<h1>"+json[i].title+"</h1>")
}
},
"error":function (xmlhttp,errorText){//xmlhttp代表的是XmlHttpRequest对象,errorText代表的是错误的代码文本,这里jquery自动创建XmlHttpRrquest对象实例 名字叫xmlhttp
console.log(xmlhttp);
console.log(errorText);
if (xmlhttp.status == "405"){//如果XmlHttpRequest对象(接受后台与服务器交换的数据),这里监视数据的状态,如果状态为405
alert("无效的请求方式");
}else if (xmlhttp.status == "404"){
alert("未找到url资源");
}else if (xmlhttp.status == "500"){
alert("服务器内部错误");
}else {
alert("其他异常");
}
}
})
});
</script>
</head>
<body>
<div id="container"></div>
</body>
</html>

此时执行的效果:

执行error部分,因为是请求方式错误,故错误码为405,所以会执行error中的alert(“无效的请求方式”);部分

在上面的示例中,针对不同的错误,只是打印了一些简单的信息,在实际中,会更加复杂,会根据实际业务不同,针对不同的错误情况做出不同的处理

jajax3

data参数最好采用json的形式;这样更好看

1
2
3
4
<script>
"data":{"t":"pypl","abc":"123"},//data最好使用json的形式书写;其实在程序在编译时会将json格式转化成下面的这种传统的方式
//"data":"t=pypl&abc=123"
</script>

jajax4

jQuery利用Ajax实现二级联动菜单

二级联动菜单的形式多种多样,在实际开发中十分常见

下面就是真实网站中的二级联动菜单

image-20220521192649781

下面就使用Ajax来实现二级联动菜单的案例

自然使用jQuery脚本来提供Ajax的简化

实现二级联动菜单的主要内容:JavaBean,Servlet类,html

Channel类:JavaBean

利用java实现封装,写入无参与有参的构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Channel {
private String code;
private String name;
public Channel(){}
public Channel(String code, String name) {
this.code = code;
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

ChannelServlet类:Servlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import com.alibaba.fastjson.JSON;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "ChannelServlet", value = "/channel")
public class ChannelServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String level = request.getParameter("level");//获取到请求中的level属性并赋予字符串level,level=1:对应第一级菜单,level=2:对应二级菜单
String parent = request.getParameter("parent");//获取到请求中的parent属性并赋予字符串parent,对应一级菜单选项<option>的value值
List chlist = new ArrayList<>();
if (level.equals("1")){//Ajax传入的参数
chlist.add(new Channel("ai","前沿/区块链/人工智能"));
chlist.add(new Channel("web","前端/小程序/JS"));
} else if (level.equals("2")) {
if (parent.equals("ai")){
chlist.add(new Channel("mirco","微服务"));
chlist.add(new Channel("blockchain","区块链"));
chlist.add(new Channel("other","……"));

}else if (parent.equals("web")){
chlist.add(new Channel("html","HTML"));
chlist.add(new Channel("css","CSS"));
chlist.add(new Channel("other","……"));
}
}
String json = JSON.toJSONString(chlist);//利用fastjson将将集合转变为JSON字符串
response.setContentType("text/html;charset=utf-8");
response.getWriter().println(json);//回显到前端中的JSON字符串

}
}

channel.html:html

执行流程:

首先,第一个初始化函数会初始化第一级菜单;即data的参数是level=1,此时会执行servlet中的if(level.equals(“1”)){};的部分;

即执行完第一个初始化函数后,会调用一次Servlet,最后的结果就是浏览器上的第一级菜单初始化了;此时,浏览器上的第一级菜单就会存下Servlet返回的结果,并在浏览器的页面上显示出来

其次,当第一级菜单发生change的时候(也就是选择第一级菜单的时候),会调用第二个初始化函数;此时的data参数是{“level”:”2”,”parent”:parent};其中parent是第一级菜单的option的key值,这个值是从浏览器中获取到的,然后去调用Servlet增加到chlist中,然后添加到二级菜单中,仍然会从头到尾执行,自然Servlet中的chlist需要重新创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Ajax实现二级菜单联动</title>
</head>
<script type="text/javascript" src="JS/jquery-3.6.0.js"></script>
<script>
$(function(){//页面就绪函数完成第一阶段,页面初始化的时候,加载出第一级菜单
$.ajax({
"url":"/ajax/channel",
"type":"get",
"data":{"level":"1"},
"dataType":"json",//将服务器回显到前端中JSON字符串转变为JSON对象
"success":function (json){//json只是存放变量的变量名字
console.log(json);
for (var i=0;i<json.length;i++){
var ch = json[i];
$("#lv1").append("<option value='"+ch.code+"'>"+ch.name+"</option>")
}

}
})
})
$(function () {//jquery允许出现多个页面就绪函数,执行是从上到下依次执行,每一个页面就绪函数最好是一个独立的功能
$("#lv1").on("change",function (){//on()方法的作用是用来绑定事件
var parent=$(this).val();//this()代表的是当前触发事件的对象(也就是一级菜单),val(),其作用是获取输入项的值(这里获取到了一级菜单中的key值),同样可以用在下拉框中,这里是获取到一级菜单中的key值
$.ajax({
"url":"/ajax/channel",
"type":"get",
"data":{"level":"2","parent":parent},
"dataType":"json",
"success":function (json) {
console.log(json);
$("#lv2>option").remove();//移除所有lv2下的原始option选项,这里使用了jQuery中的子选择器
for (var i=0;i<json.length;i++){
var ch=json[i];
$("#lv2").append("<option value='"+ch.code+"'>"+ch.name+"</option>");
}
}
})
})
})
</script>
<body>
<select id="lv1" style="width: 200px;height: 30px">
<option selected="selected">请选择</option>
</select>
<select id="lv2" style="width: 200px;height: 30px">

</select>
</body>
</html>

效果:可以根据一级菜单的不同,实现不同内容的二级菜单

jajax5

jajax6


整体来看,Ajax的应用场景十分广泛,明白Ajax的作用,实际中很多业务场景适合使用Ajax

在实现某种业务问题时,具体的实现方式和实现策略,需要多看多写实际的例子