Как сделать пагинацию java

Добавил пользователь Владимир З.
Обновлено: 18.09.2024

Прикрутил к простому CRUD приложению пейджинг следующим образом:

На этой же странице кроме списка юзеров есть форма для их добавления/правки, ну и в таблице юзеров кнопки для каждой позиции:

На этом этапе все работает, список разбит на страницы, навигация работает, НО находясь например на 2ой странице удаляем юзера

удаление проходит успешно, но отображение списка юзеров сбрасывается на 1ую страницу. То же самое и с операциями добавления/правки. Понятно, ведь в каждом случае

без параметра запроса с номером страницы.

Я пока еще не силен ни в JSP, ни в Spring. Подскажите, как этот параметр можно передавать и оперировать им в контроллере?

Обширный взгляд на то, как реализовать простой API с pagination с spring и как потреблять его с AngularJS и UI Grid.

1. Обзор

В этой статье мы сосредоточимся в основном на реализации pagination стороны сервера в Весенний REST API и простой передний конец AngularJS.

Мы также исследуем широко используемую сетку таблицы в Angular под названием UI Grid .

2. Зависимости

Здесь мы подробно различные зависимости, которые необходимы для этой статьи.

2.1. JavaScript

Для того, чтобы Angular UI Grid работал, нам понадобится ниже скрипты, импортированные в нашем HTML.

2.2. Мавен

Для нашего бэкэнда мы будем использовать Весенняя загрузка , так что нам понадобится ниже зависимостей:

Примечание: Другие зависимости не были указаны здесь, для полного списка, проверьте полный пом.xml в GitHub проект.

3. О заявке

Приложение является простым студенческим каталогом приложение, которое позволяет пользователям видеть детали студента в paginated таблице сетки.

Приложение использует Весенняя загрузка и работает на встроенном сервере Tomcat со встроенной базой данных.

Наконец, на стороне API вещей, Есть несколько способов сделать pagination, описанные в REST Pagination весной статьи здесь – что настоятельно рекомендуется чтение в сочетании с этой статьей.

Наше решение здесь простое – иметь информацию о paging в запросе URI следующим образом: /студент/получить?page-размер 2 .

4. Клиентская сторона

Во-первых, нам нужно создать логику на стороне клиента.

4.1. UI-Grid

Наша индекс.html будет иметь импорт нам нужно и простое осуществление таблицы сетки:

Давайте более подробно рассмотрим код:

  • ng-app – это угловая директива, которая загружает модуль приложение . Все элементы под ним будут частью приложение модуль
  • ng-контроллер – это угловая директива, которая загружает контроллер СтуденческаяКтрл с псевдонимом vm. Все элементы под ним будут частью СтуденческаяКтрл контроллер
  • ui-сетка – это угловая директива, которая принадлежит Angular ui-сетка и использует gridOptions в качестве настроек по умолчанию, gridOptions объявляется в соответствии с $scope в приложение.js

4.2. Модуль AngularJS

Давайте сначала определим модуль в приложение.js :

Мы объявили приложение модуль, и мы ввели ui.grid для включения функциональности UI-Grid; мы также вводили ui.grid.pagination для поддержки pagination.

Далее мы определим контроллер:

Давайте теперь посмотрим на пользовательские настройки pagination в $scope.gridOptions :

  • paginationPageSizes – определяет доступные параметры размера страницы
  • paginationPageSize – определяет размер страницы по умолчанию
  • включитьКолумнМенус – используется для включения/отключения меню в столбцах
  • использованиеИстерналПагинация – требуется, если вы paginating на стороне сервера
  • колонкаДефы — имена столбца, которые будут автоматически отображены на объект JSON, возвращенный с сервера. Имена поля в объекте JSON, возвращенные с сервера, и определенное имя столбца должны соответствовать.
  • onRegisterApi – возможность регистрации публичных методов событий внутри сетки. Здесь мы зарегистрировали gridApi.pagination.on.paginationИзмеленные чтобы сообщить UI-Grid, чтобы вызвать эту функцию всякий раз, когда страница была изменена.

5. Бэкэнд и API

5.1. Служба RESTful

Вот простая реализация API RESTful с поддержкой pagination:

@RestController была введена весной 4.0 как удобная аннотация, которая неявно @Controller и @ResponseBody.

Для нашего API, мы объявили его принять два параметра, которые страница и размер, который также будет определять количество записей, чтобы вернуться к клиенту.

Мы также добавили простую проверку, которая бросит MyResourceNotFoundException если число страниц превышает общее количество страниц.

5.2. Внедрение службы

Наш сервис просто вернет записи на основе страницы и размера, предоставленных контроллером:

5.3. Реализация репозитория

