Три примера постраничного вывода на Java, PHP и ColdFusion Script

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

Постраничный вывод нужен практически в каждом веб приложении, которое работает с массивами информации.

Постановка задачи

Необходимо получить строчку со ссылками на все страницы. Каждая ссылка должна включать в себя номер страницы плюс некий добавочный запрос. Текущая страница должна быть выделена. Что у нас есть. Запрос к базе данных выдал нам безумное количество наименований товара. Количество их на странице жестко задал начальник. Нетрудно сделать так, чтобы это количество задавал сам пользователь. Выбор пользователя просто хранить в сессии. Не суть. И больше нам ничего не надо. Имеем:

 // Количество наименований товара
 // То количество наименований, которое получили в результате запроса к БД
 $totalItems;
 //число записей на страницу
 $itemsPerPage;
 // URL адрес, с которого будет начинаться каждая ссылка
 // на страницу
 $pageLocation;
 // добавочный параметр запроса.
 // Он будет добавлен к каждой ссылке. Формат: &key=value&key1=value1...
 $addToRequest
 // номер текущей страницы
 // на входе функции номер первой страницы = 0
 $currentPageNumber; 

Результатом работы программы станет строчка вида:

 <a href='/my_test/?page=1&f=34&ff=90'>1</a>,
 <a href='/my_test/?page=2&f=34&ff=90'>2</a>,
 <a href='/my_test/?page=3&f=34&ff=90'>3</a>,
 <strong>4</strong>,
 <a href='/my_test/?page=5&f=34&ff=90'>5</a>,
 <a href='/my_test/?page=6&f=34&ff=90'>6</a>,
 <a href='/my_test/?page=7&f=34&ff=90'>7</a>,
 <a href='/my_test/?page=8&f=34&ff=90'>8</a>,...,
 <a href='/my_test/?page=500&f=34&ff=90'>500</a>

Вот как будет выглядеть эта же строчка на 60 странице:

 <a href='/my_test/?page=1&f=34&ff=90\'>1</a>...,
 <a href='/my_test/?page=57&f=34&ff=90'>57</a>,
 <a href='/my_test/?page=58&f=34&ff=90'>58</a>,
 <a href='/my_test/?page=59&f=34&ff=90'>59</a>,
 <a href='/my_test/?page=60&f=34&ff=90'>60</a>,
 <strong>61</strong>,
 <a href='/my_test/?page=62&f=34&ff=90'>62</a>,
 <a href='/my_test/?page=63&f=34&ff=90'>63</a>,
 <a href='/my_test/?page=64&f=34&ff=90'>64</a>,
 <a href='/my_test/?page=65&f=34&ff=90'>65</a>,...,
 <a href='/my_test/?page=500&f=34&ff=90'>500</a>

Решение

Одним из вариантов функции для создания такой строчки может быть следующий:

Java

 /**
 * Prepare paging string
 * 
 * @param currentPageNumber
 * @param totalItems
 * @param itemsPerPage
 * @param pageLocation
 * @param addToRequest
 * @return
 */
 public static String preparePagingString(int currentPageNumber, 
  int totalItems, int itemsPerPage, String pageLocation, 
  String addToRequest) {

  String ret = "";
  if (totalItems <= itemsPerPage)
  return ret;

  int totalPages = (totalItems / itemsPerPage);
  if (totalItems % itemsPerPage != 0)
   totalPages++;
  if(currentPageNumber >= totalPages)
   currentPageNumber = totalPages-1;
  if (totalItems <= currentPageNumber * itemsPerPage)
   currentPageNumber = 1;
  int start = currentPageNumber - 4;
  if (start < 0)
   start = 0;
  int end = currentPageNumber + 5;
  if (end >= totalPages)
   end = totalPages;

  if (start > 0){
   ret += "<a href='" + pageLocation + "?page=1" + addToRequest + "\'>1</a> ";
  }
  if (start > 1)
   ret += "..., ";
  for (int i = start; i < end; i++) {
   if (i == currentPageNumber){
    ret += "<strong>" + (i + 1) + "</strong>";
   }else{
    ret += "<a href='" + pageLocation + "?page=" + (i + 1) + addToRequest + "'>" + (i + 1) + "</a>";
   }
   if (i + 1 < totalPages)
    ret += ", ";
   }
   if (end + 1 < totalPages)
    ret += "..., ";
   if (end < totalPages) {
    if (totalPages == currentPageNumber){
     ret += "<strong>" + totalPages + "</strong>";
    }else{
     ret += "<a href='" + pageLocation + "?page=" + totalPages + addToRequest + "'>" + totalPages + "</a>";
    }
   }
   ret += "  ";
   return ret;
 }

Вызов функции производится следующим образом:

 preparePagingString(0,20,4,"/my_test/","&f=34&ff=90");

Страница:

  • 1

  • 2