• AJAX & Axios & JSON (外加JSON数据格式案例)


     

     同步和异步:

    一、Ajax 快速入门

    代码演示如下: 

    服务端:AjaxServlet:

    1. package com.itheima.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/ajaxServlet")
    9. public class AjaxServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    12. // 1. 响应给客户端数据
    13. response.getWriter().write("hello ajax~");
    14. }
    15. @Override
    16. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    17. this.doGet(request, response);
    18. }
    19. }

    客户端:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <!-- 客户端 -->
    9. <script>
    10. // 1. 创建核心对象
    11. var xhttp;
    12. if (window.XMLHttpRequest) {
    13. xhttp = new XMLHttpRequest();
    14. } else {
    15. // code for IE6, IE5
    16. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    17. }
    18. // 2. 发送请求
    19. xhttp.open("GET", "http://localhost:8090/ajax-demo/ajaxServlet"); // 注意:这个地址是总地址(开启服务器后访问的总路径URL)
    20. xhttp.send();
    21. // 3. 获取服务端的响应数据
    22. xhttp.onreadystatechange = function() {
    23. if (this.readyState == 4 && this.status == 200) {
    24. alert(this.responseText); // this.responseText 就是响应的服务端返回的数据
    25. }
    26. }
    27. </script>
    28. </body>
    29. </html>

    注意细节:

    1、发送请求的地址要是总的URL地址

    2、默认为true 异步

    3、客户端的三个步骤可以在 ​​​​​​网站获取(直接复制代码即可)w3school 在线教程全球最大的中文 Web 技术教程。https://www.w3school.com.cn/

    开启服务器访问客户端演示结果:

     

     二、例子演示

    代码演示如下:

    服务端:SelectUserServlet

    1. package com.itheima.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/selectUserServlet")
    9. public class SelectUserServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    12. // 1 接收用户名参数
    13. String username =request.getParameter("username");
    14. // 2 调用service查询User对象
    15. // (我们这里定义一个变量为true假设查询的User用户名是存在的)
    16. boolean flag =true;
    17. // 3 响应给前端标记(假设我们这里响应 “true”)
    18. response.getWriter().write("" + flag); // 这里其实响应的是字符串型的true (因为空串 + 字符型true)
    19. }
    20. @Override
    21. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    22. this.doGet(request, response);
    23. }
    24. }

    客户端(前端):register.html

    注意1:重点代码在ajax请求部分(要看的懂)

    注意2:要在<script>标签里面写ajax或者axios请求或者获取的响应结果

    1. <!DOCTYPE html>
    2. <html lang="en" xmlns="http://www.w3.org/1999/html"><head>
    3. <meta charset="UTF-8">
    4. <title>欢迎注册</title>
    5. <link href="css/register.css" rel="stylesheet">
    6. </head>
    7. <body>
    8. <div class="form-div">
    9. <div class="reg-content">
    10. <h1>欢迎注册</h1>
    11. <span>已有帐号?</span> <a href="login.jsp">登录</a>
    12. </div>
    13. <form id="reg-form" action="#" method="get">
    14. <table>
    15. <tbody><tr>
    16. <td>用户名</td>
    17. <td class="inputs">
    18. <input name="username" type="text" id="username">
    19. <br>
    20. <span id="username_err" class="err_msg" style="display: none">用户名已存在</span>
    21. </td>
    22. </tr>
    23. <tr>
    24. <td>密码</td>
    25. <td class="inputs">
    26. <input name="password" type="password" id="password">
    27. <br>
    28. <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
    29. </td>
    30. </tr>
    31. </tbody></table>
    32. <div class="buttons">
    33. <input value="注 册" type="submit" id="reg_btn">
    34. </div>
    35. <br class="clear">
    36. </form>
    37. </div>
    38. <script> // 注意要在script里面写ajax或者axios请求
    39. // 1 给用户名输入框绑定 失去焦点事件
    40. document.getElementById("username").onblur =function (){
    41. // 2 发送Ajax请求
    42. // 获取用户名的值(客户端输入的用户名传给服务端的用户名的值)
    43. var username =this.value;
    44. // 2.1 创建核心对象
    45. var xhttp;
    46. if (window.XMLHttpRequest) {
    47. xhttp = new XMLHttpRequest();
    48. } else {
    49. // code for IE6, IE5
    50. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    51. }
    52. // 2.2 发送请求
    53. xhttp.open("GET", "http://localhost:8090/ajax-demo/selectUserServlet?username="+username); // 注意:这个地址是总地址(开启服务器后访问的总路径URL)
    54. xhttp.send();
    55. // 2.3 获取服务端的响应数据
    56. xhttp.onreadystatechange = function() {
    57. if (this.readyState == 4 && this.status == 200) {
    58. // alert(this.responseText); // this.responseText 就是响应的服务端返回的数据
    59. // 这里我们不用弹窗的形式获取服务端的响应数据
    60. if (this.responseText == "true"){
    61. // 判断如果我们接收的服务端响应的数据为true,说明用户存在 那么我们就提示信息 (提示信息是:用户名已存在)
    62. document.getElementById("username_err").style.display =''; // 把 display变成空串就能显示信息了
    63. }else {
    64. // 说明用户名不存在 那么我们就不把提示信息展示给用户了
    65. document.getElementById("username_err").style.display ='none';
    66. }
    67. }
    68. }
    69. }
    70. </script>
    71. </body>
    72. </html>

    开启服务器后访问客户端(前端):

    三、Axios

    细节:用Axios请求 增删改用post请求格式  查询用get请求格式

    3.1、Axios快速入门:

    代码演示如下:

    服务端:AxiosServlet

    1. package com.itheima.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/axiosServlet")
    9. public class AxiosServlet extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    12. System.out.println("这是前端以get请求方式请求服务端的....");
    13. // 1. 接收前端的请求参数
    14. String username =request.getParameter("username");
    15. System.out.println(username);
    16. // 2. 响应给客户端数据
    17. response.getWriter().write("hello axios~");
    18. }
    19. @Override
    20. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    21. System.out.println("这是前端以post请求方式请求服务端的....");
    22. this.doGet(request, response);
    23. }
    24. }

    前端:02-axios-demo.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <!-- 1. 引入js文件 -->
    9. <script src="js/axios-0.18.0.js"></script>
    10. <!-- 2. 使用axios发送请求 并获取响应结果 -->
    11. <script>
    12. // get形式
    13. axios({
    14. method:"get",
    15. url:"http://localhost:8090/ajax-demo/axiosServlet?username=kitty"
    16. }).then(function (resp){
    17. alert(resp.data); // 通过data这个属性就能获取到服务端响应的数据 (hello axios~)
    18. })
    19. </script>
    20. </body>
    21. </html>

     开启服务器访问前端页面结果演示:(post请求方式不再演示)

    3.2、Axios请求方式别名:

    代码演示如下 (以post方式演示):

    前端:03-axios-demo2.html

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <!-- 1. 引入js文件 -->
    9. <script src="js/axios-0.18.0.js"></script>
    10. <!-- 2. 使用axios发送请求 并获取响应结果 -->
    11. <script>
    12. // post形式
    13. /*
    14. axios({
    15. method:"post",
    16. url:"http://localhost:8090/ajax-demo/axiosServlet",
    17. data:"username=kitty"
    18. }).then(function (resp){
    19. alert(resp.data); // 通过data这个属性就能获取到服务端响应的数据 (hello axios~)
    20. })
    21. */
    22. // Axios别名的方式 post请求
    23. axios.post("http://localhost:8090/ajax-demo/axiosServlet","username=kitty")
    24. .then(function (resp){
    25. alert(resp.data)
    26. });
    27. </script>
    28. </body>
    29. </html>

    开启服务器访问前端所演示的结果和上面的结果一样:(前端拿到了服务端响应的数据)

    四、JSON

    4.1、JSON 基础语法

     代码演示如下:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <script>
    9. // 定义json
    10. var json ={
    11. "name":"kitty",
    12. "age":"20",
    13. "addr":["上海","北京","郑州"] // 注意:最后一个结尾不用加符号
    14. }
    15. // 获取值
    16. alert(json.addr)
    17. </script>
    18. </body>
    19. </html>

     

    4.2、JSON 数据和java对象转换(重点)

     使用步骤:

    下面模拟前端和后端交互:

     代码演示如下:

    User类:

    1. package com.itheima.json;
    2. public class User {
    3. private String username;
    4. private String password;
    5. private String addr;
    6. // getter and setter
    7. public String getUsername() {
    8. return username;
    9. }
    10. public void setUsername(String username) {
    11. this.username = username;
    12. }
    13. public String getPassword() {
    14. return password;
    15. }
    16. public void setPassword(String password) {
    17. this.password = password;
    18. }
    19. public String getAddr() {
    20. return addr;
    21. }
    22. public void setAddr(String addr) {
    23. this.addr = addr;
    24. }
    25. // toString方法
    26. @Override
    27. public String toString() {
    28. return "User{" +
    29. "用户名='" + username + '\'' +
    30. ", 密码='" + password + '\'' +
    31. ", 地址='" + addr + '\'' +
    32. '}';
    33. }
    34. }

    测试类:FactJsonTest

    细节:Java数据转换成的JSON数据 最终的JSON数据是以数组的形式存在的

    1. package com.itheima.json;
    2. import com.alibaba.fastjson.JSON;
    3. public class FactJsonTest {
    4. public static void main(String[] args) {
    5. // 1. 模拟将Java对象转成JSON字符串
    6. // 假设我们服务端将逻辑代码封装成User对象属性中转成JSON 响应给前端JSON数据
    7. User user =new User();
    8. user.setUsername("kitty1");
    9. user.setPassword("1");
    10. user.setAddr("郑州");
    11. // 将Java对象转成JSON字符串
    12. String jsonString =JSON.toJSONString(user);
    13. System.out.println(jsonString); // {"addr":"郑州","password":"1","username":"kitty1"}
    14. // 2. 模拟将JSON字符串转成Java对象
    15. // 也就是说:前端请求的数据是JSON形式,我们后端要先把JSON数据转换成Java对象 然后我们后端才能做各种处理逻辑
    16. // 假设前端请求的数据字符串:{"addr":"郑州","password":"1","username":"kitty1"}
    17. User u =JSON.parseObject("{\"addr\":\"郑州\",\"password\":\"1\",\"username\":\"kitty1\"}",User.class); // User.class :转换成User类型的类
    18. System.out.println(u); // 打印的是User类中的toString方法 (没有toString方法打印则为对象内存地址)
    19. }
    20. }

    FactJsonTest测试类输出结果:

    五、例子 前后端以JAVA数据和JSON数据相互转换的例子 (查询所有 & 新增品牌)

    前期准备:

     

    思路总体如下以brandName数据为例演示如下:

    要求1:前端以JSON数据形式请求后端路径资源,后端需要做的逻辑思路如下: 

    以brandName数据为例演示如下:

    前端代码:(只需要看懂axios部分即可)

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>添加品牌</title>
    6. </head>
    7. <body>
    8. <h3>添加品牌</h3>
    9. <form action="" method="post">
    10. 品牌名称:<input id="brandName" name="brandName"><br>
    11. 企业名称:<input id="companyName" name="companyName"><br>
    12. 排序:<input id="ordered" name="ordered"><br>
    13. 描述信息:<textarea rows="5" cols="20" id="description" name="description"></textarea><br>
    14. 状态:
    15. <input type="radio" name="status" value="0">禁用
    16. <input type="radio" name="status" value="1">启用<br>
    17. <input type="button" id="btn" value="提交">
    18. </form>
    19. <!-- 引入 axios 的js文件-->
    20. <script src="js/axios-0.18.0.js"></script>
    21. <script>
    22. //1. 给按钮绑定单击事件
    23. document.getElementById("btn").onclick = function () {
    24. // 将表单数据转为json
    25. var formData = {
    26. brandName:"",
    27. companyName:"",
    28. ordered:"",
    29. description:"",
    30. status:"",
    31. };
    32. // 获取表单数据
    33. let brandName = document.getElementById("brandName").value;
    34. // 设置数据
    35. formData.brandName = brandName;
    36. // 获取表单数据
    37. let companyName = document.getElementById("companyName").value;
    38. // 设置数据
    39. formData.companyName = companyName;
    40. // 获取表单数据
    41. let ordered = document.getElementById("ordered").value;
    42. // 设置数据
    43. formData.ordered = ordered;
    44. // 获取表单数据
    45. let description = document.getElementById("description").value;
    46. // 设置数据
    47. formData.description = description;
    48. let status = document.getElementsByName("status");
    49. for (let i = 0; i < status.length; i++) {
    50. if(status[i].checked){
    51. //
    52. formData.status = status[i].value ;
    53. }
    54. }
    55. console.log(formData);
    56. //2. 发送ajax请求
    57. axios({
    58. method:"post",
    59. url:"http://localhost:8080/brand-demo/addServlet",
    60. data:{"brandName":"Kitty"} // 注意:这里我们是以JSON格式写的数据的( request.getParameter 是接收不了JSON数据的 需要转换成Java数据 )
    61. }).then(function (resp) {
    62. // 判断响应数据是否为 success
    63. if(resp.data == "success"){
    64. location.href = "http://localhost:8080/brand-demo/brand.html";
    65. }
    66. })
    67. }
    68. </script>
    69. </body>
    70. </html>

    前端细节:

     点击提交事件后 F12 查看 请求体数据:(这个请求体数据以后无论有多长都只是一行,我们后端就需要先获取到该请求体的数据 该请求体数据是JSON数据格式 (因为前端是以JSON格式数据请求的,最终我们需要把JSON格式数据转换成Java格式数据 最后进行其他的逻辑操作 ))

     后端(服务器):

    小细节:服务器端需要先抓包获取到前端请求的JSON数据 然后把JSON数据转换成Java数据格式

    最后进行种种的逻辑处理(如:添加商品、修改商品、删除商品等逻辑)

    1. package com.itheima.web;
    2. import com.alibaba.fastjson.JSON;
    3. import com.itheima.pojo.Brand;
    4. import com.itheima.service.BrandService;
    5. import javax.servlet.*;
    6. import javax.servlet.http.*;
    7. import javax.servlet.annotation.*;
    8. import java.io.BufferedReader;
    9. import java.io.IOException;
    10. @WebServlet("/addServlet")
    11. public class AddServlet extends HttpServlet {
    12. // new BrandService对象
    13. private BrandService brandService = new BrandService();
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. // 接收客户端传递过来添加的数据
    17. /**
    18. * 重点注意: request.getParameter 是接收不了JSON形式的数据的 (前端请求是以axios请求的 请求数据是JSON格式: data:"{brandName=kitty}"
    19. * 如果写成data:"brandName=kitty" 就可以用request接收数据 )
    20. *
    21. * String brandName =request.getParameter("brandName");
    22. * System.out.println(brandName); // null
    23. *
    24. * 也就是说:客户端以JSON数据请求服务器 我们要把JSON数据转换成java数据使用
    25. *
    26. * 因此我们需要先获取请求体数据
    27. */
    28. // 1、获取请求体数据
    29. BufferedReader bufferedReader =request.getReader();
    30. // 读一行 (就读刚才那个F12抓包到的请求体数据:{brandName:"kitty"})
    31. String params =bufferedReader.readLine();
    32. // System.out.println(params); // {"brandName":"Kitty"} 可以看出我们把前端以JSON格式请求的数据拿到手了 我们需要进行转换数据格式
    33. // 2、将JSON数据格式转换为java对象格式
    34. Brand brand =JSON.parseObject(params,Brand.class);
    35. System.out.println(brand);
    36. }
    37. @Override
    38. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    39. this.doGet(request, response);
    40. }
    41. }

     结果:

            开启服务器:访问前端(结果应该是前端请求到服务端做出的一些操作)

     

    查询所有&新增商品总代码

    注意:前端的东西 只需要看懂 axios即可

     查询所有:

    Brand.html:

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Title</title>
    6. </head>
    7. <body>
    8. <a href="addBrand.html"><input type="button" value="新增"></a><br>
    9. <hr>
    10. <table id="brandTable" border="1" cellspacing="0" width="100%">
    11. <tr>
    12. <th>序号</th>
    13. <th>品牌名称</th>
    14. <th>企业名称</th>
    15. <th>排序</th>
    16. <th>品牌介绍</th>
    17. <th>状态</th>
    18. <th>操作</th>
    19. </tr>
    20. <tr align="center">
    21. <td>1</td>
    22. <td>三只松鼠</td>
    23. <td>三只松鼠</td>
    24. <td>100</td>
    25. <td>三只松鼠,好吃不上火</td>
    26. <td>启用</td>
    27. <td><a href="#">修改</a> <a href="#">删除</a></td>
    28. </tr>
    29. <tr align="center">
    30. <td>2</td>
    31. <td>优衣库</td>
    32. <td>优衣库</td>
    33. <td>10</td>
    34. <td>优衣库,服适人生</td>
    35. <td>禁用</td>
    36. <td><a href="#">修改</a> <a href="#">删除</a></td>
    37. </tr>
    38. <tr align="center">
    39. <td>3</td>
    40. <td>小米</td>
    41. <td>小米科技有限公司</td>
    42. <td>1000</td>
    43. <td>为发烧而生</td>
    44. <td>启用</td>
    45. <td><a href="#">修改</a> <a href="#">删除</a></td>
    46. </tr>
    47. </table>
    48. <!-- 导入js文件 -->
    49. <script src="js/axios-0.18.0.js"></script>
    50. <script>
    51. //1. 当页面加载完成后,发送ajax请求
    52. // 这个window.onload作用是:当这个brand.html整个页面加载完成后,就会自动触发这个事件
    53. window.onload = function () {
    54. //2. 发送ajax请求
    55. axios({
    56. method:"get",
    57. url:"http://localhost:8080/brand-demo/selectAllServlet"
    58. }).then(function (resp) {
    59. //获取数据
    60. let brands = resp.data;
    61. let tableData = " <tr>\n" +
    62. " <th>序号</th>\n" +
    63. " <th>品牌名称</th>\n" +
    64. " <th>企业名称</th>\n" +
    65. " <th>排序</th>\n" +
    66. " <th>品牌介绍</th>\n" +
    67. " <th>状态</th>\n" +
    68. " <th>操作</th>\n" +
    69. " </tr>";
    70. for (let i = 0; i < brands.length ; i++) {
    71. let brand = brands[i]; // 获取到一个一个的转换成的JSON数据的数组(Brand对象最终转换成JSON形式的数据是以数组形式存在的)
    72. // 如: {"addr":"郑州","password":"1","username":"kitty1"}
    73. tableData += "\n" +
    74. " <tr align=\"center\">\n" +
    75. " <td>"+(i+1)+"</td>\n" +
    76. " <td>"+brand.brandName+"</td>\n" +
    77. " <td>"+brand.companyName+"</td>\n" +
    78. " <td>"+brand.ordered+"</td>\n" +
    79. " <td>"+brand.description+"</td>\n" +
    80. " <td>"+brand.status+"</td>\n" +
    81. "\n" +
    82. " <td><a href=\"#\">修改</a> <a href=\"#\">删除</a></td>\n" +
    83. " </tr>";
    84. }
    85. // 设置表格数据
    86. document.getElementById("brandTable").innerHTML = tableData;
    87. })
    88. }
    89. </script>
    90. </body>
    91. </html>

    后端代码:

    selectAllServlet:( 这里把java数据转换成json数据响应给前端 )

    1. package com.itheima.web;
    2. import com.alibaba.fastjson.JSON;
    3. import com.itheima.pojo.Brand;
    4. import com.itheima.service.BrandService;
    5. import javax.servlet.*;
    6. import javax.servlet.http.*;
    7. import javax.servlet.annotation.*;
    8. import java.io.IOException;
    9. import java.util.List;
    10. @WebServlet("/selectAllServlet")
    11. public class SelectAllServlet extends HttpServlet {
    12. // 调用BrandService对象中的查询所有的方法
    13. private BrandService brandService =new BrandService();
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. // 1 调用BrandService对象中的查询所有的方法
    17. List<Brand> brands =brandService.selectAll();
    18. // 2 把查询出来的集合数据转换成JSON数据形式 展示给前端
    19. /**
    20. * 这里也要注意: 查询出来的java数据要转换成JSON数据才能响应给前端进行展示
    21. */
    22. String jsonString =JSON.toJSONString(brands);
    23. // 解决响应时展示给前端页面中文乱码问题 (看response笔记 把html改成json即可)
    24. response.setContentType("text/json;charset=utf-8");
    25. // 3 把JSON数据响应给前端
    26. response.getWriter().write(jsonString);
    27. }
    28. @Override
    29. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    30. this.doGet(request, response);
    31. }
    32. }

    开启服务器结果如下:

     增加商品:

    前端: addBrand.html

    注意这有一个小逻辑:最后前端收到后端的success的响应后,跳转到查询所有页面 把新添加进去的商品展示出来

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>添加品牌</title>
    6. </head>
    7. <body>
    8. <h3>添加品牌</h3>
    9. <form action="" method="post">
    10. 品牌名称:<input id="brandName" name="brandName"><br>
    11. 企业名称:<input id="companyName" name="companyName"><br>
    12. 排序:<input id="ordered" name="ordered"><br>
    13. 描述信息:<textarea rows="5" cols="20" id="description" name="description"></textarea><br>
    14. 状态:
    15. <input type="radio" name="status" value="0">禁用
    16. <input type="radio" name="status" value="1">启用<br>
    17. <input type="button" id="btn" value="提交">
    18. </form>
    19. <!-- 引入 axios 的js文件-->
    20. <script src="js/axios-0.18.0.js"></script>
    21. <script>
    22. //1. 给按钮绑定单击事件
    23. document.getElementById("btn").onclick = function () {
    24. // 将表单数据转为JSON
    25. var formData = {
    26. brandName:"",
    27. companyName:"",
    28. ordered:"",
    29. description:"",
    30. status:"",
    31. };
    32. // 获取表单数据
    33. let brandName = document.getElementById("brandName").value;
    34. // 设置数据
    35. formData.brandName = brandName;
    36. // 获取表单数据
    37. let companyName = document.getElementById("companyName").value;
    38. // 设置数据
    39. formData.companyName = companyName;
    40. // 获取表单数据
    41. let ordered = document.getElementById("ordered").value;
    42. // 设置数据
    43. formData.ordered = ordered;
    44. // 获取表单数据
    45. let description = document.getElementById("description").value;
    46. // 设置数据
    47. formData.description = description;
    48. let status = document.getElementsByName("status");
    49. for (let i = 0; i < status.length; i++) {
    50. if(status[i].checked){
    51. //
    52. formData.status = status[i].value ;
    53. }
    54. }
    55. console.log(formData);
    56. //2. 发送ajax请求
    57. axios({
    58. method:"post",
    59. url:"http://localhost:8080/brand-demo/addServlet",
    60. data: formData // 注意:这里我们是以JSON格式写的数据的( request.getParameter 是接收不了JSON数据的 需要转换成Java数据 )
    61. }).then(function (resp) {
    62. // 判断响应数据是否为 success
    63. if(resp.data == "success"){ // 如果成功了 那么就跳转到查询所有的页面 (可以把刚添加完的商品查询出来)
    64. location.href = "http://localhost:8080/brand-demo/brand.html";
    65. }
    66. })
    67. }
    68. </script>
    69. </body>
    70. </html>

    后端代码:

    AddServlet:(需要先抓包请求体中的JSON数据 然后转换成Java格式数据)

    1. package com.itheima.web;
    2. import com.alibaba.fastjson.JSON;
    3. import com.itheima.pojo.Brand;
    4. import com.itheima.service.BrandService;
    5. import javax.servlet.*;
    6. import javax.servlet.http.*;
    7. import javax.servlet.annotation.*;
    8. import java.io.BufferedReader;
    9. import java.io.IOException;
    10. @WebServlet("/addServlet")
    11. public class AddServlet extends HttpServlet {
    12. // new BrandService对象
    13. private BrandService brandService = new BrandService();
    14. @Override
    15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. // 接收客户端传递过来添加的数据
    17. /**
    18. * 重点注意: request.getParameter 是接收不了JSON形式的数据的 (前端请求是以axios请求的 请求数据是JSON格式: data:"{brandName=kitty}"
    19. * 如果写成data:"brandName=kitty" 就可以用request接收数据 )
    20. *
    21. * String brandName =request.getParameter("brandName");
    22. * System.out.println(brandName); // null
    23. *
    24. * 也就是说:客户端以JSON数据请求服务器 我们要把JSON数据转换成java数据使用
    25. *
    26. * 因此我们需要先获取请求体数据
    27. */
    28. // 1、获取请求体数据
    29. BufferedReader bufferedReader =request.getReader();
    30. // 读一行 (就读刚才那个F12抓包到的请求体数据:{brandName:"kitty"})
    31. String params =bufferedReader.readLine();
    32. // System.out.println(params); // {"brandName":"Kitty"} 可以看出我们把前端以JSON格式请求的数据拿到手了 我们需要进行转换数据格式
    33. // 2、将JSON数据格式转换为java对象格式
    34. Brand brand =JSON.parseObject(params,Brand.class);
    35. // System.out.println(brand); // 调用Brand的toString方法 Brand{id=null, brandName='Kitty', companyName='null', ordered=null, description='null', status=null}
    36. // 3、我们把JSON数据转换成Java对象后 前端请求的数据就存放到我们Brand对象的属性当中了(前端请求的数据就是添加商品的数据)
    37. /**
    38. * 调用 BrandService 进行添加商品操作
    39. */
    40. brandService.add(brand);
    41. // 4、响应给前端成功标识
    42. response.getWriter().write("success");
    43. }
    44. @Override
    45. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    46. this.doGet(request, response);
    47. }
    48. }

    开启服务器添加结果:

     点击提交后(跳转到查询所有页面):

     

  • 相关阅读:
    操作系统原理实验一:进程与线程创建控制程序
    JavaWeb 中 Filter过滤器
    Qt自定义QSlider(支持水平垂直)
    每天五分钟机器学习:数据和特征决定机器学习的上限(特征工程)
    Git多人开发解决冲突案例
    BGP边界网关路由实验(华为)
    「Verilog学习笔记」输入序列连续的序列检测
    .NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)
    7-15 计算圆周率(分数 15)
    网络安全(黑客)自学
  • 原文地址:https://blog.csdn.net/lwj_07/article/details/125522090