AJAX用于异步更新页面的局部内容。


ajax常用的请求数据类型

  • text    纯文本字符串
  • json    json数据

使用ajax获取text示例

此种方式常用于前端向后台查询实体的一个属性(字段),比如查询总分。

前端页面

<body>
<form>
学号:<input type="text" id="no"><br />
姓名:<input type="text" id="name"><br />
<button type="button" id="btn">查询成绩</button>
</form>
<p id="score"></p> <script src="js/jquery-3.4.1.min.js"></script>
<script>
$("#btn").click(function () {
$.ajax({
url:"servlet/HandlerServlet", //请求地址
type:"get", //请求方法
data:{"no":$("#no").val(),"name":$("#name").val()}, //要发送的数据,相当于表单提交的数据,json形式。
dataType:"text", //期待返回的数据类型,也可以理解为请求的数据类型
error:function () { //发生错误时的处理 },
success:function (data) { //成功时的处理。参数表示返回的数据
$("#score").text(data);
}
})
});
</script>
</body>

这里使用了jq提供的ajax方法,所以要用<script>将jq的库文件包含进来。

json的key只能是字符串,标准写法要引,实际上不引也可以,会自动转换为字符串。

json的value可以是多种数据类型,如果是字符串,需要引起来。

后台

@WebServlet("/servlet/HandlerServlet")
public class HandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); //获取ajax传递的参数,和获取表单数据的方式一样
String no=request.getParameter("no");
String name=request.getParameter("name"); //此处省略连接数据库查询,直接返回成绩
PrintWriter writer = response.getWriter();
writer.write(name+"同学,你的总分是:600");
}
}

说明

  • ajax请求的的url要和servlet配置的urlPatterns对应,这个地方很容易出错
  • servlet返回响应时,不管write()多少次,都只组成一个响应返回。
      PrintWriter writer = response.getWriter();
writer.write("中国");
writer.write("北京");
      PrintWriter writer = response.getWriter();
writer.write("中国北京");

这2种方式完全等效,浏览器接受到的都是“中国北京”,“中国”“北京”之间没有空格。


使用ajax获取json对象示例

此种方式常用于后台向前端传送一个实体|JavaBean(一个实体的多个字段),比如查询一个学生的信息。

前端

<body>
<form>
学号:<input type="text" id="no"><br />
<button type="button" id="btn">查询学生信息</button>
</form>
<p id="show"></p> <script src="js/jquery-3.4.1.min.js"></script>
<script>
$("#btn").click(function () {
$.ajax({
url:"servlet/HandlerServlet",
type:"post",
data:{},
dataType:"json",
error:function () {
console.log("ajax请求数据失败!");
},
success: function (data) {
//浏览器把接受到的json数据作为js对象,可通过.调用属性
var info = "姓名:" + data.name + ",年龄:" + data.age + ",成绩:" + data.score;
$("#show").text(info);
console.log(data);
}
})
});
</script>
</body>

后台

@WebServlet("/servlet/HandlerServlet")
public class HandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); //获取ajax传递的参数,和获取表单数据的方式一样
String no=request.getParameter("no"); //现在很多持久层框架都是把数据库返回的记录转化为JavaBean处理
//此处省略连接数据库查询,得到Student类实例
Student student = new Student(1, "张三", 20, 100); //使用fastjson将java对象转换为json字符串
String jsonStr = JSON.toJSONString(student);

PrintWriter writer = response.getWriter();
writer.write(jsonStr);
}
}

JSON.toJSONString()使用的是阿里的fastjson.jar,需要自己下载添加这个jar。


使用ajax获取json数组

此种方式用于后台向前端返回同一实体类的多个实例,比如查询总分大于600的学生的信息,可能有多条记录满足要求。

前端

<body>
<button type="button" id="btn">查询学前三个学生的信息</button>
<div id="show"></div> <script src="js/jquery-3.4.1.min.js"></script>
<script>
$("#btn").click(function () {
$.ajax({
url:"servlet/HandlerServlet",
type:"post",
data:{},
dataType:"json",
error:function () {
console.log("ajax请求数据失败!");
},
success: function (data) {
console.log(data);
//遍历json数组
for (var i=0;i<data.length;i++){
//从json数组得到json对象
var student = data[i];
var info = "姓名:" + student.name + ",年龄:" + student.age + ",成绩:" + student.score;
$("#show").append("<p>" + info + "</p>"
);
}

}
})
});
</script>
</body>

使用  data[下标].字段名  的方式获取属性值。

