知識庫 / Spring / Spring Data RSS 訂閱

AngularJS Spring Data REST CRUD 應用

REST,Spring Data
HongKong
10
03:55 AM · Dec 06 ,2025

1. 概述

在本教程中,我們將使用 AngularJS 作為前端和 Spring Data REST 作為後端創建一個簡單 CRUD 應用程序的示例。

2. 創建 REST 數據服務

為了創建持久化支持,我們將利用 Spring Data REST 規範,從而能夠對數據模型執行 CRUD 操作。

您可以在 Spring Data REST 的介紹中找到所有必要的設置 REST 端點的相關信息。 在本文中,我們將重用我們為介紹教程設置的現有項目。

對於持久化,我們將使用內存數據庫 H2

作為數據模型,前一篇文章定義了一個 WebsiteUser 類,具有 idnameemail 屬性以及名為 UserRepository 的倉庫接口。

定義此接口會指示 Spring 創建用於公開 REST 集合資源和項級資源的支持。 現在讓我們更詳細地瞭解我們稍後將從 AngularJS 調用提供的端點。

2.1. 用户資源

所有用户的信息將可通過以下端點獲取:/users。 此 URL 可以使用 GET 方法調用,並返回 JSON 對象,格式如下:

{
  "_embedded" : {
    "users" : [ {
      "name" : "Bryan",
      "age" : 20,
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/users/1"
        },
        "User" : {
          "href" : "http://localhost:8080/users/1"
        }
      }
    }, 
...
    ]
  }
}

2.2. 資源項

單個 WebsiteUser 對象可以通過以 /users/{userID} 形式的 URL 進行操作,並使用不同的 HTTP 方法和請求負載進行修改。

為了檢索 WebsiteUser 對象,可以使用 GET 方法訪問 /users/{userID}。 這將返回一個 JSON 對象,格式如下:

{
  "name" : "Bryan",
  "email" : "[email protected]",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/users/1"
    },
    "User" : {
      "href" : "http://localhost:8080/users/1"
    }
  }
}

為了添加一個新的 WebsiteUser,我們需要調用 /users 接口,使用 POST 方法。 新的 WebsiteUser 記錄的屬性將作為 JSON 對象添加到請求體中:

{name: "Bryan", email: "[email protected]"}

如果未發現錯誤,此 URL 將返回 201 CREATED 狀態碼。

如果我們想要更新 WebsiteUser 記錄的屬性,則需要調用 URL /users/{UserID},使用 PATCH 方法幷包含請求體中包含的新值:

{name: "Bryan", email: "[email protected]"}

要刪除一個 WebsiteUser</em/> 記錄,我們可以通過調用 URL /users/{UserID}</em/>,使用 DELETE 方法。如果未發生錯誤,則返回狀態碼 204 NO CONTENT。

2.3. MVC 配置

我們將添加一個基本的 MVC 配置,以便在我們的應用程序中顯示 HTML 文件:

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    
    public MvcConfig(){
        super();
    }
    
    @Override
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

   @Bean
   WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet() {
     return (factory) -> factory.setRegisterDefaultServlet(true);
   }
}

2.4. 允許跨域請求

如果我們要將 AngularJS 前端應用程序部署在與 REST API 隔離,則需要啓用跨域請求。

Spring Data REST 從 1.5.0.RELEASE 版本開始支持此功能。要允許來自不同域的請求,只需將 @CrossOrigin 註解添加到 repository 中即可。

@CrossOrigin
@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository<WebsiteUser, Long> {}

因此,在從 REST 端點返回的每一條響應中,都會添加 Access-Control-Allow-Origin 標頭。

3. 創建 AngularJS 客户端

為了創建我們 CRUD 應用程序的前端,我們將使用 AngularJS – 一個廣為人知的 JavaScript 框架,它簡化了前端應用程序的創建。

為了使用 AngularJS,我們首先需要在我們調用為 users.html 的 HTML 頁面中包含 angular.min.js 文件。

<script 
  src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js">
</script>

接下來,我們需要創建一個 Angular 模塊、控制器和服務,這些組件將調用 REST 端點並顯示返回的數據。

這些組件將被放置在名為app.js的 JavaScript 文件中,並且還需要將其包含在users.html頁面中:

<script src="view/app.js"></script>

3.1. Angular 服務

首先,我們創建一個名為 UserCRUDService 的 Angular 服務,它將利用注入的 AngularJS $http 服務來向服務器發起調用。每個調用將被放置在單獨的方法中。

讓我們來看一下定義使用 /users/{userID} 端點通過 HTTP 請求檢索用户的方法:

app.service('UserCRUDService', [ '$http', function($http) {

    this.getUser = function getUser(userId) {
        return $http({
            method : 'GET',
            url : 'users/' + userId
        });
    }
} ]);

接下來,我們定義 addUser 方法,它向 /users URL 發送 POST 請求,並將用户值發送到 data 屬性中:

this.addUser = function addUser(name, email) {
    return $http({
        method : 'POST',
        url : 'users',
        data : {
            name : name,
            email: email
        }
    });
}

updateUser 方法與上一個方法類似,但它將包含一個 參數,併發出 PATCH 請求:

this.updateUser = function updateUser(id, name, email) {
    return $http({
        method : 'PATCH',
        url : 'users/' + id,
        data : {
            name : name,
            email: email
        }
    });
}

刪除 WebsiteUser 記錄的方法將發出一個 DELETE 請求:

