经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
AJAX?SpringBoot?前后端数据交互的项目实现
来源:jb51  时间:2022/3/1 13:39:51  对本文有异议

1. Ajax 概述

Ajax 的英文全称是 ”Asynchronous JavaScript and XML“,即 ”异步的 JavaScript 和 XML“。其核心是通过 JavaScript 的 XMLHttpRequest 对象,以一种异步的方式,向服务器发送数据请求,并且通过该对象接收请求返回的数据,从而实现客户端与服务器端的数据交互。

优点:Ajax 能够刷新指定的页面区域(局部刷新),而不是刷新整个页面,从而减少客户端和服务器端之间的数据交互传输,提高页面速度,使得用户体验更好。

初体验:基于 jQuery 方式动态绑定事件提交

给【获取验证码】按钮绑定点击事件,当用户点击该按钮时,向后台服务器发送 AJAX 请求获取一个随机验证码,登录页面的整体不重新加载,仅做局部的页面刷新。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>异步请求</title>
  6. <script type="text/javascript" src="/static/js/jquery-2.0.0.min.js"></script>
  7. <script type="text/javascript">
  8. $(function () {
  9. var btn = $("#flush");
  10. btn.click(function () {
  11. $.ajax({
  12. url: '/getCode',
  13. type:'get',
  14. data:'id=1', //字符串
  15. dataType:'text',
  16. success:function (data) {
  17. console.log(data);
  18. alert("后台验证码:" + data);
  19. }
  20. })
  21. })
  22. })
  23. </script>
  24. </head>
  25. <body>
  26. <div style="text-align: center;">
  27. <h2>用户登录</h2>
  28. <form>
  29. 用户名:<input type="text" name="username"><br>
  30. 密&emsp;码:<input type="password" name="password"><br>
  31. 验证码:<input type="text" name="code"><br><br>
  32. <input type="button" value="登录">&emsp;<input type="button" id="flush" value="获取验证码">
  33. </form>
  34. </div>
  35. </body>
  36. </html>

SpringBoot 后台接收 AJAX 请求,首先要获取该请求携带的参数 id=1(该参数没有实际意义,仅做演示使用),然后根据请求业务,对该结果进行响应。success 回调函数对响应结果进行展示。

  1. import javax.servlet.http.HttpServletRequest;
  2. import java.util.Random;
  3.  
  4. @Controller
  5. public class TestController {
  6.  
  7. @GetMapping("/ajax")
  8. public String index(){
  9. return "form";
  10. }
  11.  
  12. //SpringBoot接收ajax请求的方式
  13. //方式一:使用HttpServletRequest request接收请求参数
  14. @GetMapping("/getCode")
  15. @ResponseBody
  16. public String getCode(HttpServletRequest request){
  17. String id = request.getParameter("id");
  18. System.out.println("AJAX传递的参数:" + id);
  19. //获取5位验证码
  20. return randomCodes();
  21. }
  22.  
  23. //方式二:用@Param映射单个值
  24. @GetMapping("/getCode1")
  25. @ResponseBody
  26. public String getCode1(@Param("id") Integer id){
  27. System.out.println(id);
  28. //获取5位验证码
  29. return randomCodes();
  30. }
  31.  
  32. public String randomCodes(){
  33. String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  34. StringBuilder code=new StringBuilder(5);
  35. for(int i=0;i<5;i++)
  36. {
  37. char ch=str.charAt(new Random().nextInt(str.length()));
  38. code.append(ch);
  39. }
  40. return code.toString();
  41. }
  42. }

上面介绍了两种 SpringBoot 接收请求参数的方式:

  • public String getCode(HttpServletRequest request):使用 HttpServletRequest request 接收请求参数;
  • public String getCode1(@Param("id") Integer id):用 @Param 映射单个值;

Ajax 异步请求一个典型的应用就是用户表单输入时,局部刷新验证码,而不会影响其他表单项已输入的信息。

传统的 WEB 数据交互与 AJAX 数据交互比较:

  • 客户端请求的方式不同:传统的 WEB 是用浏览器发送同步数据请求(form表单、a链接),AJAX 是异步引擎对象发送异步请求;
  • 服务器响应的方式不同:传统的 WEB 每次响应的是一个完整的 HTML 页面即视图,AJAX 是局部刷新,返回响应需要的 JSON 数据;
  • 客户端处理方式不同:传统的 WEB 需要等待服务器完成响应并且重新加载整个页面之后,用户才能进行后续操作,AJAX 动态更新页面中的局部内容,不影响用户的其他操作;

2. 基于 JQuery 的 AJAX 语法

