首頁 > 軟體

AJAX SpringBoot 前後端資料互動的專案實現

2022-03-01 13:01:24

1. Ajax 概述

Ajax 的英文全稱是 ”Asynchronous JavaScript and XML“,即 ”非同步的 JavaScript 和 XML“。其核心是通過 JavaScript 的 XMLHttpRequest 物件,以一種非同步的方式,向伺服器傳送資料請求,並且通過該物件接收請求返回的資料,從而實現使用者端與伺服器端的資料互動。

優點:Ajax 能夠重新整理指定的頁面區域(區域性重新整理),而不是重新整理整個頁面,從而減少使用者端和伺服器端之間的資料互動傳輸,提高頁面速度,使得使用者體驗更好。

初體驗:基於 jQuery 方式動態繫結事件提交

給【獲取驗證碼】按鈕繫結點選事件,當用戶點選該按鈕時,向後臺伺服器傳送 AJAX 請求獲取一個隨機驗證碼,登入頁面的整體不重新載入,僅做區域性的頁面重新整理。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>非同步請求</title>
    <script type="text/javascript" src="/static/js/jquery-2.0.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var btn = $("#flush");
            btn.click(function () {
                $.ajax({
                    url: '/getCode',
                    type:'get',
                    data:'id=1',  //字串
                    dataType:'text',
                    success:function (data) {
                        console.log(data);
                        alert("後臺驗證碼:" + data);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <div style="text-align: center;">
        <h2>使用者登入</h2>
        <form>
            使用者名稱:<input type="text" name="username"><br>
            密&emsp;碼:<input type="password" name="password"><br>
            驗證碼:<input type="text" name="code"><br><br>
            <input type="button" value="登入">&emsp;<input type="button" id="flush" value="獲取驗證碼">
        </form>
    </div>
</body>
</html>

SpringBoot 後臺接收 AJAX 請求,首先要獲取該請求攜帶的引數 id=1(該引數沒有實際意義,僅做演示使用),然後根據請求業務,對該結果進行響應。success 回撥函數對響應結果進行展示。

import javax.servlet.http.HttpServletRequest;
import java.util.Random;

@Controller
public class TestController {

    @GetMapping("/ajax")
    public String index(){
        return "form";
    }

    //SpringBoot接收ajax請求的方式
    //方式一:使用HttpServletRequest request接收請求引數
    @GetMapping("/getCode")
    @ResponseBody
    public String getCode(HttpServletRequest request){
        String id = request.getParameter("id");
        System.out.println("AJAX傳遞的引數:" + id);
        //獲取5位驗證碼
        return randomCodes();
    }

    //方式二:用@Param對映單個值
    @GetMapping("/getCode1")
    @ResponseBody
    public String getCode1(@Param("id") Integer id){
        System.out.println(id);
        //獲取5位驗證碼
        return randomCodes();
    }

    public String randomCodes(){
        String str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder code=new StringBuilder(5);
        for(int i=0;i<5;i++)
        {
            char ch=str.charAt(new Random().nextInt(str.length()));
            code.append(ch);
        }
        return code.toString();
    }
}

上面介紹了兩種 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):

$.ajax({
	url:'/search',
	type:'post',
	data:{
		'id':$("#sid").val(),
		'username':$("#uname").val(),
		'password':$("#pwd").val()
	},
	dataType:'json',
	success:function (data) {
		console.log(data);
		$("#sid").val(data.id);
		$("#uname").val(data.name);
		$("#score").val(data.score);
	}
})

JSON(JavaScript Object Notation),一種輕量級資料互動格式,完成 js 與 Java/Python/PHP 等後端開 發語言物件資料之間的轉換。使用者端與伺服器之間傳遞物件資料時,需要使用 JSON 格式。

案例:使用 AJAX 校驗使用者輸入的資訊,編寫一個 2022 年碩士研究生招生考試成績查詢系統;

1、建立空白的 SpringBoot 專案,並在 pom.xml 匯入相關依賴;

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.46</version>
</dependency>

2、在 MySQL 資料庫中建立一張考研成績資料表(stu_score),並錄入若干條測試資料;

3、在全域性組態檔 resources/application.yml 中設定資料來源資訊、檢視解析器以及埠號等相關設定等;

spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    mode: HTML5
    encoding: UTF-8
  datasource:
    url: jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  mvc:
    static-path-pattern: /static/**
server:
  port: 8181
# 設定SQL紀錄檔
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4、建立資料表對應的實體類 Student;

package com.trainingl.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "stu_score")
public class Student {
    @TableId(type = IdType.ASSIGN_ID)
    private Long sid;
    private String sname;
    private String card;
    private Integer politics;
    private Integer english;
    private Integer math;
    private Integer computer;
}

5、在路徑 com > trainingl > mapper 下建立介面 StudentMapper;

package com.trainingl.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.trainingl.entity.Student;
import org.springframework.stereotype.Repository;

@Repository
public interface StudentMapper extends BaseMapper<Student> {
    //所有的CRUD操作都已經編寫好了
}

說明:由於系統規模較小,所以這裡省略了 Service 服務層。

6、建立 SearchController 控制器,主要負責接收使用者端瀏覽器的 AJAX 請求與響應。

package com.trainingl.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.trainingl.entity.Student;
import com.trainingl.mapper.StudentMapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/suda")
public class SearchController {
    @Autowired
    private StudentMapper studentMapper;

    @GetMapping("/search")
    public String home(){
        return "login";
    }

    @PostMapping("/login")
    @ResponseBody
    public Map<String,String> login(HttpServletRequest request){
        String id = request.getParameter("id");
        String username = request.getParameter("username");
        String card = request.getParameter("password");
        //查詢判斷
        QueryWrapper<Student> wrapper = new QueryWrapper<>();
        wrapper
                .eq("sid",id)
                .eq("sname", username)
                .eq("card", card);
        Integer count = studentMapper.selectCount(wrapper);
        //返回值
        HashMap<String, String> map = new HashMap<>();
        if (count == 1){
            //登入驗證成功,通過id查詢該考生的成績(id具有唯一性)
            map.put("result", id);
            map.put("code","100");
        }else {
            map.put("result","登入失敗!輸入資訊有誤!");
            map.put("code","200");
        }
        return map;
    }

    @GetMapping("/searchById/{id}")
    public ModelAndView searchById(@PathVariable Long id){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("person");
        Student student = studentMapper.selectById(id);
        System.out.println(student);
        Integer total = student.getPolitics() + student.getEnglish() + student.getMath() + student.getComputer();
        modelAndView.addObject("student", student);
        modelAndView.addObject("totalScore", total);
        return modelAndView;
    }
}

7、檢視層(系統登入頁面、成績查詢頁面)

7.1 系統登入頁面(使用者端與伺服器之間的資料互動格式是JSON,請求方式是AJAX,而不是通過form表單完成)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>系統登入</title>
    <script type="text/javascript" src="/static/js/jquery-2.0.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var btn = $("#btn");
            // 點選事件
            btn.click(function () {
                $.ajax({
                    url:'/suda/login',
                    type:'post',
                    data:{
                        'id':$("#sid").val(),
                        'username':$("#uname").val(),
                        'password':$("#pwd").val()
                    },
                    dataType:'json',
                    success:function (data) {
                        if(data.code == "100"){
                            //登入成功,則跳轉到成績查詢頁面
                            window.location.href = "/suda/searchById/" + data.result;
                        }else{
                            //登入失敗,則給出提示資訊
                            var msg = $("#btn");
                            msg.after("<br><br><span style='color:red;'>提示:"+data.result+"</span>")
                        }
                    }
                })
            })
        })
    </script>
</head>
<body>
    <div style="text-align:center;">
        <img src="/static/img/brand.png" style="width: 280px;height: 100px;"/>
        <h3>2022年碩士研究生招生考試成績查詢系統</h3>
        <img src="/static/img/logo.jpeg" style="width: 500px;height: 300px;"/>
        <!--這裡不通過form表單提交使用者端請求-->
        <form>
            准考證號:<input type="text" name="id" id="sid"><br>
            考生姓名:<input type="text" name="username" id="uname"><br>
            身份證號:<input type="text" name="password" id="pwd"><br/>
            <br/>
            <input type="button" value="查詢" id="btn">
        </form>
    </div>
</body>
</html>

注:如果輸入的資訊校驗失敗,則通過紅色字型給出提示,若資訊校驗成功,則會跳轉到初試成績的詳細介面。

7.2 成績詳細頁面(通過 thymeleaf 模板渲染資料)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html xmlns:th="http://www.thymeleaf.org"></html>
<head>
    <meta charset="UTF-8">
    <title>研究生初試成績查詢</title>
</head>
<body>
    <div style="text-align: center;">
        <div style="border: 1px solid;">
            <h3>2022年研究生考試初始成績查詢</h3>
            <br>
            准考證號:<span th:text="${student.sid}"></span><br>
            姓名:<span th:text="${student.sname}"></span><br>
            身份證號:<span th:text="${student.card}"></span><br>
            <hr/>
            思想政治理論:<span th:text="${student.politics}"></span><br>
            英語(一):<span th:text="${student.english}"></span><br>
            數學(一):<span th:text="${student.math}"></span><br>
            電腦科學專業基礎(408):<span th:text="${student.computer}"></span><br>
            總分:<span th:text="${totalScore}"></span><br>
        </div>
        <p>說明:若查詢的成績為負值,表示有缺考、違紀等情況。若仍對查詢結果有疑問,請諮詢相應的招生單位。
        </p>
    </div>
</body>
</html>

總結:本專案用於演示 AJAX 與 SpringBoot 專案前後端資料互動,以案例+專案驅動的方式介紹了在 SpringBoot 專案開發中非同步請求前後端資料的傳遞方式。

到此這篇關於AJAX SpringBoot 前後端資料互動的專案實現的文章就介紹到這了,更多相關AJAX SpringBoot 資料互動內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com