В статье представлен рецепт создания
одностраничного приложения с AngularJS & Spring MVC, где для выполнения транзакций на сервере с использованием RESTful API требуются разные страницы
. Демонстрация создана на этой странице,
http://hello-angularjs.appspot.com/angularjs-single-page-app-restful-apis . Примеры кода и связанные понятия представлены для следующих требований одностраничного приложения:
- Первоначально одна страница загружается с боковой навигацией.
- Нажатие на боковую навигацию загружает новое представление (данные) с сервера, используя RESTful API с использованием ngResource, службы $ resource с методом действия «query»
- Щелчок по ссылке на отдельные элементы загружает связанные данные с сервера, снова используя API RESTful с использованием ngResource, службы $ resource с методом действия «get».
- Отправка набора данных использует API RESTful и отправляет данные на сервер для сохранения. Здесь используется служба $ resource с методом действия save.
В
демо — приложение представляет тривиальное приложение , которое позволяет пользователям выполнять некоторые из следующих:
- Создать новых пользователей
- Получить всех пользователей
- Получить пользователей по идентификатору
В этом примере создается одна служба пользователя, которая выполняет транзакцию RESTful. Эта служба пользователя используется в нескольких различных контроллерах, используемых для загрузки / управления различными представлениями. Ниже приведены ключи для создания одностраничного приложения AngularJS, которое использует API-интерфейсы RESTful:
- Угловые зависимости модуля
- Код маршрутизации, который определяет маршруты для разных ссылок.
- Код для управления транзакциями с RESTful API. Я создал пользовательский сервис User, который предоставляет API для выполнения транзакций с RESTful API.
- Код контроллера, который определяет, как данные будут извлекаться / обрабатываться в каждом представлении
- Код на стороне сервера для получения запроса RESTful API и отправки соответствующего ответа
Зависимости угловых модулей
Ниже приведены два разных модуля, которые необходимо будет включить при создании приложения:
- ngRoute
- ngResource
Ниже приведен пример кода:
var userApp = angular.module("userApp", [ 'ngRoute', 'ngResource' ]);
Вы также должны включить в элемент следующее:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular-route.js"></script> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular-resource.js"></script>
Код маршрутизации
Ниже представлен код маршрутизации, который определяет, как будет обрабатываться каждая ссылка / путь (controller, templateURL).
userApp.config(function($routeProvider) { $routeProvider.when('/users/new', { controller : 'NewUserCtrl', templateUrl : 'views/newuser.html' }).when('/users/:userId', { controller : 'UsersByIdCtrl', templateUrl : 'views/userbyid.html' }).when('/users', { controller : 'UsersCtrl', templateUrl : 'views/users.html' }).otherwise({ controller : 'SpaCtrl', templateUrl: 'views/spahome.html' }); });
Сервис пользователя — транзакции с RESTful API
Следующий код используется для обслуживания пользователей с использованием заводского рецепта AngularJS. Этот userservice внутренне создает экземпляр класса User, передавая службу $ resource его функции-конструктору. Обратите внимание, что $ scope передается отдельным API / методам и что значение для модели устанавливается в каждом API. После обновления значения модели появляются в пользовательском интерфейсе.
userApp.factory( 'userservice', [ '$resource', function( $resource ){ return new User( $resource ); }] ); function User( resource ) { this.resource = resource; this.createUser = function ( user, scope ) { // // Save Action Method // var User = resource('/users/new'); User.save(user, function(response){ scope.message = response.message; }); } this.getUser = function ( id, scope ) { // // GET Action Method // var User = resource('/users/:userId', {userId:'@userId'}); User.get( {userId:id}, function(user){ scope.user = user; }) } this.getUsers = function( scope ) { // // Query Action Method // var Users = resource('/users'); Users.query(function(users){ scope.users = users; }); } }
AngularJS Controller Code for Different Views
// Controller when the main page/view loads
userApp.controller("SpaCtrl", [ '$scope', function($scope) {
} ]);
// Controller for All Users View
userApp.controller("UsersCtrl", [ '$scope','userservice', function($scope, userservice) {
userservice.getUsers( $scope );
} ]);
// Controller for New User View
userApp.controller("NewUserCtrl", [ '$scope','userservice', function($scope, userservice) {
userservice.getUsers( $scope );
$scope.createNewUser = function(){
var newuser = { 'firstname':$scope.firstname, 'lastname': $scope.lastname, 'address':$scope.address, 'email':$scope.email };
// Call UserService to create a new user
//
userservice.createUser ( newuser, $scope );
// Push new user to existing table column
//
$scope.users.push( newuser );
// Reset fields values
//
$scope.firstname='';
$scope.lastname='';
$scope.address='';
$scope.email='';
};
} ]);
// Controller for Individual User View
userApp.controller("UsersByIdCtrl", [ '$scope','userservice', '$routeParams', function($scope, userservice, $routeParams) {
userservice.getUser($routeParams.userId, $scope);
} ]);
Spring MVC Controller Code for RESTful API
Following demonstrates the Spring MVC Controller code for three different RESTful APIs with URL written as part of RequestMapping value parameter:
- All Users (/users)
@RequestMapping(value = "/users", method = RequestMethod.GET) public @ResponseBody String getAllUsers( ModelMap model ) { String jsonData = "[{\"id\":\"3253123\",\"firstname\":\"Chris\",\"lastname\":\"Johnson\",\"address\":\"211, Geoffrey Drive\",\"city\":\"Newark\",\"phone\":\"999-888-6666\",\"email\":\"[email protected]\"},{\"id\":\"67643837\",\"firstname\":\"Bill\",\"lastname\":\"Derkson\",\"address\":\"201, Sleepy Hollow Drive\",\"city\":\"Newark\",\"phone\":\"999-777-2222\",\"email\":\"[email protected]\"}]"; return jsonData; }
- New Users (/users/new)
@RequestMapping(value = "/users/new", method = RequestMethod.POST) public @ResponseBody String createNewUser( @RequestBody User user ) { // // Code processing the input parameters // String response = "{\"message\":\"Created New User - firstname: " + user.getFirstname() + ", lastname: " + user.getLastname() + ", address: " + user.getAddress() + ", email: " + user.getEmail()+"\"}"; return response; }
- User By Id (/users/{id}
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET) public @ResponseBody String getUsersById( @PathVariable("id") long userId ) { // // Code processing the input parameters // String response = "{\"id\":\""+ userId + "\",\"firstname\":\"FirstName\",\"lastname\":\"LastName\",\"address\":\"Some Address\",\"age\":\"SomeNo\",\"email\":\"[email protected]\"}"; return response; }