$.ajax({属性}) 常用的属性参数:

参数描述
url请求后端服务器的地址
type请求方式,默认为 get 类型
data请求参数
dataType服务器返回的数据类型,比如:text/json/xml 等
success请求成功的回调函数
error请求失败的回调函数
complete请求完成的回调函数(无论成功还是失败,都会被调用)

用法示例(服务器与客户端之间的数据交互类型是JSON):

  1. $.ajax({
  2. url:'/search',
  3. type:'post',
  4. data:{
  5. 'id':$("#sid").val(),
  6. 'username':$("#uname").val(),
  7. 'password':$("#pwd").val()
  8. },
  9. dataType:'json',
  10. success:function (data) {
  11. console.log(data);
  12. $("#sid").val(data.id);
  13. $("#uname").val(data.name);
  14. $("#score").val(data.score);
  15. }
  16. })

JSON(JavaScript Object Notation),一种轻量级数据交互格式,完成 js 与 Java/Python/PHP 等后端开 发语言对象数据之间的转换。客户端与服务器之间传递对象数据时,需要使用 JSON 格式。

案例:使用 AJAX 校验用户输入的信息,编写一个 2022 年硕士研究生招生考试成绩查询系统;

1、创建空白的 SpringBoot 项目,并在 pom.xml 导入相关依赖;

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-web</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>com.baomidou</groupId>
  11. <artifactId>mybatis-plus-boot-starter</artifactId>
  12. <version>3.4.2</version>
  13. </dependency>
  14.  
  15. <dependency>
  16. <groupId>mysql</groupId>
  17. <artifactId>mysql-connector-java</artifactId>
  18. <version>5.1.46</version>
  19. </dependency>

2、在 MySQL 数据库中创建一张考研成绩数据表(stu_score),并录入若干条测试数据;