Для нашего уровня настойчивости мы используем встроенную базу данных и Spring Data JPA.

Во-первых, мы должны настроить нашу настойчивость config:

Настойчивость config проста – у нас есть @EnableJpaRepositories сканировать указанный пакет и найти наши интерфейсы репозитория Spring Data JPA.

У нас есть @ComponentScan здесь, чтобы автоматически сканировать для всех бобов, и мы есть @EntityScan (от Spring Boot) для сканирования классов сущностей.

Мы также объявили наш простой источник данных – с помощью встроенной базы данных, которая будет работать скрипт S’L, предусмотренный при запуске.

Теперь пришло время создать наш репозиторий данных:

Это в основном все, что нам нужно сделать здесь; если вы хотите пойти глубже в том, как настроить и использовать очень мощный Весенние данные JPA, безусловно, читать руководство к нему здесь .

6. Запрос и ответ на вопросы о палации

При вызове API , JSON ответ будет выглядеть что-то вроде этого:

Одна вещь, чтобы заметить здесь, что сервер возвращает org.springframework.data.domain.Page DTO, упаковка наших Студенческие ресурсы.

  • последний – установлен на истинное если это последняя страница в противном случае ложные
  • первый – установлен на истинное если это первая страница в противном случае ложные
  • totalElements – общее количество строк/записей. В нашем примере мы передали это ui-сетка варианты $scope.gridOptions.totalItems определить, сколько страниц будет доступно
  • totalPages – общее количество страниц, которые были получены из ( totalElements/размер )
  • размер – количество записей на страницу, это было передано от клиента через param размер
  • номер – номер страницы, отправленный клиентом, в нашем ответе номер 0, потому что в нашем бэкэнде мы используем массив Студенческие s, который является нулевым индексом, так что в нашем бэкэнде, мы decrement номер страницы на 1
  • сортировать – параметр сортировки страницы
  • numberOfElements – количество строк/записей для страницы

7. Тестирование pagination

Теперь давайте навеем тест на нашу логику pagination, используя RestAssured ; чтобы узнать больше о RestAssured Вы можете взглянуть на эту учебный .

7.1. Подготовка теста

Для удобства развития нашего тестового класса мы добавим статический импорт:

Далее мы наберем тест с поддержкой Spring:

@SpringApplicationConfiguration помогает Весна знать, как загрузить ПриложениеКонтекст, в этом случае мы использовали Применение.java настроить наши ПриложениеКонтекст.

@WebAppConfiguration был определен, чтобы сказать Весна, что ПриложениеКонтекст загрузка должна быть WebApplicationКонтекст.

И @IntegrationTest был определен, чтобы вызвать запуск приложения при запуске теста, это делает наши услуги REST доступными для тестирования.

7.2. Тесты

Вот наш первый тестовый случай:

Этот тестовый случай выше, чтобы проверить, что при странице 1 и размер 2 передается в службу REST JSON содержание возвращается с сервера должны иметь имена Брайан и Бен.

Давайте вскроем тестовый случай:

  • учитывая – часть RestAssured и используется для начала построения запроса, вы также можете использовать с ()
  • получить – часть RestAssured и если используется триггеры получить запрос, используйте пост () для запроса на почту
  • имеетItems – часть hamcrest, который проверяет, если значения имеют какой-либо матч

Добавим еще несколько тестовых случаев:

Этот тест утверждает, что, когда точка на самом деле называется OK ответ получен:

Этот тест утверждает, что при запрашиваемом размере страницы в два страницы размер возвращен на самом деле составляет два:

Этот тест утверждает, что при первом использовании ресурсов значение имени первой страницы верно.

Есть еще много тестов в репозитории, так что определенно посмотрите на GitHub проект.

8. Заключение

Эта статья проиллюстрировала, как реализовать сетку таблиц данных с помощью UI-Grid в AngularJS и как реализовать требуемую pagination стороны сервера.

Реализация этих примеров и тестов можно найти в Проект GitHub . Это проект Maven, поэтому он должен быть легким для импорта и запуска, как она есть.

Это седьмая из серии статей о настройке защищенного веб-сервиса RESTful с использованием Spring 3.1 и Spring Security 3.1 с настройкой на основе Java. Эта статья будет посвящена реализации нумерации страниц в веб-сервисе RESTful.

  • Часть 1. Начальная загрузка веб-приложения с помощью Spring 3.1 и конфигурации на основе Java
  • Часть 2. Создание веб-службы RESTful с использованием Spring 3.1 и конфигурации на основе Java
  • Часть 3. Защита веб-службы RESTful с помощью Spring Security 3.1
  • Часть 4. Обнаружение веб-службы RESTful
  • Часть 5. Обнаружение службы REST с помощью Spring
  • Часть 6. Базовая и дайджест-проверка подлинности для службы RESTful с Spring Security 3.1

