typora-copy-images-to: img

Ajax

学习目标

  • [ ] 了解Ajax的概念和作用

  • [ ] 了解同步和异步的区别

  • [ ] 能够使用jQuery的$.get()$.post()发送Ajax请求

  • [ ] 能够使用jQuery的$.ajax()方法发送Ajax请求

  • [ ] 能够定义和解析json

  • [ ] 能够使用Jackson转换json格式

  • [ ] 能够使用fastjson转换json格式

第一章-JS的AJAX

知识点- AJAX的概述

1.目标

  • 能够理解异步的概念

2.路径

  • 什么是Ajax
  • 什么是异步
  • 为什么要学习Ajax

3.讲解

3.1 什么是AJAX

Ajax - 图1

  1. 说白了: AJax是可以做异步的请求,实现局部刷新一种客户端技术

3.2什么是异步

  • 同步

Ajax - 图2

  • 异步
    Ajax - 图3

3.3为什么要学习AJAX

  1. 提升用户的体验。(异步)
  2. 实现页面局部刷新。
  3. 将部分的代码,写到客户端浏览器。

4.小结

  1. 什么是Ajax: 可以用来实现异步请求, 进行局部刷新客户端技术
  2. 为什么要学习Ajax?

    • 提升用户的体验。(异步)
    • 实现页面局部刷新。
    • 将部分的代码,写到客户端浏览器。

知识点-JS的Ajax入门【了解】

1.目标

  1. 在网页上点击按钮, 点击按钮, 发送Ajax请求服务器,响应hello Ajax

2.步骤

  1. 第一步:创建异步请求对象。
  2. 第二步:打开连接。
  3. 第三步:发送请求。
  4. 第四步:设置监听对象改变所触发的函数,处理结果

3.讲解

3.1GET请求方式的入门

  1. <script>
  2. //声明一个发送异步请求的方法
  3. function fn1() {
  4. //使用js原生的代码发送异步的get请求
  5. //1. 创建一个ajax引擎对象
  6. var xhr = new XMLHttpRequest();
  7. //2. 建立和服务器的连接
  8. xhr.open("GET","/demo01?username=jay")
  9. //3. 发送请求
  10. xhr.send()
  11. //4. 处理响应
  12. //也就是怎么展示响应数据: 将响应数据展示到id为msg的div中
  13. xhr.onreadystatechange = function () {
  14. if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
  15. //获取响应数据
  16. var responseText = xhr.responseText;
  17. //展示响应数据
  18. document.getElementById("msg").innerHTML = responseText
  19. }
  20. }
  21. }
  22. </script>

3.2POST请求方式的入门

  1. <script>
  2. //声明一个方法发送异步的post请求
  3. function fn2() {
  4. //使用js原生的代码发送异步的post请求
  5. //1. 创建一个ajax引擎对象
  6. var xhr = new XMLHttpRequest();
  7. //2. 创建连接
  8. xhr.open("POST","/demo01")
  9. //3. 发送请求
  10. //post请求携带参数之前,先要设置Content-Type请求头,指定请求参数类型
  11. xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
  12. xhr.send("username=jay")
  13. //4. 处理响应
  14. xhr.onreadystatechange = function () {
  15. if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
  16. //获取响应数据
  17. var responseText = xhr.responseText;
  18. //展示响应数据
  19. document.getElementById("msg").innerHTML = responseText
  20. }
  21. }
  22. }
  23. </script>

第二章-JQ的AJAX【重点】

知识点-JQ的AJAX介绍

1.目标

  • 知道为什么要学习JQ的AJAX原因

2.讲解

2.1 为什么要使用JQuery的AJAX

  1. 因为传统(js里面)的AJAX的开发中,AJAX有两个主要的问题:
  2. 浏览器的兼容的问题 , 编写AJAX的代码太麻烦而且很多都是雷同的。
  3. 在实际的开发通常使用JQueryAjax ,或者Vue里面的axios

2.2JQuery的Ajax的API

请求方式 语法
GET请求 $.get(url, [data], [callback], [type])
POST请求 $.post(url, [data], [callback], [type])
AJAX请求 $.ajax([settings])

3.小结

  1. 为什么要用JQ的Ajax?
    JS的Ajax处理浏览器适配问题, 写起来过于繁琐
    实际开发里面基本不会使用JS的AJAX, 一般使用JQ的AJAX或者VUE里面的axios

  2. 掌握的方法

    • $.get(url, [data], [callback], [type])
    • $.post(url, [data], [callback], [type])
    • $.ajax([settings])

知识点-JQ的AJAX入门【重点】

1.目标

  1. 在网页上点击按钮, 发送Ajax请求服务器,响应hello ajax...
  2. 分别使用get,post,ajax三种方法

2.讲解

2.1get()

  • get方式, 语法 $.get(url, [data], [callback], [type]); | 参数名称 | 解释 | | —- | —- | | url | 请求的服务器端url地址 | | data | 发送给服务器端的请求参数,格式是key=value;get请求的参数可以直接写在url后面 | | callback | 当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码 | | type | 预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等 |
  • 实例
  1. //声明一个方法使用jQuery的ajax发送异步的get请求
  2. function fn3() {
  3. $.get("/demo01?username=tom",function (result) {
  4. //在这个回调函数中处理响应数据result
  5. //将响应数据展示在id为msg的div中
  6. $("#msg").html(result)
  7. })
  8. }

2.2post()

  • post方式, 语法 $.post(url, [data], [callback], [type]) | 参数名称 | 解释 | | —- | —- | | url | 请求的服务器端url地址 | | data | 发送给服务器端的请求参数,格式是key=value | | callback | 当请求成功后的回掉函数,可以在函数体中编写我们的逻辑代码 | | type | 预期的返回数据的类型(默认为text),取值可以是 xml, html, script, json, text, _defaul等 |
  • 实例
  1. //声明一个方法使用jQuery的ajax发送异步的post请求
  2. function fn4() {
  3. $.post("/demo01","username=jack",function (result) {
  4. //result就是服务器端的响应数据
  5. $("#msg").html(result)
  6. })
  7. }

2.3 ajax() 了解

  • 语法 $.ajax([settings])
    其中,settings是一个js字面量形式的对象,格式是{name:value,name:value… …},常用的name属性名如下 | 属性名称 | 解释 | | —- | —- | | url | 请求的服务器端url地址 | | async | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false | | data | 发送到服务器的数据,可以是键值对形式,也可以是js对象形式 | | type | (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET” | | dataType | 预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等 | | success | 请求成功后的回调函数 | | error | 请求失败时调用此函数 |
  • 实例
  1. //声明一个方法使用jQuery的ajax方法发送异步请求
  2. function fn5() {
  3. $.ajax({
  4. url:"/demo01", //请求路径
  5. data:"username=lucy", //请求参数
  6. type:"POST", //请求方式
  7. success:function (result) {
  8. $("#msg").html(result)
  9. }, //请求成功时候的回调函数
  10. error:function () {
  11. $("#msg").html("服务器异常")
  12. } //请求失败时候的回调函数
  13. })
  14. }

3.小结

  1. $.get/post(请求路径,[请求参数],[function(result){}],[响应结果的类型]);
  2. $.ajax({}) | 属性名称 | 解释 | | —- | —- | | url | 请求的服务器端url地址 | | async | (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false | | data | 发送到服务器的数据,可以是键值对形式,也可以是js对象形式 | | type | (默认: “GET”) 请求方式 (“POST” 或 “GET”), 默认为 “GET” | | dataType | 预期的返回数据的类型,取值可以是 xml, html, script, json, text, _defaul等 | | success | 请求成功后的回调函数 | | error | 请求失败时调用此函数 |

案例-使用JQ的Ajax完成用户名异步校验

1.需求分析

  1. 我们有一个网站,网站中都有注册的页面,当我们在注册的页面中输入用户名的时候,这个时候会提示,用户名是否存在。
  2. ![](https://gitee.com/tgl_bug/typora-table/raw/master/img/20210121132902.png#alt=img)

2,思路分析

Ajax - 图4

步骤:

  1. 导入jar包,拷贝配置文件、工具类、解决乱码的过滤器
  2. 创建包结构
  3. 编写前端代码发送异步请求
  4. 编写Servlet代码接收请求、调用业务层的方法处理请求、响应数据给客户端
  5. 编写业务层的代码处理请求
  6. 编写Dao层的代码查询数据

3.代码实现

  • 前端
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册页面</title>
  6. <script src="js/jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <form action="#" method="post">
  10. <!--目标:当用户名输入完毕,输入框失去焦点的时候,要校验用户名是否已经被注册了-->
  11. 用户名 <input type="text" name="username" onblur="checkUsername(this.value)">
  12. <span id="uSpan" style="color: red"></span>
  13. </form>
  14. <script>
  15. function checkUsername(username) {
  16. //发送异步请求校验用户名
  17. $.post("/user","action=checkUsername&username="+username,function (result) {
  18. //将响应数据展示到id为"uSpan"的标签中
  19. $("#uSpan").html(result)
  20. },"json")
  21. }
  22. </script>
  23. </body>
  24. </html>
  • UserServlet代码
  1. package com.itheima.web.servlet;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.itheima.pojo.User;
  4. import com.itheima.service.UserService;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.lang.reflect.Method;
  12. /**
  13. * 包名:${PACKAGE_NAME}
  14. *
  15. * @author Leevi
  16. * 日期2020-07-21 10:23
  17. */
  18. @WebServlet("/user")
  19. public class UserServlet extends HttpServlet {
  20. private UserService userService = new UserService();
  21. @Override
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. @Override
  26. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. String action = request.getParameter("action");
  28. try {
  29. Class clazz = this.getClass();
  30. //根据方法名获取方法
  31. Method method = clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
  32. //调用方法
  33. method.invoke(this,request,response);
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. /**
  39. * 校验用户名的方法
  40. * @param request
  41. * @param response
  42. */
  43. private void checkUsername(HttpServletRequest request, HttpServletResponse response) throws IOException {
  44. try {
  45. //1. 获取请求参数username的值
  46. String username = request.getParameter("username");
  47. //2. 调用业务层的方法,根据username查找用户
  48. User user = userService.findByUsername(username);
  49. //3. 判断user是否为null
  50. if (user != null) {
  51. //用户名不可用
  52. response.getWriter.writer("用户名已被占用");
  53. }else {
  54. //用户名可用
  55. response.getWriter.writer("用户名可用");
  56. }
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. //出现异常
  60. response.getWriter.writer("服务器异常");
  61. }
  62. }
  63. }
  • UserService的代码
  1. public class UserService {
  2. private UserDao userDao = new UserDao();
  3. public User findByUsername(String username) throws SQLException {
  4. return userDao.findByUsername(username);
  5. }
  6. }
  • UserDao的代码
  1. public class UserDao {
  2. private QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
  3. public User findByUsername(String username) throws SQLException {
  4. String sql = "select * from user where username=?";
  5. User user = queryRunner.query(sql, new BeanHandler<>(User.class), username);
  6. return user;
  7. }
  8. }

4.小结

当前案例存在问题:

服务器直接向客户端响应普通的字符串,客户端拿到了普通字符串之后,只能显示该字符串,没法根据服务器端的响应数据的不同而做一些自定义的处理,所以我们的想法是接下来将服务器端的响应数据封装成一个JavaBean对象

知识点-创建ResultBean用于封装项目的响应数据

分析

服务器要响应哪些数据给客户端?

  1. 服务器的状态: 是否出现异常
  2. 这次请求的处理结果: 比如说要显示在客户端的数据、用户名是否可用、联系人列表等等
  3. 如果服务器出现异常,则要将服务器想给客户端看的异常信息响应给客户端

实现

封装的ResultBean的代码

  1. package com.itheima.entry;
  2. import java.io.Serializable;
  3. /**
  4. * 包名:com.itheima.entry
  5. *
  6. * @author Leevi
  7. * 日期2020-07-21 10:47
  8. */
  9. public class ResultBean implements Serializable {
  10. //flag 表示服务器是否异常
  11. private Boolean flag;
  12. //data 表示这次请求的处理结果
  13. private Object data;
  14. //errorMsg 表示服务器的异常信息
  15. private String errorMsg;
  16. public ResultBean() {
  17. }
  18. public ResultBean(Boolean flag) {
  19. this.flag = flag;
  20. }
  21. public ResultBean(Boolean flag, String errorMsg) {
  22. this.flag = flag;
  23. this.errorMsg = errorMsg;
  24. }
  25. public ResultBean(Boolean flag, Object data) {
  26. this.flag = flag;
  27. this.data = data;
  28. }
  29. public ResultBean(Boolean flag, Object data, String errorMsg) {
  30. this.flag = flag;
  31. this.data = data;
  32. this.errorMsg = errorMsg;
  33. }
  34. @Override
  35. public String toString() {
  36. return "ResultBean{" +
  37. "flag=" + flag +
  38. ", data=" + data +
  39. ", errorMsg='" + errorMsg + '\'' +
  40. '}';
  41. }
  42. public Boolean getFlag() {
  43. return flag;
  44. }
  45. public void setFlag(Boolean flag) {
  46. this.flag = flag;
  47. }
  48. public Object getData() {
  49. return data;
  50. }
  51. public void setData(Object data) {
  52. this.data = data;
  53. }
  54. public String getErrorMsg() {
  55. return errorMsg;
  56. }
  57. public void setErrorMsg(String errorMsg) {
  58. this.errorMsg = errorMsg;
  59. }
  60. }

小结

封装好ResultBean之后,服务器的响应数据就会封装在ResultBean对象中;然后再想办法将ResultBean对象的信息响应给客户端,但是客户端是无法解析ResultBean对象的,所以我们需要先将ResultBean对象转换成客户端能够认识的数据格式,然后再响应给客户端

1.目标

  • 掌握json定义和解析的语法

2.路径

  1. json简介
  2. 语法介绍
  3. 使用示例

3. 讲解

3.1.json简介

Ajax - 图5

  • 用我们自己的话来说: JSON就是一个容易生成和解析的数据格式;
    常用作客户端(前端,IOS,安卓)和服务器(JavaEE)之间的数据交换

3.2. 语法介绍

  • 定义方式:

    • json是由键值对构成的,key和value之间使用冒号,个个键值对之间使用逗号隔开
    • json的value也可以是json类型
    • 如果有多个json对象,则可以存放在数组中
  • 解析语法:

    • 获取json对象里的value值:json对象.key
    • 获取数组里指定索引的元素:数组[索引]

3.3. 使用示例

  • 对象形式
  1. var person01 = {name:"张三疯",age:189,address:"武当山"}
  2. var person02 = { name:"张三疯",age:189,address:"武当山",wife:{
  3. name:"小花",
  4. age:18
  5. }
  6. }
  • 数组形式
  1. //二,JSON数组 [ele,ele]
  2. var sons = [{"name": "张三", "age": 18}, {"name": "张四", "age": 19}];
  • 混合形式
  1. var person03 = {name:"张三疯", age:189, address:"武当山",
  2. wife:{
  3. name:"小花",
  4. age:18
  5. },
  6. sons:[
  7. {
  8. nickanme:"张三",
  9. age:1
  10. },
  11. {
  12. nickname:"张四",
  13. age:2
  14. }
  15. ]
  16. }

4.小结

  1. JSON: 一种容易生成和解析的数据格式, 通常用作数据的交换

Ajax - 图6

  1. JSON格式

    • JSON对象 {key:value,key:value}

      • key是字符串
      • value是任意的合法数据类型
    • JSON数组 [ele,ele…]
    • 嵌套: 对象和数组的嵌套

知识点-使用Jackson将java对象转换成json字符串

1. 目标

  • 能够使用转换工具Jackson,转换Java对象和json格式

2. 路径

  1. 常见工具类介绍
  2. Jackson的API介绍
  3. Jackson的使用示例

3.讲解

3.1. 常见工具类

  • 在Ajax使用过程中,服务端返回的数据可能比较复杂,比如List<User>;这些数据通常要转换成json格式,把json格式字符串返回客户端
  • 常见的转换工具有:

    • Jackson:SpringMVC内置的转换工具
    • jsonlib:Java提供的转换工具(一般不用)
    • gson:google提供的转换工具(轻量级的框架)
    • fastjson:Alibaba提供的转换工具(效率高速度快)

3.2.Jackson的API介绍

  • Jackson提供了转换的核心类:ObjectMapper
  • ObjectMapper的构造方法:无参构造
  • ObjectMapper的常用方法: | 方法 | 说明 | | —- | —- | | writeValueAsString(Object obj) | 把obj对象里的数据转换成json格式 |

3.3.java对象转成JSON

步骤:

  1. 导入jar包

Ajax - 图7

  1. 创建ObjectMapper对象
  2. 调用writeValueAsString(Object obj)

实现

  1. public class TestJson {
  2. @Test
  3. public void test01() throws JsonProcessingException {
  4. //测试1: 使用jackson将map转换成json字符串
  5. Map map = new HashMap<>();
  6. map.put("name","张三");
  7. map.put("age",34);
  8. map.put("address","中国广东省深圳市");
  9. ObjectMapper objectMapper = new ObjectMapper();
  10. String str = objectMapper.writeValueAsString(map);
  11. System.out.println(str);
  12. }
  13. @Test
  14. public void test02() throws JsonProcessingException {
  15. //将User对象转换成JSON字符串
  16. User user = new User(1,"奥巴马","123456","123456@qq.com","18999999999");
  17. ObjectMapper objectMapper = new ObjectMapper();
  18. String str = objectMapper.writeValueAsString(user);
  19. System.out.println(str);
  20. }
  21. @Test
  22. public void test03() throws JsonProcessingException {
  23. //将ResultBean对象转换成json字符串
  24. User user = new User(1,"奥巴马","123456","123456@qq.com","18999999999");
  25. ResultBean resultBean = new ResultBean(true, user, null);
  26. ObjectMapper objectMapper = new ObjectMapper();
  27. String str = objectMapper.writeValueAsString(resultBean);
  28. System.out.println(str);
  29. }
  30. @Test
  31. public void test04() throws JsonProcessingException {
  32. //使用jackson将List<User>的集合转换成json字符串
  33. List<User> userList = new ArrayList<>();
  34. userList.add(new User(1,"奥巴马","123456","123456@qq.com","18999999999"));
  35. userList.add(new User(2,"周杰棍","654321","654321@qq.com","18666666666"));
  36. userList.add(new User(3,"王丽红","777777","777777@qq.com","18777777777"));
  37. ObjectMapper objectMapper = new ObjectMapper();
  38. String str = objectMapper.writeValueAsString(userList);
  39. System.out.println(str);
  40. }
  41. @Test
  42. public void test05() throws JsonProcessingException {
  43. //将userList存储到ResultBean对象中
  44. List<User> userList = new ArrayList<>();
  45. userList.add(new User(1,"奥巴马","123456","123456@qq.com","18999999999"));
  46. userList.add(new User(2,"周杰棍","654321","654321@qq.com","18666666666"));
  47. userList.add(new User(3,"王丽红","777777","777777@qq.com","18777777777"));
  48. ResultBean resultBean = new ResultBean(true, userList, "显示正常");
  49. ObjectMapper objectMapper = new ObjectMapper();
  50. String str = objectMapper.writeValueAsString(resultBean);
  51. System.out.println(str);
  52. }

小结

  • Map对象或者JavaBean对象转换成json的时候会得到一个json字符串
  • List或者List转换成json的时候会得到一个json数组的字符串

知识点-fastjson转换工具

1.目标

  • 能够使用转换工具Fastjson,转换Java对象和json格式

2.路径

  1. Fastjson的API介绍
  2. Fastjson的使用示例

3.讲解

3.1. fastjson的API介绍

  • fastjson提供了核心类:JSON
  • JSON提供了一些常用的==静态==方法: | 方法 | 说明 | | —- | —- | | toJSONString(Object obj) | 把obj对象里的数据转换成json格式 |

3.2. java对象转成json

步骤

  1. 导入jar包
    Ajax - 图8

  2. 调用JSON.toJSONString(Object obj);

实现

  1. @Test
  2. public void test06(){
  3. //使用fastjson将user对象转换成json字符串
  4. User user = new User(1,"奥巴马","123456","123456@qq.com","18999999999");
  5. String jsonStr = JSON.toJSONString(user);
  6. System.out.println(jsonStr);
  7. }
  8. //其它的map、list转成json对象也是一样的调用JSON.toJSONString(obj)实现

4.小结

  1. fastJSON: 阿里巴巴提供的json和java对象互转工具
  2. java对象转成json

    • JSON.toJsonString(Object obj)

案例三:能够完成自动补全的(返回JSON数据)

1.需求

  1. 实现一个搜索页面,在文本框中输入一个值以后(键盘抬起的时候),给出一些提示
  2. ![](https://gitee.com/tgl_bug/typora-table/raw/master/img/20210121132908.gif#alt=img)

2.思路分析

Ajax - 图9

  1. 创建数据库和页面, 实体类
  2. 给搜索框设置键盘抬起事件
  1. inputEle.keyup(function(){
  2. //1.获得用户输入关键词
  3. //2.发送Ajax请求WordServlet 携带关键词, 获得响应的数据
  4. //3.解析响应的数据 填充页面
  5. });
  1. 创建WordServlet
  1. //1.获得请求参数(关键词)
  2. //2.调用业务 根据关键词获得List<Words> list
  3. //3.把list转成json 响应
  1. 创建WordService
  1. public List<Words> findByKeyWord(String keyWord){
  2. //调用Dao 查询
  3. }
  1. 创建WordDao
  1. SELECT * FROM words WHERE word LIKE '%a%' LIMIT 0,5
  2. SELECT * FROM words WHERE word LIKE ? LIMIT 0,5

3.代码实现

3.1.环境的准备

  • 创建数据库
  1. create table words(
  2. id int primary key auto_increment,
  3. word varchar(50)
  4. );
  5. insert into words values (null, 'all');
  6. insert into words values (null, 'after');
  7. insert into words values (null, 'app');
  8. insert into words values (null, 'apple');
  9. insert into words values (null, 'application');
  10. insert into words values (null, 'applet');
  11. insert into words values (null, 'and');
  12. insert into words values (null, 'animal');
  13. insert into words values (null, 'back');
  14. insert into words values (null, 'bad');
  15. insert into words values (null, 'bag');
  16. insert into words values (null, 'ball');
  17. insert into words values (null, 'banana');
  18. insert into words values (null, 'bear');
  19. insert into words values (null, 'bike');
  20. insert into words values (null, 'car');
  21. insert into words values (null, 'card');
  22. insert into words values (null, 'careful');
  23. insert into words values (null, 'cheese');
  24. insert into words values (null, 'come');
  25. insert into words values (null, 'cool');
  26. insert into words values (null, 'dance');
  27. insert into words values (null, 'day');
  28. insert into words values (null, 'dirty');
  29. insert into words values (null, 'duck');
  30. insert into words values (null, 'east');
  31. insert into words values (null, 'egg');
  32. insert into words values (null, 'every');
  33. insert into words values (null, 'example');
  • 创建JavaBean ``` package com.itheima.bean;

import java.io.Serializable;

public class Words implements Serializable{

  1. private int id;
  2. private String word;
  3. public int getId() {
  4. return id;
  5. }
  6. public void setId(int id) {
  7. this.id = id;
  8. }
  9. public String getWord() {
  10. return word;
  11. }
  12. public void setWord(String word) {
  13. this.word = word;
  14. }
  15. @Override
  16. public String toString() {
  17. return "Words{" +
  18. "id=" + id +
  19. ", word='" + word + '\'' +
  20. '}';
  21. }

}

  1. -
  2. 导入jar,工具类, 配置文件
  3. -
  4. 创建页面,demo06.html
  5. ```html
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8">
  10. <title>Title</title>
  11. </head>
  12. <body>
  13. <center>
  14. <h1>黑马</h1>
  15. <input id="inputId" type="text" style="width: 500px; height: 38px;" /><input
  16. type="button" style="height: 38px;" value="黑马一下" />
  17. <div id="divId"
  18. style="width: 500px; border: 1px red solid; height: 300px; position: absolute; left: 394px;">
  19. <table id="tabId" width="100%" height="100%" border="1px">
  20. <tr><td>aaaa</td></tr>
  21. <tr><td>bbbb</td></tr>
  22. <tr><td>cccc</td></tr>
  23. <tr><td>dddd</td></tr>
  24. <tr><td>eeee</td></tr>
  25. </table>
  26. </div>
  27. </center>

3.2实现

  • demo06.htm
  1. <script>
  2. //给搜索框设置键盘抬起事件
  3. $("#inputId").keyup(function () {
  4. //1.获得用户输入关键词
  5. var keyword = this.value;
  6. if (keyword=="" || keyword==null){
  7. //隐藏
  8. $("#divId").hide(100);
  9. return;
  10. }
  11. //2.发送Ajax请求WordServlet 携带关键词, 获得响应的数据
  12. $.post('word',{keyword:keyword},function (result) {
  13. if (result==""){
  14. //隐藏
  15. $("#divId").hide(100);
  16. return;
  17. }
  18. //3.解析响应的数据 填充页面
  19. //遍历 json数组, 每遍历一次 就是一个词语 就对应一行tr
  20. var trHtml="";
  21. $(result).each(function (i,obj) {
  22. trHtml+="<tr><td>"+obj.word+"</td></tr>";
  23. });
  24. $("#tabId").html(trHtml);
  25. //显示
  26. $("#divId").show(100);
  27. },'json');
  28. });
  29. </script>
  • WordServlet
  1. package com.itheima.web;
  2. import com.alibaba.fastjson.JSON;
  3. import com.itheima.bean.Words;
  4. import com.itheima.service.WordService;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import java.io.IOException;
  11. import java.util.List;
  12. /**
  13. * @Description:
  14. * @Author: yp
  15. */
  16. @WebServlet("/word")
  17. public class WordServlet extends HttpServlet {
  18. private WordService wordService = new WordService();
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. try {
  21. request.setCharacterEncoding("utf-8");
  22. response.setContentType("text/html;charset=utf-8");
  23. //1.获得请求参数(关键词)
  24. String keyword = request.getParameter("keyword");
  25. //2.调用业务 根据关键词获得List<Words> list
  26. List<Words> list = wordService.findByKeyWord(keyword);
  27. System.out.println("list="+list);
  28. //3.把list转成json 响应
  29. String jsonStr = JSON.toJSONString(list);
  30. System.out.println("jsonStr=" + jsonStr);
  31. response.getWriter().print(jsonStr);
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  37. doGet(request, response);
  38. }
  39. }
  • WordService
  1. package com.itheima.service;
  2. import com.itheima.bean.Words;
  3. import com.itheima.dao.WordDao;
  4. import java.util.List;
  5. /**
  6. * @Description:
  7. * @Author: yp
  8. */
  9. public class WordService {
  10. private WordDao wordDao = new WordDao();
  11. /**
  12. * 根据关键词查询
  13. * @param keyword
  14. * @return
  15. */
  16. public List<Words> findByKeyWord(String keyword) throws Exception {
  17. return wordDao.findByKeyWord(keyword);
  18. }
  19. }
  • WordDao
  1. public class WordDao {
  2. private QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
  3. public List<Words> findByKeyWord(String keyword) throws Exception {
  4. String sql = "SELECT * FROM words WHERE word LIKE ? LIMIT 0,5";
  5. return queryRunner.query(sql, new BeanListHandler<Words>(Words.class), "%" + keyword + "%");
  6. }
  7. }

4. 小结

Ajax - 图10

补充: 将json字符串转换成Java对象

1. 使用jackson将json字符串转换成java对象

1.1 API介绍
方法 功能
readValue(String json, Class type) 把json字符串,还原成type类型的Java对象
readValue(String json, TypeReference reference) 把json字符串,还原成带泛型的复杂Java对象(比如List)
  • 其中TypeReferencecom.fasterxml.jackson.core.type.TypeReference

    • 是一个抽象类,用于配置完整的泛型映射信息,避免泛型丢失的问题。用法示例:
  1. // List<Integer> 类型的映射信息
  2. TypeReference ref1 = new TypeReference<List<Integer>>() {};
  3. // List<User> 类型的映射信息
  4. TypeReference ref2 = new TypeReference<List<User>>() {};
  5. // Map<String,User> 类型的映射信息
  6. TypeReference ref3 = new TypeReference<Map<String,User>>(){};

1.2 使用jackson将json字符串转换JavaBean对象或者Map
  1. @Test
  2. //把json转成JavaBean(user对象)
  3. public void test06() throws IOException {
  4. String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";
  5. //1.调用JSON.parseObject(String json,Class clazz);
  6. //转换成user
  7. User user = JSON.parseObject(jsonStr, User.class);
  8. System.out.println(user);
  9. //转换成map
  10. Map map = JSON.parseObject(jsonStr, Map.class);
  11. System.out.println(map);
  12. }

1.3 使用jackson将json数组字符串转换成List
  1. @Test
  2. //把json转成List<JavaBean>对象
  3. public void test07() throws Exception {
  4. String jsonStr = "[{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"},{\"id\":2,\"username\":\"ls\",\"password\":\"123456\",\"email\":\"ls@163.com\",\"phone\":\"1386781898\"},{\"id\":3,\"username\":\"ww\",\"password\":\"123456\",\"email\":\"ww@163.com\",\"phone\":\"1386782898\"}]";
  5. //1.创建ObjectMapper对象
  6. ObjectMapper objectMapper = new ObjectMapper();
  7. //2.调用readValue()
  8. TypeReference<List<User>> ref = new TypeReference<List<User>>(){};
  9. List<User> list = objectMapper.readValue(jsonStr, ref);
  10. System.out.println(list);
  11. }

2. 使用fastjson将json字符串转换成java对象

2.1 API 介绍
方法 功能
parseObject(String json, Class type) 把json字符串,还原成type类型的Java对象
parseArray(String json, Class type) 把json字符串,还原成List

2.2 使用fastjson将json字符串转换成JavaBean对象或者Map
  1. @Test
  2. //把json转成JavaBean(user对象)
  3. public void test08() throws IOException {
  4. String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";
  5. //1.调用JSON.parseObject(String json,Class clazz);
  6. User user = JSON.parseObject(jsonStr, User.class);
  7. System.out.println(user);
  8. }
  9. @Test
  10. //把json转成Map
  11. public void test09() throws IOException {
  12. String jsonStr = "{\"id\":1,\"username\":\"zs\",\"password\":\"123456\",\"email\":\"zs@163.com\",\"phone\":\"1386789898\"}";
  13. //1.调用JSON.parseObject(String json,Class clazz);
  14. Map map = JSON.parseObject(jsonStr, Map.class);
  15. System.out.println(map);
  16. }

2.3 使用fastjson将json字符串转换成List
  1. @Test
  2. public void test11(){
  3. //使用fastjson将json数组的字符串,转换成List<User>
  4. String jsonArr = "[{\"id\":1,\"username\":\"奥巴马\",\"password\":\"123456\",\"email\":\"123456@qq.com\",\"phone\":\"18999999999\"},{\"id\":2,\"username\":\"周杰棍\",\"password\":\"654321\",\"email\":\"654321@qq.com\",\"phone\":\"18666666666\"},{\"id\":3,\"username\":\"王丽红\",\"password\":\"777777\",\"email\":\"777777@qq.com\",\"phone\":\"18777777777\"}]";
  5. List<User> userList = JSON.parseArray(jsonArr, User.class);
  6. for (User user : userList) {
  7. System.out.println(user.getUsername());
  8. }
  9. }

补充案例-将联系人增删改查改成异步

查询所有功能改成异步

  • 创建一个list.html页面,在页面加载的时候发送异步请求获取所有联系人的信息
  1. <!DOCTYPE html>
  2. <!-- 网页使用的语言 -->
  3. <html lang="zh-CN">
  4. <head>
  5. <!-- 指定字符集 -->
  6. <meta charset="utf-8">
  7. <!-- 使用Edge最新的浏览器的渲染方式 -->
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  10. width: 默认宽度与设备的宽度相同
  11. initial-scale: 初始的缩放比,为1:1 -->
  12. <meta name="viewport" content="width=device-width, initial-scale=1">
  13. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  14. <title>联系人信息展示页面</title>
  15. <!-- 1. 导入CSS的全局样式 -->
  16. <link href="css/bootstrap.min.css" rel="stylesheet">
  17. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  18. <script src="js/jquery-2.1.0.min.js"></script>
  19. <!-- 3. 导入bootstrap的js文件 -->
  20. <script src="js/bootstrap.min.js"></script>
  21. <style type="text/css">
  22. td, th {
  23. text-align: center;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="container">
  29. <h3 style="text-align: center">显示所有联系人</h3>
  30. <table border="1" class="table table-bordered table-hover">
  31. <tr class="success">
  32. <th>编号</th>
  33. <th>姓名</th>
  34. <th>性别</th>
  35. <th>年龄</th>
  36. <th>籍贯</th>
  37. <th>QQ</th>
  38. <th>邮箱</th>
  39. <th>操作</th>
  40. </tr>
  41. <tbody>
  42. </tbody>
  43. <tfoot>
  44. <tr>
  45. <td colspan="8" align="center"><a class="btn btn-primary" href="/add.html">添加联系人</a></td>
  46. </tr>
  47. </tfoot>
  48. </table>
  49. <script>
  50. //当这个页面加载的时候,就发送一个异步请求给服务器,获取所有联系人的信息
  51. $.get("/linkman?action=findAll",function (result) {
  52. if (result.flag) {
  53. //服务器没有异常
  54. //取出要显示在页面的结果
  55. var linkmanList = result.data;
  56. //遍历出每一个linkMan
  57. $.each(linkmanList,function (index,linkman) {
  58. //每遍历出一条数据,就往tbody中添加一行
  59. $("tbody").append("<tr>\n" +
  60. " <td>"+(index+1)+"</td>\n" +
  61. " <td>"+linkman.name+"</td>\n" +
  62. " <td>"+linkman.sex+"</td>\n" +
  63. " <td>"+linkman.age+"</td>\n" +
  64. " <td>"+linkman.address+"</td>\n" +
  65. " <td>"+linkman.qq+"</td>\n" +
  66. " <td>"+linkman.email+"</td>\n" +
  67. " <td><a class=\"btn btn-default btn-sm\" href=\"/linkman?action=findOne&id=${linkman.id}\">修改</a>&nbsp;\n" +
  68. " <a class=\"btn btn-default btn-sm\" href=\"javascript:;\" onclick=\"deleteLinkMan('${linkman.name}','${linkman.id}')\">删除</a></td>\n" +
  69. " </tr>")
  70. })
  71. }
  72. },"json")
  73. </script>
  74. </div>
  75. </body>
  76. </html>
  • LinkManServlet中findAll()方法的代码
  1. /**
  2. * 查询所有联系人
  3. */
  4. private void findAll(HttpServletRequest request,HttpServletResponse response) throws IOException {
  5. ResultBean resultBean = new ResultBean(true);
  6. try {
  7. //1. 调用业务层的方法,查询所有联系人
  8. List<LinkMan> linkManList = linkManService.findAll();
  9. //2. 将响应数据封装到ResultBean对象中
  10. resultBean.setData(linkManList);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. //查询失败
  14. resultBean.setFlag(false);
  15. resultBean.setErrorMsg("查询联系人失败");
  16. }
  17. //将resultBean对象转换成json字符串,响应给客户端
  18. String jsonStr = JSON.toJSONString(resultBean);
  19. response.getWriter().write(jsonStr);
  20. }

添加联系人改成异步

  • 创建一个add.html页面,屏蔽表单的同步提交,当点击提交按钮的时候绑定点击事件异步提交请求
  1. <!-- HTML5文档-->
  2. <!DOCTYPE html>
  3. <!-- 网页使用的语言 -->
  4. <html lang="zh-CN">
  5. <head>
  6. <!-- 指定字符集 -->
  7. <meta charset="utf-8">
  8. <!-- 使用Edge最新的浏览器的渲染方式 -->
  9. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  10. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  11. width: 默认宽度与设备的宽度相同
  12. initial-scale: 初始的缩放比,为1:1 -->
  13. <meta name="viewport" content="width=device-width, initial-scale=1">
  14. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  15. <title>添加用户</title>
  16. <!-- 1. 导入CSS的全局样式 -->
  17. <link href="css/bootstrap.min.css" rel="stylesheet">
  18. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  19. <script src="js/jquery-2.1.0.min.js"></script>
  20. <!-- 3. 导入bootstrap的js文件 -->
  21. <script src="js/bootstrap.min.js"></script>
  22. </head>
  23. <body>
  24. <div class="container">
  25. <center><h3>添加联系人页面</h3></center>
  26. <div id="msg" style="color: red"></div>
  27. <form action="/linkman" id="myForm" method="post" onsubmit="return false">
  28. <input type="hidden" name="action" value="add">
  29. <div class="form-group">
  30. <label for="name">姓名:</label>
  31. <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
  32. </div>
  33. <div class="form-group">
  34. <label>性别:</label>
  35. <input type="radio" name="sex" value="男" checked="checked"/>
  36. <input type="radio" name="sex" value="女"/>
  37. </div>
  38. <div class="form-group">
  39. <label for="age">年龄:</label>
  40. <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
  41. </div>
  42. <div class="form-group">
  43. <label for="address">籍贯:</label>
  44. <select name="address" class="form-control" id="address">
  45. <option value="广东">广东</option>
  46. <option value="广西">广西</option>
  47. <option value="湖南">湖南</option>
  48. </select>
  49. </div>
  50. <div class="form-group">
  51. <label for="qq">QQ:</label>
  52. <input type="text" class="form-control" name="qq" id="qq" placeholder="请输入QQ号码"/>
  53. </div>
  54. <div class="form-group">
  55. <label for="email">Email:</label>
  56. <input type="text" class="form-control" name="email" id="email" placeholder="请输入邮箱地址"/>
  57. </div>
  58. <div class="form-group" style="text-align: center">
  59. <input class="btn btn-primary" type="submit" value="提交" onclick="addLinkman()"/>
  60. <input class="btn btn-default" type="reset" value="重置" />
  61. <input class="btn btn-default" type="button" value="返回" />
  62. </div>
  63. </form>
  64. <script>
  65. //声明一个添加联系人的方法
  66. function addLinkman() {
  67. //获取表单中的所有请求参数
  68. var parameter = $("#myForm").serialize();
  69. //发送异步请求给"/linkman",请求方式post,提交表单中的所有数据
  70. $.post("/linkman",parameter,function (result) {
  71. if (result.flag) {
  72. //添加成功
  73. //跳转到list.html
  74. location.href = "/list.html"
  75. }else {
  76. //添加失败
  77. $("#msg").html(result.errorMsg)
  78. }
  79. },"json")
  80. }
  81. </script>
  82. </div>
  83. </body>
  84. </html>
  • LinkManServlet的add()方法的代码
  1. /**
  2. * 添加联系人
  3. * @param request
  4. * @param response
  5. * @throws IOException
  6. */
  7. private void add(HttpServletRequest request,HttpServletResponse response) throws IOException {
  8. ResultBean resultBean = new ResultBean(true);
  9. try {
  10. //1. 获取所有请求参数
  11. Map<String, String[]> parameterMap = request.getParameterMap();
  12. //2. 将请求参数封装到LinkMan对象中
  13. LinkMan linkMan = new LinkMan();
  14. BeanUtils.populate(linkMan,parameterMap);
  15. //3. 调用业务层的方法添加联系人
  16. linkManService.add(linkMan);
  17. //4. 添加成功
  18. // 告诉客户端添加成功
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. //告诉客户端添加失败
  22. resultBean.setFlag(false);
  23. resultBean.setErrorMsg("添加失败");
  24. }
  25. String jsonStr = JSON.toJSONString(resultBean);
  26. response.getWriter().write(jsonStr);
  27. }

删除功能改成异步

  • 前端list.html代码
  1. <!DOCTYPE html>
  2. <!-- 网页使用的语言 -->
  3. <html lang="zh-CN">
  4. <head>
  5. <!-- 指定字符集 -->
  6. <meta charset="utf-8">
  7. <!-- 使用Edge最新的浏览器的渲染方式 -->
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  10. width: 默认宽度与设备的宽度相同
  11. initial-scale: 初始的缩放比,为1:1 -->
  12. <meta name="viewport" content="width=device-width, initial-scale=1">
  13. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  14. <title>联系人信息展示页面</title>
  15. <!-- 1. 导入CSS的全局样式 -->
  16. <link href="css/bootstrap.min.css" rel="stylesheet">
  17. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  18. <script src="js/jquery-2.1.0.min.js"></script>
  19. <!-- 3. 导入bootstrap的js文件 -->
  20. <script src="js/bootstrap.min.js"></script>
  21. <style type="text/css">
  22. td, th {
  23. text-align: center;
  24. }
  25. </style>
  26. </head>
  27. <body>
  28. <div class="container">
  29. <h3 style="text-align: center">显示所有联系人</h3>
  30. <table border="1" class="table table-bordered table-hover">
  31. <tr class="success">
  32. <th>编号</th>
  33. <th>姓名</th>
  34. <th>性别</th>
  35. <th>年龄</th>
  36. <th>籍贯</th>
  37. <th>QQ</th>
  38. <th>邮箱</th>
  39. <th>操作</th>
  40. </tr>
  41. <tbody>
  42. </tbody>
  43. <tfoot>
  44. <tr>
  45. <td colspan="8" align="center"><a class="btn btn-primary" href="/add.html">添加联系人</a></td>
  46. </tr>
  47. </tfoot>
  48. </table>
  49. <script>
  50. //当这个页面加载的时候,就发送一个异步请求给服务器,获取所有联系人的信息
  51. $.get("/linkman?action=findAll",function (result) {
  52. if (result.flag) {
  53. //服务器没有异常
  54. //取出要显示在页面的结果
  55. var linkmanList = result.data;
  56. //遍历出每一个linkMan
  57. $.each(linkmanList,function (index,linkman) {
  58. //每遍历出一条数据,就往tbody中添加一行
  59. $("tbody").append("<tr>\n" +
  60. " <td>"+(index+1)+"</td>\n" +
  61. " <td>"+linkman.name+"</td>\n" +
  62. " <td>"+linkman.sex+"</td>\n" +
  63. " <td>"+linkman.age+"</td>\n" +
  64. " <td>"+linkman.address+"</td>\n" +
  65. " <td>"+linkman.qq+"</td>\n" +
  66. " <td>"+linkman.email+"</td>\n" +
  67. " <td><a class=\"btn btn-default btn-sm\" href=\"/update.html?id="+linkman.id+"\">修改</a>&nbsp;\n" +
  68. " <a class=\"btn btn-default btn-sm\" href=\"javascript:;\" onclick=\"deleteLinkMan('"+linkman.name+"','"+linkman.id+"')\">删除</a></td>\n" +
  69. " </tr>")
  70. })
  71. }
  72. },"json")
  73. //声明一个删除联系人的方法
  74. function deleteLinkMan(name,id) {
  75. //1. 弹出一个确认框
  76. var flag = confirm("你确定要删除"+name+"吗?");
  77. if (flag) {
  78. //确定要删除
  79. //向LinkManServlet发送异步请求,并且携带要删除的联系人的id
  80. $.post("/linkman","action=delete&id="+id,function (result) {
  81. if (result.flag) {
  82. //删除成功,跳转到list.html页面
  83. location.href = "/list.html"
  84. }else {
  85. //删除失败
  86. alert(result.errorMsg)
  87. }
  88. },"json")
  89. }
  90. }
  91. </script>
  92. </div>
  93. </body>
  94. </html>
  • LinkManServlet的delete()方法的代码
  1. /**
  2. * 删除联系人
  3. * @param request
  4. * @param response
  5. * @throws IOException
  6. */
  7. private void delete(HttpServletRequest request,HttpServletResponse response) throws IOException {
  8. ResultBean resultBean = new ResultBean(true);
  9. try {
  10. //1. 获取要删除的联系人的id
  11. Integer id = Integer.valueOf(request.getParameter("id"));
  12. //2. 调用业务层的方法,根据id删除联系人
  13. linkManService.deleteById(id);
  14. } catch (Exception e) {
  15. e.printStackTrace();
  16. resultBean.setFlag(false);
  17. resultBean.setErrorMsg("删除失败");
  18. }
  19. //将resultBean转换成json字符串,响应给客户端
  20. response.getWriter().write(JSON.toJSONString(resultBean));
  21. }

数据回显功能改成异步

  • update.html页面的代码(注意:需要引入getParameter.js脚本)
  1. <!DOCTYPE html>
  2. <!-- 网页使用的语言 -->
  3. <html lang="zh-CN">
  4. <head>
  5. <!-- 指定字符集 -->
  6. <meta charset="utf-8">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  8. <meta name="viewport" content="width=device-width, initial-scale=1">
  9. <title>修改联系人</title>
  10. <link href="css/bootstrap.min.css" rel="stylesheet">
  11. <script src="js/jquery-2.1.0.min.js"></script>
  12. <script src="js/bootstrap.min.js"></script>
  13. <script src="js/getParameter.js"></script>
  14. </head>
  15. <body>
  16. <div class="container" style="width: 400px;">
  17. <h3 style="text-align: center;">修改联系人</h3>
  18. <form id="updateForm" action="/linkman" method="post" onsubmit="return false">
  19. <input type="hidden" name="id" id="id">
  20. <input type="hidden" name="action" value="update">
  21. <div class="form-group">
  22. <label for="name">姓名:</label>
  23. <input type="text" class="form-control" id="name" name="name"
  24. placeholder="请输入姓名" />
  25. </div>
  26. <div class="form-group">
  27. <label>性别:</label>
  28. <input type="radio" name="sex" value="男" />男
  29. <input type="radio" name="sex" value="女" />女
  30. </div>
  31. <div class="form-group">
  32. <label for="age">年龄:</label>
  33. <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄" />
  34. </div>
  35. <div class="form-group">
  36. <label for="address">籍贯:</label>
  37. <select name="address" id="address" class="form-control" >
  38. <option value="广东">广东</option>
  39. <option value="广西">广西</option>
  40. <option value="湖南">湖南</option>
  41. </select>
  42. </div>
  43. <div class="form-group">
  44. <label for="qq">QQ:</label>
  45. <input type="text" id="qq" value="${linkman.qq}" class="form-control" name="qq" placeholder="请输入QQ号码"/>
  46. </div>
  47. <div class="form-group">
  48. <label for="email">Email:</label>
  49. <input type="text" id="email" value="${linkman.email}" class="form-control" name="email" placeholder="请输入邮箱地址"/>
  50. </div>
  51. <div class="form-group" style="text-align: center">
  52. <input class="btn btn-primary" type="submit" value="提交"/>
  53. <input class="btn btn-default" type="reset" value="重置" />
  54. <input class="btn btn-default" type="button" value="返回"/>
  55. </div>
  56. </form>
  57. <script>
  58. //获取要修改的联系人的id
  59. var id = getParameter("id");
  60. //页面加载的时候,就应该向服务器发送异步请求,进行数据回显
  61. $.post("/linkman","action=findOne&id="+id,function (result) {
  62. if (result.flag) {
  63. //数据回显成功
  64. //回显姓名
  65. $("#name").val(result.data.name)
  66. //回显性别
  67. if (result.data.sex == "男") {
  68. $(":radio[value='男']").prop("checked",true)
  69. }else {
  70. $(":radio[value='女']").prop("checked",true)
  71. }
  72. //回显年龄
  73. $("#age").val(result.data.age)
  74. //回显address
  75. $("#address").val(result.data.address)
  76. //回显qq和email
  77. $("#qq").val(result.data.qq)
  78. $("#email").val(result.data.email)
  79. //回显id
  80. $("#id").val(result.data.id)
  81. }else {
  82. //数据回显失败
  83. alert(result.errorMsg)
  84. }
  85. },"json")
  86. </script>
  87. </div>
  88. </body>
  89. </html>
  • LinkManServlet的findOne()方法
  1. /**
  2. * 根据id查询联系人
  3. * @param request
  4. * @param response
  5. */
  6. private void findOne(HttpServletRequest request, HttpServletResponse response) throws IOException {
  7. ResultBean resultBean = new ResultBean(true);
  8. try {
  9. //1. 获取要查询的联系人的id
  10. Integer id = Integer.valueOf(request.getParameter("id"));
  11. //2. 调用业务层的方法,根据id查询联系人
  12. LinkMan linkMan = linkManService.findById(id);
  13. //3. 将响应结果封装到ResultBean对象
  14. resultBean.setData(linkMan);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. resultBean.setFlag(false);
  18. resultBean.setErrorMsg("数据回显失败");
  19. }
  20. //将resultBean转换成json字符串,响应给客户端
  21. response.getWriter().write(JSON.toJSONString(resultBean));
  22. }

修改功能改成异步

  • update.html代码
  1. <!DOCTYPE html>
  2. <!-- 网页使用的语言 -->
  3. <html lang="zh-CN">
  4. <head>
  5. <base href="<%=basePath%>"/>
  6. <!-- 指定字符集 -->
  7. <meta charset="utf-8">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <meta name="viewport" content="width=device-width, initial-scale=1">
  10. <title>修改联系人</title>
  11. <link href="css/bootstrap.min.css" rel="stylesheet">
  12. <script src="js/jquery-2.1.0.min.js"></script>
  13. <script src="js/bootstrap.min.js"></script>
  14. <script src="js/getParameter.js"></script>
  15. </head>
  16. <body>
  17. <div class="container" style="width: 400px;">
  18. <h3 style="text-align: center;">修改联系人</h3>
  19. <form id="updateForm" action="/linkman" method="post" onsubmit="return false">
  20. <input type="hidden" name="id" id="id">
  21. <input type="hidden" name="action" value="update">
  22. <div class="form-group">
  23. <label for="name">姓名:</label>
  24. <input type="text" class="form-control" id="name" name="name"
  25. placeholder="请输入姓名" />
  26. </div>
  27. <div class="form-group">
  28. <label>性别:</label>
  29. <input type="radio" name="sex" value="男" />
  30. <input type="radio" name="sex" value="女" />
  31. </div>
  32. <div class="form-group">
  33. <label for="age">年龄:</label>
  34. <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄" />
  35. </div>
  36. <div class="form-group">
  37. <label for="address">籍贯:</label>
  38. <select name="address" id="address" class="form-control" >
  39. <option value="广东">广东</option>
  40. <option value="广西">广西</option>
  41. <option value="湖南">湖南</option>
  42. </select>
  43. </div>
  44. <div class="form-group">
  45. <label for="qq">QQ:</label>
  46. <input type="text" id="qq" value="${linkman.qq}" class="form-control" name="qq" placeholder="请输入QQ号码"/>
  47. </div>
  48. <div class="form-group">
  49. <label for="email">Email:</label>
  50. <input type="text" id="email" value="${linkman.email}" class="form-control" name="email" placeholder="请输入邮箱地址"/>
  51. </div>
  52. <div class="form-group" style="text-align: center">
  53. <input class="btn btn-primary" type="submit" value="提交" onclick="updateLinkman()"/>
  54. <input class="btn btn-default" type="reset" value="重置" />
  55. <input class="btn btn-default" type="button" value="返回"/>
  56. </div>
  57. </form>
  58. <script>
  59. //获取要修改的联系人的id
  60. var id = getParameter("id");
  61. //页面加载的时候,就应该向服务器发送异步请求,进行数据回显
  62. $.post("/linkman","action=findOne&id="+id,function (result) {
  63. if (result.flag) {
  64. //数据回显成功
  65. //回显姓名
  66. $("#name").val(result.data.name)
  67. //回显性别
  68. if (result.data.sex == "男") {
  69. $(":radio[value='男']").prop("checked",true)
  70. }else {
  71. $(":radio[value='女']").prop("checked",true)
  72. }
  73. //回显年龄
  74. $("#age").val(result.data.age)
  75. //回显address
  76. $("#address").val(result.data.address)
  77. //回显qq和email
  78. $("#qq").val(result.data.qq)
  79. $("#email").val(result.data.email)
  80. //回显id
  81. $("#id").val(result.data.id)
  82. }else {
  83. //数据回显失败
  84. alert(result.errorMsg)
  85. }
  86. },"json")
  87. //修改联系人信息的方法
  88. function updateLinkman() {
  89. //将表单中的数据全部采用异步提交到服务器
  90. var parameter = $("#updateForm").serialize();
  91. $.post("/linkman", parameter,function (result) {
  92. if (result.flag) {
  93. //修改成功
  94. location.href = "/list.html"
  95. }else {
  96. alert(result.errorMsg)
  97. }
  98. },"json")
  99. }
  100. </script>
  101. </div>
  102. </body>
  103. </html>
  • LinkManServlet的update()方法的代码
  1. /**
  2. * 修改联系人的方法
  3. * @param request
  4. * @param response
  5. */
  6. private void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
  7. ResultBean resultBean = new ResultBean(true);
  8. try {
  9. //1. 获取所有请求参数封装到LinkMan对象中
  10. Map<String, String[]> parameterMap = request.getParameterMap();
  11. LinkMan linkMan = new LinkMan();
  12. BeanUtils.populate(linkMan,parameterMap);
  13. //2. 调用业务层的方法,修改联系人信息
  14. linkManService.update(linkMan);
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. resultBean.setFlag(false);
  18. resultBean.setErrorMsg("修改失败");
  19. }
  20. //将resultBean转换成json字符串,响应给客户端
  21. response.getWriter().write(JSON.toJSONString(resultBean));
  22. }

分页功能改成异步

  • list_page.html代码(注意: 需要引入getParameter.js脚本)
  1. <!DOCTYPE html>
  2. <!-- 网页使用的语言 -->
  3. <html lang="zh-CN">
  4. <head>
  5. <!-- 指定字符集 -->
  6. <meta charset="utf-8">
  7. <!-- 使用Edge最新的浏览器的渲染方式 -->
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  9. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  10. width: 默认宽度与设备的宽度相同
  11. initial-scale: 初始的缩放比,为1:1 -->
  12. <meta name="viewport" content="width=device-width, initial-scale=1">
  13. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  14. <title>Bootstrap模板</title>
  15. <!-- 1. 导入CSS的全局样式 -->
  16. <link href="css/bootstrap.min.css" rel="stylesheet">
  17. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  18. <script src="js/jquery-2.1.0.min.js"></script>
  19. <!-- 3. 导入bootstrap的js文件 -->
  20. <script src="js/bootstrap.min.js"></script>
  21. <style type="text/css">
  22. td, th {
  23. text-align: center;
  24. }
  25. </style>
  26. <script src="js/getParameter.js"></script>
  27. </head>
  28. <body>
  29. <div class="container">
  30. <h3 style="text-align: center">显示所有联系人</h3>
  31. <table border="1" class="table table-bordered table-hover">
  32. <tr class="success">
  33. <th>编号</th>
  34. <th>姓名</th>
  35. <th>性别</th>
  36. <th>年龄</th>
  37. <th>籍贯</th>
  38. <th>QQ</th>
  39. <th>邮箱</th>
  40. <th>操作</th>
  41. </tr>
  42. <tbody>
  43. </tbody>
  44. <tfoot>
  45. <tr>
  46. <td colspan="8" align="center">
  47. 总共有<span id="pageCount"></span>页,每页显示<span id="pageSize"></span>
  48. <ul id="pageNum" class="pagination success">
  49. </ul>
  50. </td>
  51. </tr>
  52. </tfoot>
  53. </table>
  54. </div>
  55. <script>
  56. //获取当前分页的页数和每页数据条数
  57. var currentPage = getParameter("currentPage");
  58. var pageSize = getParameter("pageSize");
  59. //页面加载的时候发送异步请求,获取当前分页的数据
  60. $.post("/linkman","action=findByPage&currentPage="+currentPage+"&pageSize="+pageSize,function (result) {
  61. if (result.flag) {
  62. //分页查询成功
  63. var pageBean = result.data;
  64. // 获取当前页的联系人集合
  65. var linkmanList = pageBean.list;
  66. //遍历出每一个联系人
  67. $.each(linkmanList,function (index,linkman) {
  68. //往tbody里面添加一行
  69. $("tbody").append("<tr>\n" +
  70. " <td>"+(index+1)+"</td>\n" +
  71. " <td>"+linkman.name+"</td>\n" +
  72. " <td>"+linkman.sex+"</td>\n" +
  73. " <td>"+linkman.age+"</td>\n" +
  74. " <td>"+linkman.address+"</td>\n" +
  75. " <td>"+linkman.qq+"</td>\n" +
  76. " <td>"+linkman.email+"</td>\n" +
  77. " <td><a class=\"btn btn-default btn-sm\" href=\"修改联系人.html\">修改</a>&nbsp;<a class=\"btn btn-default btn-sm\" href=\"修改联系人.html\">删除</a></td>\n" +
  78. " </tr>")
  79. })
  80. //获取总页数
  81. var totalPage = pageBean.totalPage;
  82. $("#pageCount").html(totalPage)
  83. //获取每页条数
  84. var pageSize = pageBean.pageSize;
  85. $("#pageSize").html(pageSize)
  86. //显示页码
  87. //获取当前页数
  88. var currentPage = pageBean.currentPage;
  89. if (currentPage > 1) {
  90. $("#pageNum").append("<li><a href=\"/list_page.html?pageSize="+pageSize+"&currentPage="+(currentPage-1)+"\" aria-label=\"Previous\">\n" +
  91. " <span aria-hidden=\"true\">&laquo;</span></a>\n" +
  92. " </li>")
  93. }
  94. //遍历显示每一个页码
  95. for(var i=1;i<=totalPage;i++){
  96. if (i == currentPage){
  97. //当前页
  98. $("#pageNum").append("<li class=\"active\"><a href=\"javascript:;\">"+i+"</a></li>")
  99. }else {
  100. $("#pageNum").append("<li><a href=\"/list_page.html?pageSize="+pageSize+"&currentPage="+i+"\">"+i+"</a></li>")
  101. }
  102. }
  103. //判断当前页是否是最后一页
  104. if (currentPage != totalPage) {
  105. $("#pageNum").append("<li><a href=\"/list_page.html?pageSize="+pageSize+"&currentPage="+(currentPage+1)+"\" aria-label=\"Next\">\n" +
  106. " <span aria-hidden=\"true\">&raquo;</span></a>\n" +
  107. " </li>")
  108. }
  109. }else {
  110. //分页查询失败
  111. alert(result.errorMsg)
  112. }
  113. },"json")
  114. </script>
  115. </body>
  116. </html>
  • LinkManServlet的findByPage()方法的代码
  1. private void findByPage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  2. ResultBean resultBean = new ResultBean(true);
  3. try {
  4. //1. 获取请求参数currentPage和pageSize的值
  5. Long currentPage = Long.valueOf(request.getParameter("currentPage"));
  6. Integer pageSize = Integer.valueOf(request.getParameter("pageSize"));
  7. //2. 调用业务层的方法,查询当前页的pageBean
  8. PageBean<LinkMan> pageBean = linkManService.findByPage(currentPage,pageSize);
  9. resultBean.setData(pageBean);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. //分页查询失败
  13. resultBean.setFlag(false);
  14. resultBean.setErrorMsg("分页查询失败");
  15. }
  16. //将resultBean转换成json字符串,响应给客户端
  17. response.getWriter().write(JSON.toJSONString(resultBean));
  18. }