3、在全局配置文件 resources/application.yml 中配置数据源信息、视图解析器以及端口号等相关配置等;

  1. spring:
  2. thymeleaf:
  3. prefix: classpath:/templates/
  4. suffix: .html
  5. mode: HTML5
  6. encoding: UTF-8
  7. datasource:
  8. url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8
  9. username: root
  10. password: 123456
  11. driver-class-name: com.mysql.jdbc.Driver
  12. mvc:
  13. static-path-pattern: /static/**
  14. server:
  15. port: 8181
  16. # 配置SQL日志
  17. mybatis-plus:
  18. configuration:
  19. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4、创建数据表对应的实体类 Student;

  1. package com.trainingl.entity;
  2.  
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7.  
  8. @Data
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. @TableName(value = "stu_score")
  12. public class Student {
  13. @TableId(type = IdType.ASSIGN_ID)
  14. private Long sid;
  15. private String sname;
  16. private String card;
  17. private Integer politics;
  18. private Integer english;
  19. private Integer math;
  20. private Integer computer;
  21. }

5、在路径 com > trainingl > mapper 下创建接口 StudentMapper;

  1. package com.trainingl.mapper;
  2.  
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.trainingl.entity.Student;
  5. import org.springframework.stereotype.Repository;
  6.  
  7. @Repository
  8. public interface StudentMapper extends BaseMapper<Student> {
  9. //所有的CRUD操作都已经编写好了
  10. }

说明:由于系统规模较小,所以这里省略了 Service 服务层。

6、创建 SearchController 控制器,主要负责接收客户端浏览器的 AJAX 请求与响应。

  1. package com.trainingl.controller;
  2.  
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.trainingl.entity.Student;
  5. import com.trainingl.mapper.StudentMapper;
  6. import org.apache.ibatis.annotations.Param;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.*;
  10. import org.springframework.web.servlet.ModelAndView;
  11.  
  12. import javax.servlet.http.HttpServletRequest;
  13. import java.util.HashMap;
  14. import java.util.Map;
  15.  
  16. @Controller
  17. @RequestMapping("/suda")
  18. public class SearchController {
  19. @Autowired
  20. private StudentMapper studentMapper;
  21.  
  22. @GetMapping("/search")
  23. public String home(){
  24. return "login";
  25. }
  26.  
  27. @PostMapping("/login")
  28. @ResponseBody
  29. public Map<String,String> login(HttpServletRequest request){
  30. String id = request.getParameter("id");
  31. String username = request.getParameter("username");
  32. String card = request.getParameter("password");
  33. //查询判断
  34. QueryWrapper<Student> wrapper = new QueryWrapper<>();
  35. wrapper
  36. .eq("sid",id)
  37. .eq("sname", username)
  38. .eq("card", card);
  39. Integer count = studentMapper.selectCount(wrapper);
  40. //返回值
  41. HashMap<String, String> map = new HashMap<>();
  42. if (count == 1){
  43. //登录验证成功,通过id查询该考生的成绩(id具有唯一性)
  44. map.put("result", id);
  45. map.put("code","100");
  46. }else {
  47. map.put("result","登录失败!输入信息有误!");
  48. map.put("code","200");
  49. }
  50. return map;
  51. }
  52.  
  53. @GetMapping("/searchById/{id}")
  54. public ModelAndView searchById(@PathVariable Long id){
  55. ModelAndView modelAndView = new ModelAndView();
  56. modelAndView.setViewName("person");
  57. Student student = studentMapper.selectById(id);
  58. System.out.println(student);
  59. Integer total = student.getPolitics() + student.getEnglish() + student.getMath() + student.getComputer();
  60. modelAndView.addObject("student", student);
  61. modelAndView.addObject("totalScore", total);
  62. return modelAndView;
  63. }
  64. }

7、视图层(系统登录页面、成绩查询页面)

7.1 系统登录页面(客户端与服务器之间的数据交互格式是JSON,请求方式是AJAX,而不是通过form表单完成)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>系统登录</title>
  6. <script type="text/javascript" src="/static/js/jquery-2.0.0.min.js"></script>
  7. <script type="text/javascript">
  8. $(function () {
  9. var btn = $("#btn");
  10. // 点击事件
  11. btn.click(function () {
  12. $.ajax({
  13. url:'/suda/login',
  14. type:'post',
  15. data:{
  16. 'id':$("#sid").val(),
  17. 'username':$("#uname").val(),
  18. 'password':$("#pwd").val()
  19. },
  20. dataType:'json',
  21. success:function (data) {
  22. if(data.code == "100"){
  23. //登录成功,则跳转到成绩查询页面
  24. window.location.href = "/suda/searchById/" + data.result;
  25. }else{
  26. //登录失败,则给出提示信息
  27. var msg = $("#btn");
  28. msg.after("<br><br><span style='color:red;'>提示:"+data.result+"</span>")
  29. }
  30. }
  31. })
  32. })
  33. })
  34. </script>
  35. </head>
  36. <body>
  37. <div style="text-align:center;">
  38. <img src="/static/img/brand.png" style="width: 280px;height: 100px;"/>
  39. <h3>2022年硕士研究生招生考试成绩查询系统</h3>
  40. <img src="/static/img/logo.jpeg" style="width: 500px;height: 300px;"/>
  41. <!--这里不通过form表单提交客户端请求-->
  42. <form>
  43. 准考证号:<input type="text" name="id" id="sid"><br>
  44. 考生姓名:<input type="text" name="username" id="uname"><br>
  45. 身份证号:<input type="text" name="password" id="pwd"><br/>
  46. <br/>
  47. <input type="button" value="查询" id="btn">
  48. </form>
  49. </div>
  50. </body>
  51. </html>

注:如果输入的信息校验失败,则通过红色字体给出提示,若信息校验成功,则会跳转到初试成绩的详细界面。

7.2 成绩详细页面(通过 thymeleaf 模板渲染数据)

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
  3. <html xmlns:th="http://www.thymeleaf.org"></html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>研究生初试成绩查询</title>
  7. </head>
  8. <body>
  9. <div style="text-align: center;">
  10. <div style="border: 1px solid;">
  11. <h3>2022年研究生考试初始成绩查询</h3>
  12. <br>
  13. 准考证号:<span th:text="${student.sid}"></span><br>
  14. 姓名:<span th:text="${student.sname}"></span><br>
  15. 身份证号:<span th:text="${student.card}"></span><br>
  16. <hr/>
  17. 思想政治理论:<span th:text="${student.politics}"></span><br>
  18. 英语(一):<span th:text="${student.english}"></span><br>
  19. 数学(一):<span th:text="${student.math}"></span><br>
  20. 计算机科学专业基础(408):<span th:text="${student.computer}"></span><br>
  21. 总分:<span th:text="${totalScore}"></span><br>
  22. </div>
  23. <p>说明:若查询的成绩为负值,表示有缺考、违纪等情况。若仍对查询结果有疑问,请咨询相应的招生单位。
  24. </p>
  25. </div>
  26. </body>
  27. </html>

总结:本项目用于演示 AJAX 与 SpringBoot 项目前后端数据交互,以案例+项目驱动的方式介绍了在 SpringBoot 项目开发中异步请求前后端数据的传递方式。

到此这篇关于AJAX SpringBoot 前后端数据交互的项目实现的文章就介绍到这了,更多相关AJAX SpringBoot 数据交互内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号