一.概述

  • Ajax(Asynchronous JavaScript and XML,异步的JavaScript和XML)技术可以实现页面的局部更新

  • 传统请求方式是在页面跳转或页面刷新时发出请求,每次发出请求都会请求一个新的页面,即使刷新也是重新加载本页面

  • Ajax异步请求方式不同于传统的方式,通过Ajax异步请求方式向服务器发出请求,得到数据后再更新页面(通过DOM操作修改页面),整个过程不发生页面跳转或刷新操作

  • 传统方式与Ajax异步请求的对比 | 方式 | 协议 | 请求发出方式 | 数据展示方式 | | —- | —- | —- | —- | | 传统请求方式 | HTTP | 页面链接跳转 | 重新载入新页面 | | Ajax异步请求方式 | HTTP | 由XMLHttpRequest实例发出请求 | JavaScript和DOM技术把数据更新到页面 |


Ajax优势:

  • 请求数据量少:只需请求必要数据,对不需更新的数据不做请求
  • 请求分散:按需请求,异步的形式,在任意时刻发出,所以请求不会集中爆发
  • 用户体验优化:响应时间短,速度快
    • 使用JavaScript可以实现Ajax,但是代码复杂需要考虑到浏览器兼容问题
  • jQuery二次封装了JavaScript,同时对Ajax操作进行了整理和封装,简化了Ajax操作

二.实现方式

1.使用GET方式实现Ajax

  • 语法
    1. $.get(url,data,function(data,status,xhr),datatype)
  • 该方法由jQuery提供,其中参数含义如下 | 参数 | 说明 | | —- | —- | | url | 必选,规定加载资源的路径 | | data | 可选,发送至服务器的数据 | | function(data,status,xhr) | 可选,请求成功时执行的函数,data表示从服务器返回的数据,status表示请求的状态值,xhr表示当前请求相关的XMLHttpRequest对象 | | datatype | 可选,预期的服务器响应的数据类型(xml,html,text,script,json,jsonp) |
  • 范例
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Ajax练习</title>
    6. </head>
    7. <body>
    8. <label for="username">姓名</label>
    9. <input type="text" id="username">
    10. <label for="password">密码</label>
    11. <input type="password" id="password">
    12. <input type="button" id="btn" value="登录">
    13. <div id="div"></div>
    14. </body>
    15. <script src="js/jquery-3.3.1.min.js"></script>
    16. <script>
    17. $("#btn").on("click",function(){
    18. let username = $("#username").val();
    19. let password = $("#password").val();
    20. $.get(
    21. "AjaxServlet",
    22. {"username":username,"password":password},
    23. function(data){
    24. $("#div").html(data);
    25. },
    26. "html"
    27. );
    28. });
    29. </script>
    30. </html>
  1. @WebServlet("/AjaxServlet")
  2. public class AjaxServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. String username = req.getParameter("username");
  6. String password = req.getParameter("password");
  7. resp.setContentType("text/html;charset=UTF-8");
  8. resp.getWriter().write("<h1>"+username+"</h1>");
  9. resp.getWriter().write("<h1>"+password+"</h1>");
  10. }
  11. @Override
  12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. doGet(req, resp);
  14. }
  15. }

2.使用POST方式实现Ajax

  • POST方式实现的Ajax与GET方式类似,只是方法名不同,为$.post()

3.使用通用方式实现Ajax

  • 通用的方式是使用$.ajax()方法来实现Ajax

  • 上述的GET和POST方式使用到的方法都是通过封装了这个$.ajax()方法来实现

  • 语法

    1. $.ajax({name:value,name:value....})
  • ajax方法的参数是一对{}包起来的键值对
    • 该方法的常用参数(键)如下 | 参数 | 说明 | | —- | —- | | url | 请求的路径 | | async | 是否异步,true或false,默认为true | | data | 发送到服务器的数据 | | type | 请求的方式,POST或GET,默认是GET | | dataType | 预期的服务器响应的数据类型(xml,html,text,script,json,jsonp) | | success(result,status,xhr) | 请求成功是执行的方法 | | error(xhr,status,error) | 请求失败时执行的方法 |
  • 范例
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Ajax练习</title>
    6. </head>
    7. <body>
    8. <label for="username">姓名</label>
    9. <input type="text" id="username">
    10. <label for="password">密码</label>
    11. <input type="password" id="password">
    12. <input type="button" id="btn" value="登录">
    13. <div id="div"></div>
    14. </body>
    15. <script src="js/jquery-3.3.1.min.js"></script>
    16. <script>
    17. $("#btn").on("click",function(){
    18. let username = $("#username").val();
    19. let password = $("#password").val();
    20. $.ajax({
    21. url:"AjaxServlet",
    22. data:{
    23. "username":username,
    24. "password":password
    25. },
    26. dataType:"text",
    27. success:function(data){
    28. $("#div").html(data);
    29. }
    30. });
    31. });
    32. </script>
    33. </html>
  1. @WebServlet("/AjaxServlet")
  2. public class AjaxServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. String username = req.getParameter("username");
  6. String password = req.getParameter("password");
  7. resp.setContentType("text/html;charset=UTF-8");
  8. resp.getWriter().write("<h1>"+username+"</h1>");
  9. resp.getWriter().write("<h1>"+password+"</h1>");
  10. }
  11. @Override
  12. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13. doGet(req, resp);
  14. }
  15. }