Первый вопрос при проектировании нумерации страниц в контексте архитектуры RESTful заключается в том, следует ли считать страницу реальным ресурсом или просто представлением ресурсов . Если рассматривать саму страницу как ресурс, возникает множество проблем, таких как невозможность уникальной идентификации ресурсов между вызовами. Это в сочетании с тем фактом, что вне контекста RESTful, страницу нельзя считать надлежащей сущностью, но держатель, который создается при необходимости, делает выбор простым: страница является частью представления .

Следующий вопрос в дизайне нумерации страниц в контексте REST — где включить информацию о поисковом вызове:

Принимая во внимание, что страница не является ресурсом , кодирование информации о странице в URI больше не вариант.

Информация о странице в запросе URI

Кодирование информации подкачки в запросе URI является стандартным способом решения этой проблемы в службе RESTful. Этот подход, однако, имеет один недостаток — он врезается в пространство запросов для реальных запросов:

/ Foo? страница = 1 & размер = 10

Контроллер

Теперь для реализации — Spring MVC Controller для разбивки на страницы прост:

Обнаруживаемость для пагинации REST

В REST Обнаружение является сквозной задачей , применимой не только к конкретным операциям, но и к типам операций. Например, каждый раз при создании ресурса URI этого ресурса должен быть обнаружен клиентом. Поскольку это требование относится к созданию ЛЮБОГО ресурса, его следует рассматривать отдельно и отделить от основного потока контроллера.

предыдущей статье, посвященной Обнаруживаемости сервиса RESTful. В случае разбиения на страницы событие — PaginatedResultsRetrievedEvent — было запущено в контроллере, и обнаружение достигается в слушателе для этого события:

Тест вождения Пагинация

Как основная логика разбиения на страницы, так и обнаруживаемость должны быть подробно описаны в небольших целенаправленных интеграционных тестах; Как и в предыдущей статье , библиотека с гарантированным отдыхом используется для использования службы REST и проверки результатов.

Вот несколько примеров тестов на интеграцию страниц; для полного набора тестов проверьте проект github (ссылка в конце статьи):

Тест вождения Pagination Обнаружение

Тестирование обнаруживаемости нумерации страниц относительно просто, хотя есть много оснований для покрытия. Тесты сфокусированы на положении текущей страницы в навигации и различных URI, которые должны быть обнаружены в каждой позиции:

Это всего лишь несколько примеров интеграционных тестов, использующих сервис RESTful.

Получение всех ресурсов

По той же теме разбивки на страницы и возможности обнаружения должен быть сделан выбор, если клиенту разрешено извлекать все ресурсы в системе одновременно или если клиент ДОЛЖЕН запросить их разбиение на страницы.

Если сделан выбор, что клиент не может извлечь все Ресурсы одним запросом, и разбиение на страницы не является обязательным, но требуется, тогда для ответа на запрос get all доступно несколько параметров.

Один из вариантов — вернуть 404 ( не найдено ) и использовать заголовок ссылки, чтобы сделать первую страницу доступной для обнаружения:

Другой вариант — вернуть перенаправление — 303 ( см. Другое ) — на первую страницу нумерации страниц.

Третий вариант — вернуть 405 ( метод не разрешен ) для запроса GET.

Вывод

В этой статье описывается реализация Pagination в RESTful-сервисе с Spring, обсуждается, как реализовать и протестировать Discoverability. Для полной реализации нумерации страниц проверьте проект github.

Если вы читаете это далеко, вы должны следовать за мной в твиттере здесь .

Ссылка: REST Pagination весной от нашего партнера JCG Евгения Параскива в блоге baeldung

Я пытаюсь реализовать разбиение на страницы. У меня два стола, учитель и ученик. На каждого учителя приходится несколько учеников. Теперь у меня есть список TeacherNames, и для каждого учителя я должен найти всех его учеников, добавить их в список и, наконец, вернуть его. Я также получаю номер и размер страницы в качестве входных данных.

Я знаю, как реализовать разбиение на страницы, если мне нужно было запрашивать только в TeacherRepo. Но я не могу понять, как я это сделаю, когда есть вложение.

1 ответ

Я предполагаю, что у вас есть отношения @ManyToMany между учеником и учителем. В противном случае вам необходимо создать его, прежде чем продолжить. Пример кода для создания отношения

Теперь в репозитории учителей добавьте метод, объединяющий ученика и учителя.

Вызовите этот метод репо в своем классе обслуживания

Таким образом, при разбивке на страницы будут возвращены записи 4 студентов.

Примечание. Вы можете добавить условия, пагинации, детали сортировки в соответствии с вашими требованиями.

Читайте также: