<commit_before># Pagination

Пока один пример и советы по использованию в Spring

1. Скачайте jar
2. Добавьте в библиотеку проекта
3. В конфигурации диспетчера добавьте бин

	``<bean id="paginationBuilder" class="com.artglorin.web.utils.PaginationBuilderImpl" factory-method="getInstance" scope="prototype"/>``

4. Добавьте зависимость в необходимый контроллер.

	`@Autowired`

	`private PaginationBuilder paginationBuilder;`

5. Инициализируйте параметры. Например в init методе @PostConstruct.

	> Совет. Если ваши сущности хранятся в базе данных, храните информацию об их количестве в переменной контроллера и проследите, чтобы в вашем коде при изменении количества сущностей, менялась переменная.

	`@PostConstruct`
	`public void init(){`
	    `...`
		`paginationBuilder.setTotalItemsCount(itemsService.count());`
		`...`
	`}`

6. Используйте в методе обработчике запросов.

	`@RequestMapping("/listItems")`
	`public String getItemsListView (@CookieValue(required = false, defaultValue = "10", value = "itemsListLise") Integer listSize,`
	                               `@RequestParam(value = "page", defaultValue = "1", required = false) Integer page) {`
		`Pagination pagination = paginationBuilder.setCurrentPageNumber(page).setItemsListSize(listSize).build();`
		`model.addAttribute("Pagination", pagination);`
		`int start = (page - 1) * listSize;`
		`int end = start + listSize;`
		`model.addAttribute("Items", itemsService.findBetween(start, end));`
		`return "some-view-name";`
	`}`

7. Используйте Pagination в ViewResolver. Пример для Thymeleaf & Bootstrap

	`<nav th:if="${Pagination}" role="navigation">`
	    `<ul id="pager" class="pager"  th:with="url ='@{/listitems?page=}">`
	    	    `<th:block th:if="${Pagination.existPreviousSet}">`
	            `<li class="previous">`
	                `<a th:href="@{${url} + ${Pagination.firstPageInSet - 1}}"> <span>&larr;</span> Older </a>`
                `</li>`
                `<li class="disabled"><a href="#">&hellip;</a></li>`
            `</th:block>`
            `<li th:each="page : ${Pagination.setPages}" th:class="${page == Pagination.currentPage}? active">`
                `<a th:href="@{${url} + ${page}}" th:text="${page}"></a>`
            `</li>`
            `<th:block th:if="${Pagination.existNextSet}">`
                `<li class="disabled"><a href="#">&hellip;</a></li>`
                `<li class="previous">`
                   `<a th:href="@{${url} + ${Pagination.lastPageInSet + 1}}">Newer <span aria-hidden="true">&rarr;</span> </a>`
               `</li>`
            `</th:block>`
	    `</ul>`
	`</nav>`<commit_msg>Стилистическая правка<commit_after># Pagination

Пока один пример и советы по использованию в Spring

1. Скачайте jar
2. Добавьте в библиотеку проекта
3. В конфигурации диспетчера добавьте бин

	``<bean id="paginationBuilder" class="com.artglorin.web.utils.PaginationBuilderImpl" factory-method="getInstance" scope="prototype"/>``

4. Добавьте зависимость в необходимый контроллер.

	`@Autowired`

	`private PaginationBuilder paginationBuilder;`

5. Инициализируйте параметры. Например в init методе @PostConstruct.

	> Совет. Если ваши сущности хранятся в базе данных, храните информацию об их количестве в переменной контроллера и проследите, чтобы в вашем коде при изменении количества сущностей, менялась переменная.

	`@PostConstruct`

	`public void init(){`

	    `...`

		`paginationBuilder.setTotalItemsCount(itemsService.count());`

		`...`

	`}`

6. Используйте в методе обработчике запросов.

	`@RequestMapping("/listItems")`

	`public String getItemsListView (@CookieValue(required = false, defaultValue = "10", value = "itemsListLise") Integer listSize,`

	                               `@RequestParam(value = "page", defaultValue = "1", required = false) Integer page) {`

		`Pagination pagination = paginationBuilder.setCurrentPageNumber(page).setItemsListSize(listSize).build();`

		`model.addAttribute("Pagination", pagination);`

		`int start = (page - 1) * listSize;`

		`int end = start + listSize;`

		`model.addAttribute("Items", itemsService.findBetween(start, end));`

		`return "some-view-name";`

	`}`

7. Используйте Pagination в ViewResolver. Пример для Thymeleaf & Bootstrap

	`<nav th:if="${Pagination}" role="navigation">`

	    `<ul id="pager" class="pager"  th:with="url ='@{/listitems?page=}">`

	    	    `<th:block th:if="${Pagination.existPreviousSet}">`

	            `<li class="previous">`

	                `<a th:href="@{${url} + ${Pagination.firstPageInSet - 1}}"> <span>&larr;</span> Older </a>`

                `</li>`

                `<li class="disabled"><a href="#">&hellip;</a></li>`

            `</th:block>`

            `<li th:each="page : ${Pagination.setPages}" th:class="${page == Pagination.currentPage}? active">`

                `<a th:href="@{${url} + ${page}}" th:text="${page}"></a>`

            `</li>`

            `<th:block th:if="${Pagination.existNextSet}">`

                `<li class="disabled"><a href="#">&hellip;</a></li>`

                `<li class="previous">`

                   `<a th:href="@{${url} + ${Pagination.lastPageInSet + 1}}">Newer <span aria-hidden="true">&rarr;</span> </a>`

               `</li>`

            `</th:block>`

	    `</ul>`

	`</nav>`
{'fraction_non_alphanumeric': 0.1723744292237443, 'fraction_numerical': 0.004946727549467275, 'mean_word_length': 3.410234899328859, 'pattern_counts': {'":': 0, '<': 69, '<?xml version=': 0, '>': 71, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '557657', 'n_tokens_mistral': 1903, 'n_tokens_neox': 1895, 'n_words': 376}