后台

@WebServlet("/servlet/HandlerServlet")
public class HandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); //获取ajax传递的参数,和获取表单数据的方式一样
String no=request.getParameter("no"); //现在很多持久层框架都是把数据库返回的记录转化为JavaBean处理
//此处省略连接数据库查询,得到Student类的多个实例
Student student1 = new Student(1, "张三", 20, 100);
Student student2 = new Student(2, "李四", 19, 80);
Student student3 = new Student(3, "王五", 20, 90);
ArrayList<Student> list = new ArrayList<>();
list.add(student1);
list.add(student2);
list.add(student3); //使用fastjson将java对象转换为json字符串
String jsonStr = JSON.toJSONString(list); PrintWriter writer = response.getWriter();
writer.write(jsonStr);
}
}

使用ajax获取map类型的json数据

使用场景:前端向后台查询多个信息,这些信息不是同一实体类的实例。比如要查询考生人数、最高分考生的信息,考生人数是int型,最高分考生信息是Student类的实例。

前端

<body>
<button type="button" id="btn">查询考生人数、最高分考生信息</button>
<div id="show"></div> <script src="js/jquery-3.4.1.min.js"></script>
<script>
$("#btn").click(function () {
$.ajax({
url:"servlet/HandlerServlet",
type:"post",
data:{},
dataType:"json",
error:function () {
console.log("ajax请求数据失败!");
},
success: function (data) {
console.log(data);
$("#show").append("<p>考生人数:"+data.amount+"</p>");
var student = data.student;
var info = "姓名:" + student.name + ",年龄:" + student.age + ",成绩:" + student.score;
$("#show").append("<p>最高分考生信息:" + info + "</p>");
}
})
});
</script>
</body>

以  data.key  的方式获取对应的value。

后台

@WebServlet("/servlet/HandlerServlet")
public class HandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); //获取ajax传递的参数,和获取表单数据的方式一样
String no=request.getParameter("no"); //现在很多后台框架都是把数据库返回的记录转化为JavaBean处理
//此处省略连接数据库查询,得到Student类实例
HashMap<String, Object> map = new HashMap<>();
map.put("amount", 3000);
map.put("student", new Student(1, "张三", 20, 680)); //使用fastjson将java对象转换为json字符串
String jsonStr = JSON.toJSONString(map); PrintWriter writer = response.getWriter();
writer.write(jsonStr);
}
}

map和json对象十分相似:都是以键值对的形式保存数据,key是String,value是Object。

所以后台map类型的数据可以以json的形式传给前端。


说明

  • 前端使用了jq的ajax()方法,所以需要把jq的库文件包含进来
  • 后台向前端传json数据时,使用了阿里巴巴的fastjson库,需要自己下载引入fastjson.jar
  • ajax还有一个常用选项 async:boolean,是否异步请求数据,默认为true  异步请求

async:true    异步,ajax向后台请求数据时,用户仍可以在页面上进行操作

async:false   同步,ajax向后台请求数据,浏览器锁定页面,用户不能在页面上进行操作,直到请求完成

最新文章

  1. socket泄露的问题
  2. 关于DataTable添加新列到指定列的方法
  3. UESTC 899 方老师和农场 --双连通分量的构造
  4. javaweb学习总结(三十)——EL函数库
  5. C++的异常处理
  6. ABBYY可以给我们解决那些问题
  7. C# 多线程传参
  8. 怎么做QQ、微信等消息气泡
  9. 信号驱动的IO
  10. JSTL(fn函数)
  11. Mac下配置cocos2d-x开发环境(android和ios)
  12. javascript插件编写小结
  13. mysql 的存储引擎
  14. Hibernate 使用注解后没发现建表
  15. L10 PUtty+SSH 访问vncviewer
  16. java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证
  17. POJ 36666 Making the Grade 简单DP
  18. Work 3(工作类) (2017.07.01)
  19. App Icon Gear App 图标制作工具
  20. java 中利用异或实现两个变量互换

热门文章

  1. 生成树计数模板 spoj 104 (不用逆元的模板)
  2. 吴裕雄 python 机器学习——人工神经网络与原始感知机模型
  3. java将小写金额转换为大写的工具类
  4. Go_Json序列化
  5. Linux 设备驱动IO操作
  6. wix在使用heat自动生成wxs时添加windows服务组件
  7. HL7解析器
  8. SSHException: Error reading SSH protocol banner
  9. CSS - div中的文字不换行,超出宽度就用省略号表示
  10. plutosdr初步