三.JSON补充知识

  • JavaScript笔记中只基本了解了JSON

1.转换工具

  • Jackson:开源免费的JSON转换工具,通过Java封装好的一些jar工具包
  • 可以将Java对象或集合转换成JSON格式的字符串,也可以将JSON格式的字符串转换成Java对象
  • 需要引入相关jar包

2.常用类以及方法

  • 常用类 | 类名 | 说明 | | —- | —- | | ObjectMapper | jackon工具包的核心类,提供一些方法实现json字符串和对象之间的转换 | | TypeReference | 用于指定反序列化的对象类型 |
  • ObjectMapper常用方法 | 方法名 | 说明 | | —- | —- | | String writeValueAsString(Object obj) | 将Java对象转为json字符串 | | T readValue(String json,Class valueType) | 将json字符串转为Java对象,用于对象类型为内置类型 | | T readValue(String json,TypeReference valueType) | 将json字符串转为Java对象,用于对象类型为含有自定义类型数据的集合类 |

3.范例

User类:

  1. public class User {
  2. private String name;
  3. private int age;
  4. public User(){}
  5. public User(String name, int age) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. @Override
  22. public String toString() {
  23. return "User{" +
  24. "name='" + name + '\'' +
  25. ", age=" + age +
  26. '}';
  27. }
  28. }

使用范例1:

  1. @Test
  2. public void test01() throws IOException {
  3. //将User对象转为json字符串
  4. User user = new User("张三",23);
  5. ObjectMapper objectMapper = new ObjectMapper();
  6. String s = objectMapper.writeValueAsString(user);
  7. System.out.println(s);
  8. //将json字符串转为User对象
  9. User user1 = objectMapper.readValue(s, User.class);
  10. System.out.println(user1);
  11. }

使用范例2:

  1. @Test
  2. public void test02() throws IOException{
  3. //将Map对象转为json字符串
  4. HashMap<String,String> map = new HashMap<>();
  5. map.put("name","张三");
  6. map.put("gender","男");
  7. ObjectMapper objectMapper = new ObjectMapper();
  8. String s = objectMapper.writeValueAsString(map);
  9. System.out.println(s);
  10. //将json字符串转为Map对象
  11. HashMap<String,String> hashMap = objectMapper.readValue(s, HashMap.class);
  12. System.out.println(hashMap);
  13. }

使用范例3:

  1. @Test
  2. public void test03() throws IOException{
  3. //将包含自定义对象的Map对象转为json字符串
  4. HashMap<String,User> map = new HashMap<>();
  5. map.put("1号",new User("张三",23));
  6. map.put("2号",new User("李四",24));
  7. ObjectMapper objectMapper = new ObjectMapper();
  8. String s = objectMapper.writeValueAsString(map);
  9. System.out.println(s);
  10. //将json字符串转为包含自定义对象的Map对象
  11. HashMap<String,User> hashMap = objectMapper.readValue(s,new TypeReference<HashMap<String,User>>(){});
  12. System.out.println(hashMap);
  13. }

使用范例4:

  1. @Test
  2. public void test04() throws IOException{
  3. //将List对象转为json字符串
  4. ArrayList<String> list = new ArrayList<>();
  5. list.add("张三");
  6. list.add("李四");
  7. ObjectMapper objectMapper = new ObjectMapper();
  8. String s = objectMapper.writeValueAsString(list);
  9. System.out.println(s);
  10. //将json字符串转为List对象
  11. ArrayList<String> arrayList = objectMapper.readValue(s, ArrayList.class);
  12. System.out.println(arrayList);
  13. }

使用范例5:

  1. @Test
  2. public void test05() throws IOException{
  3. //将含有自定义对象的List对象转为json字符串
  4. ArrayList<User> list = new ArrayList<>();
  5. list.add(new User("张三",23));
  6. list.add(new User("李四",24));
  7. ObjectMapper objectMapper = new ObjectMapper();
  8. String s = objectMapper.writeValueAsString(list);
  9. System.out.println(s);
  10. //将json字符串转为含有自定义对象的List对象
  11. ArrayList<User> arrayList = objectMapper.readValue(s,new TypeReference<ArrayList<User>>(){});
  12. System.out.println(arrayList);
  13. }