this.deleteUser = function deleteUser(id) {
    return $http({
        method : 'DELETE',
        url : 'users/' + id
    })
}

最後,讓我們來查看獲取所有用户列表的方法:

this.getAllUsers = function getAllUsers() {
    return $http({
        method : 'GET',
        url : 'users'
    });
}

所有這些服務方法都將由一個 AngularJS 控制器調用。

3.2. Angular 控制器

我們將創建一個 UserCRUDCtrl Angular 控制器,該控制器將注入 UserCRUDService,並使用該服務的方法來獲取服務器響應、處理 successerror 情況,並設置 $scope 變量,其中包含響應數據,以便在 HTML 頁面上進行顯示。

讓我們來看一下 getUser() 函數,該函數調用 getUser(userId) 服務函數,並在成功和錯誤情況下定義兩個回調方法。如果服務器請求成功,則響應將保存到 user 變量中;否則,將處理錯誤消息:

app.controller('UserCRUDCtrl', ['$scope','UserCRUDService', 
  function ($scope,UserCRUDService) {
      $scope.getUser = function () {
          var id = $scope.user.id;
          UserCRUDService.getUser($scope.user.id)
            .then(function success(response) {
                $scope.user = response.data;
                $scope.user.id = id;
                $scope.message='';
                $scope.errorMessage = '';
            },
    	    function error (response) {
                $scope.message = '';
                if (response.status === 404){
                    $scope.errorMessage = 'User not found!';
                }
                else {
                    $scope.errorMessage = "Error getting user!";
                }
            });
      };
}]);

addUser() 函數將調用相應的服務函數並處理響應:

$scope.addUser = function () {
    if ($scope.user != null && $scope.user.name) {
        UserCRUDService.addUser($scope.user.name, $scope.user.email)
          .then (function success(response){
              $scope.message = 'User added!';
              $scope.errorMessage = '';
          },
          function error(response){
              $scope.errorMessage = 'Error adding user!';
              $scope.message = '';
        });
    }
    else {
        $scope.errorMessage = 'Please enter a name!';
        $scope.message = '';
    }
}

updateUser()deleteUser() 函數與上述函數類似:

$scope.updateUser = function () {
    UserCRUDService.updateUser($scope.user.id, 
      $scope.user.name, $scope.user.email)
      .then(function success(response) {
          $scope.message = 'User data updated!';
          $scope.errorMessage = '';
      },
      function error(response) {
          $scope.errorMessage = 'Error updating user!';
          $scope.message = '';
      });
}

$scope.deleteUser = function () {
    UserCRUDService.deleteUser($scope.user.id)
      .then (function success(response) {
          $scope.message = 'User deleted!';
          $scope.User = null;
          $scope.errorMessage='';
      },
      function error(response) {
          $scope.errorMessage = 'Error deleting user!';
          $scope.message='';
      });
}

最後,我們來定義一個檢索用户列表並將其存儲在 users 變量中的函數:

$scope.getAllUsers = function () {
    UserCRUDService.getAllUsers()
      .then(function success(response) {
          $scope.users = response.data._embedded.users;
          $scope.message='';
          $scope.errorMessage = '';
      },
      function error (response) {
          $scope.message='';
          $scope.errorMessage = 'Error getting users!';
      });
}

3.3. HTML 頁面

users.html 頁面將使用前一節中定義的控制器函數以及存儲變量。

首先,為了使用 Angular 模塊,我們需要設置 ng-app 屬性:

<html ng-app="app">

然後,為了避免每次使用控制器函數時都必須輸入 <em UserCRUDCtrl.getUser()</em>,我們可以將我們的 HTML 元素包裹在一個 <em div</em> 中,並設置 <em ng-controller</em> 屬性:

<div ng-controller="UserCRUDCtrl">

讓我們創建一個用於輸入和顯示 WebiteUser 對象值的表單,以便我們能夠對其進行操作。 這些表單項都將具有 ng-model 屬性,該屬性將它們的值綁定到屬性本身:

<table>
    <tr>
        <td width="100">ID:</td>
        <td><input type="text" id="id" ng-model="user.id" /></td>
    </tr>
    <tr>
        <td width="100">Name:</td>
        <td><input type="text" id="name" ng-model="user.name" /></td>
    </tr>
    <tr>
        <td width="100">Age:</td>
        <td><input type="text" id="age" ng-model="user.email" /></td>
    </tr>
</table>

<em id</em> 輸入字段綁定到<em user.id 變量上,例如,這意味着當輸入字段的值發生更改時,該值將被設置為 `<em user.id 變量中,反之亦然。

接下來,我們使用 ` 屬性來定義觸發每個 CRUD 控制器函數調用的鏈接:

<a ng-click="getUser(user.id)">Get User</a>
<a ng-click="updateUser(user.id,user.name,user.email)">Update User</a>
<a ng-click="addUser(user.name,user.email)">Add User</a>
<a ng-click="deleteUser(user.id)">Delete User</a>

最後,讓我們完全並按名稱顯示用户列表:

<a ng-click="getAllUsers()">Get all Users</a><br/><br/>
<div ng-repeat="usr in users">
{{usr.name}} {{usr.email}}

4. 結論

在本教程中,我們演示瞭如何使用 AngularJSSpring Data REST 規範創建 CRUD 應用程序。

要運行應用程序,可以使用命令 mvn spring-boot:run 並訪問 URL /users.html

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.