Vienna

깜짝과제3) 웹페이지 페이징 처리 본문

그외

깜짝과제3) 웹페이지 페이징 처리

아는개발자 2023. 6. 6. 21:42

◇ 문제

웹사이트에서 대부분의 게시판(공지사항등)들은 콘텐츠를 모두 보여줄 수 없기 때문에 페이징 처리를 합니다. (아래 이미지 참조) 예를 들어, 전체 글의 개수가 127개라고 하고 한 페이지에서 보여지는 글의 목록이 10개라고 할때 페이지 블럭의 개수도 10개가 보여진다고 할때 전체 페이지의 모양은 아래와 같습니다.

이러한 페이지네비게이션의 html 코드를 출력하는 페이지네비게이션을 구현해보세요.

 

초기에 결정되는 값들은

  • 전체 개시글 수
  • 한 페이지당 보여지는 글의 수
  • 페이지네비게이션에서 보여주는 블럭수
  • 현재 페이지번호

 

현재 페이지번호에 해당하는 번호는 다른 페이지번호와 구분되어야 합니다.

출력예제
테스트 코드 예시 1
테스트 코드 예시 2
테스트 코드 예시 3


import java.io.*;

public class Main {


    static final String newLine = "\r\n";
    static final String open = "<a href='#'>";
    static final String close = "</a>";

    public static void main(String[] args) throws IOException {

        long totalCount = 127;
        long pageIndex = -3;

        Pager pager =new Pager(totalCount);
        System.out.println(pager.html(pageIndex));
    }

    static class Pager{
        private final int countPerPage = 10;
        private final int pagePerOnce = 10;

        private long totalCount;

        public Pager(long totalCount){
            this.totalCount = totalCount;
        }

        public String html(long pageIndex){
            StringBuilder sb =new StringBuilder();

            // 총 페이지 수
            long totalPage = totalCount/countPerPage+(totalCount%countPerPage == 0 ? 0 : 1);
            if(pageIndex<=0){
                pageIndex = 1;
            }
            else if(pageIndex>totalPage)
                pageIndex = totalPage;

            final long start = pageIndex / pagePerOnce*pagePerOnce+1;
            final long end = Math.min(start+pagePerOnce -1, totalPage);

            sb.append(open).append("[").append("처음").append("]").append(close);
            sb.append(newLine).append(open).append("[").append("이전").append("]").append(close);
            sb.append(newLine);

            for(long i = start; i<=end; i++){
                sb.append(newLine).append(open);
                if(i == pageIndex){
                    sb.insert(sb.length()-1, " class='on'");
                }
                sb.append(i).append(close);
            }

            sb.append(newLine);
            sb.append(newLine).append(open).append("[").append("다음").append("]").append(close);
            sb.append(newLine).append(open).append("[").append("마지막").append("]").append(close);

            return sb.toString();
        }
    }
}

Comments