web developer

[egov] egovFramework 페이지네이션 기능 본문

Framework/Egovframework [spring]

[egov] egovFramework 페이지네이션 기능

trueman 2024. 8. 13. 10:36
728x90
728x90

1. 개요


 

  • PaginationInfo
    페이징 처리를 위한 데이터들을 담고 있는 빈 클래스인데, Tag 클래스에서 여기 담긴 정보를 기반으로 페이징을 렌더링한다.

  • PaginationRenderer
    포맷에 따라 페이징을 렌더링하는 역할을 담당한다.

  • PaginationManager
    어떤 PaginationRenderer를 사용할지를 담당한다. 렌더링에 필요한 데이터는 PaginationInfo에 담겨 있다.

2. PaginationTag


PaginationInfo는 페이징 처리를 위한 데이터들을 담고 있는 빈 클래스인데, Tag 클래스에서 여기 담긴 정보를 기반으로 페이징을 렌더링한다.

/*
 * Copyright 2008-2009 MOPAS(Ministry of Public Administration and Security).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package egovframework.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.support.RequestContextUtils;

import egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationManager;
import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationRenderer;

/**
 *PaginationTag.java
 *<p><b>NOTE:</b><pre> 페이징을 위한 Tag class .
 * 실제 페이징을 위한 작업은 PaginationRenderer에게 위임한다.
 * 어떤 PaginationRenderer를 사용할지는 PaginationManager에게 위임하는데, PaginationManager는 빈설정 파일의 정보와
 * 태그의 type 속성값을 비교하여 PaginationRenderer을 결정한다. 
 * </pre>
 * @author 실행환경 개발팀 함철
 * @since 2009.06.01
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *   
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2009.05.30  함철            최초 생성
 *
 * </pre>
 */
public class PaginationTag extends TagSupport {
	
    private static final long serialVersionUID = 1L;

    private PaginationInfo paginationInfo;
    private String type;
    private String jsFunction;

    public int doEndTag() throws JspException{
		
        try {

            JspWriter out = pageContext.getOut();

            PaginationManager paginationManager;

            // WebApplicationContext에 id 'paginationManager'로 정의된 해당 Manager를 찾는다.
            WebApplicationContext ctx = RequestContextUtils.getWebApplicationContext(pageContext.getRequest(), pageContext.getServletContext());

            if(ctx.containsBean("paginationManager")){
                paginationManager = (PaginationManager) ctx.getBean("paginationManager");
            }else{
                //bean 정의가 없다면 DefaultPaginationManager를 사용. 빈설정이 없으면 기본 적인 페이징 리스트라도 보여주기 위함.
                paginationManager = new DefaultPaginationManager();
            }

            PaginationRenderer paginationRenderer = paginationManager.getRendererType(type);
            String contents = paginationRenderer.renderPagination(paginationInfo, jsFunction);
            out.println(contents);
            return EVAL_PAGE;

        } catch (IOException e) {
            throw new JspException();
        }
    }

    public void setJsFunction(String jsFunction) {
        this.jsFunction = jsFunction;
    }

    public void setPaginationInfo(PaginationInfo paginationInfo) {
        this.paginationInfo = paginationInfo;
    }

    public void setType(String type){
        this.type = type;
    }
}

 

egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo의 기본 프로퍼티(필드)는 아래와 같다.

사용자입력여부가 yes인 프로퍼티들은 Controller에서 직접 해당 setter에 값을 넣어줘야 하며, no인 프로퍼티인 값들은 사용자가 입력한 다른 프로퍼티 값으로 자동계산되는 프로퍼티들이다.

이름 설명
currentPageNo 현재 페이지 번호
recordCountPerPage 한 페이지당 게시되는 게시물 건 수
pageSize 페이지 리스트에 게시되는 페이지 건수
totalRecordCount 전체 게시물 건 수
totalPageCount 페이지 개수
firstPageNoOnPageList 페이지 리스트의 첫 페이지 번호
lastPageNoOnPageList 페이지 리스트의 마지막 페이지 번호
firstRecordIndex 페이징 SQL의 조건절에 사용되는 시작 rownum
lastRecordIndex 페이징 SQL의 조건절에 사용되는 마지막 rownum
이름 입력여부 계산공식
currentPageNo yes  
recordCountPerPage yes  
pageSize yes  
totalRecordCount yes  
totalPageCount no totalPageCount =
((totalRecordCount-1)/recordCountPerPage) + 1
firstPageNoOnPageList no firstPageNoOnPageList =
((currentPageNo-1)/pageSize)*pageSize + 1
lastPageNoOnPageList no lastPageNoOnPageList = firstPageNoOnPageList+pageSize-1
if(lastPageNoOnPageList>totalRecordCount){
   lastPageNoOnPageList=totalPageCoun
t}
firstRecordIndex no firstRecordIndex =
(currentPageNo - 1) * recordCountPerPage
lastRecordIndex no lastRecordIndex =
currentPageNo * recordCountPerPage

Presentation/egovframework.rte.ptl.mvc/src/main/java/egovframework/rte/ptl/mvc/tags/ui/pagination/PaginationInfo.java

더보기
/*
 * Copyright 2008-2009 MOPAS(Ministry of Public Administration and Security).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package egovframework.rte.ptl.mvc.tags.ui.pagination;

/**
 * PaginationInfo.java
 * <p><b>NOTE:</b><pre>
 *                페이징 처리를 위한 데이터가 담기는 빈.
 *                페이징 처리에 필요한 데이터를 Required Fields, Not Required Fields 로 나누었다.
 *                
 *                Required Fields
 *                : 사용자가 입력해야 하는 필드값이다.
 *                currentPageNo : 현재 페이지 번호.
 *                recordCountPerPage : 한 페이지당 게시되는 게시물 건 수.
 *                pageSize : 페이지 리스트에 게시되는 페이지 건수.
 *                totalRecordCount : 전체 게시물 건 수.
 *                
 *                Not Required Fields
 *                : 사용자가 입력한 Required Fields 값을 바탕으로 계산하여 정해지는 값이다.
 *                totalPageCount: 페이지 개수.
 *                firstPageNoOnPageList : 페이지 리스트의 첫 페이지 번호.
 *                lastPageNoOnPageList : 페이지 리스트의 마지막 페이지 번호.
 *                firstRecordIndex : 페이징 SQL의 조건절에 사용되는 시작 rownum. 
 *                lastRecordIndex : 페이징 SQL의 조건절에 사용되는 마지막 rownum.
 *                
 *                페이징 Custom 태그인 &lt;ui:pagination&gt; 사용시에 paginationInfo 필드에 PaginationInfo 객체를 값으로 주어야 한다.
 *                </pre>
 *<pre class="code">
 *&lt;ui:pagination paginationInfo = "${paginationInfo}"
 *     type="image"
 *     jsFunction="linkPage"
 *&gt;
 *</pre>                
 * 
 * @author 실행환경 개발팀 함철
 * @since 2009.06.01
 * @version 1.0
 * @see
 *
 * <pre>
 * << 개정이력(Modification Information) >>
 *   
 *   수정일      수정자           수정내용
 *  -------    --------    ---------------------------
 *   2009.05.30  함철            최초 생성
 *
 * </pre>
 */
public class PaginationInfo {
		
	/**
	 * Required Fields
	 * - 이 필드들은 페이징 계산을 위해 반드시 입력되어야 하는 필드 값들이다.  
	 * 
	 * currentPageNo : 현재 페이지 번호
	 * recordCountPerPage : 한 페이지당 게시되는 게시물 건 수
	 * pageSize : 페이지 리스트에 게시되는 페이지 건수,
	 * totalRecordCount : 전체 게시물 건 수. 
	 */
	
	private int currentPageNo;
	private int recordCountPerPage;
	private int pageSize;
	private int totalRecordCount;
	
	public int getRecordCountPerPage() {
		return recordCountPerPage;
	}
	
	public void setRecordCountPerPage(int recordCountPerPage) {
		this.recordCountPerPage = recordCountPerPage;
	}
	
	public int getPageSize() {
		return pageSize;
	}
	
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	
	public int getCurrentPageNo() {
		return currentPageNo;
	}
	
	public void setCurrentPageNo(int currentPageNo) {
		this.currentPageNo = currentPageNo;
	}
	
	public void setTotalRecordCount(int totalRecordCount) {
		this.totalRecordCount = totalRecordCount;
	}
	
	public int getTotalRecordCount() {
		return totalRecordCount;
	}
	
	/**
	 * Not Required Fields
	 * - 이 필드들은 Required Fields 값을 바탕으로 계산해서 정해지는 필드 값이다.
	 * 
	 * totalPageCount: 페이지 개수
	 * firstPageNoOnPageList : 페이지 리스트의 첫 페이지 번호
	 * lastPageNoOnPageList : 페이지 리스트의 마지막 페이지 번호
	 * firstRecordIndex : 페이징 SQL의 조건절에 사용되는 시작 rownum. 
	 * lastRecordIndex : 페이징 SQL의 조건절에 사용되는 마지막 rownum.
	 */
	
	private int totalPageCount;
	private int firstPageNoOnPageList;
	private int lastPageNoOnPageList;
	private int firstRecordIndex;
	private int lastRecordIndex;	
	
	public int getTotalPageCount() {
		totalPageCount = ((getTotalRecordCount()-1)/getRecordCountPerPage()) + 1;
		return totalPageCount;
	}
	
	public int getFirstPageNo(){
		return 1;
	}
	
	public int getLastPageNo(){
		return getTotalPageCount();		
	}
	
	public int getFirstPageNoOnPageList() {
		firstPageNoOnPageList = ((getCurrentPageNo()-1)/getPageSize())*getPageSize() + 1;
		return firstPageNoOnPageList;
	}
	
	public int getLastPageNoOnPageList() {		
		lastPageNoOnPageList = getFirstPageNoOnPageList() + getPageSize() - 1;		
		if(lastPageNoOnPageList > getTotalPageCount()){
			lastPageNoOnPageList = getTotalPageCount();
		}
		return lastPageNoOnPageList;
	}

	public int getFirstRecordIndex() {
		firstRecordIndex = (getCurrentPageNo() - 1) * getRecordCountPerPage();
		return firstRecordIndex;
	}

	public int getLastRecordIndex() {
		lastRecordIndex = getCurrentPageNo() * getRecordCountPerPage();
		return lastRecordIndex;
	}	
}

 

페이징을 위한 Tag class인 PaginationTag에서 커스텀 태그를 통해 사용자로 부터 입력 받는 프로퍼티는 아래와 같다.

이름 설명 필수여부
paginationInfo 페이징리스트를 만들기 위해 필요한 데이터. 데이터 타입은 egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo이다. yes
type 페이징리스트 렌더링을 담당할 클래스의 아이디. 이 아이디는 빈설정 파일에 선언된 프로퍼티 rendererType의 key값이다. yes
jsFunction 페이지 번호에 걸리게 될 자바스크립트 함수 이름. 페이지 번호가 기본적인 argument로 전달된다. yes

 



PaginationTag의 주요 로직은 아래와 같다.

  • 어떤 PaginationRenderer를 사용할지 PaginationManager에게 위임한다.
  • 실제 페이징을 위한 작업은 PaginationManager가 반환한 PaginationRenderer이 담당한다.
  • PaginationRenderer가 반환한 String 데이터를 출력한다.
//빈 설정 정보와 type 프로퍼티값으로 PaginationRenderer 구현 클래스 반환.
PaginationRenderer paginationRenderer = paginationManager.getRendererType(type);
//페이징 Contents 반환.
String contents = paginationRenderer.renderPagination(paginationInfo, jsFunction);
//출력.
out.println(contents);

3. PaginationManager


빈 설정 정보와 사용자가 태그에서 입력한 type 프로퍼티값을 기반으로 PaginationManager의 getRendererType 메소드가 PaginationRenderer의 구현 클래스 객체를 반환한다.

package egovframework.rte.ptl.mvc.tags.ui.pagination;

public interface PaginationManager {
	public PaginationRenderer getRendererType(String type);
}

 

빈 설정이 아래와 같이 되어 있다면,

// dispatcher-servlet.xml
<bean id="imageRenderer" class="board.cmmn.web.EgovImgPaginationRenderer"/>
<bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
    <property name="rendererType">
        <map>
            <entry key="image" value-ref="imageRenderer"/>
        </map>
    </property>
</bean>

 

사용자가 페이징 기능이 필요한 JSP 페이지에서 아래와 같이 type을 image로 하면 board.cmmn.web.EgovImgPaginationRenderer가 렌더링을 담당한다.

<div id="paging">
    <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="fn_egov_link_page" />
    <form:hidden path="pageIndex" />
</div>

4. PaginationRenderer


PaginationRenderer는 egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo의 데이터를 기반으로 페이징을 렌더링하는 역활을 담당한다. 주요 메소드는 다음과 같다.

package egovframework.rte.ptl.mvc.tags.ui.pagination;

public interface PaginationRenderer {
	public String renderPagination(PaginationInfo paginationInfo,String jsFunction);
}

인터페이스 PaginationRenderer의 구현 추상클래스인 egovframework.rte.ptl.mvc.tags.ui.pagination.AbstractPaginationRenderer는 기본적인 페이징 로직을 제공하고 있다.

이미지


 

프로젝트의 요구사항에 따른 Custom PaginationRenderer를 구현할때는 2가지 경우가 있을 것이다.

  1. 페이징 로직은 AbstractPaginationRenderer과 동일하나, 각 요소의 포맷만 커스터마이징해야 하는 경우
  2. 포맷뿐 아니라 페이징 로직 자체도 커스터 마이징해야 하는 경우

전자인 경우는 주요 프로퍼티들만 오버라이드 하면 된다.
프레임워크에 제공하는 기본 PaginationRenderer인 DefaultPaginationRenderer의 코드는 아래와 같다.

package egovframework.rte.ptl.mvc.tags.ui.pagination;
 
public class DefaultPaginationRenderer extends AbstractPaginationRenderer {
 
	public DefaultPaginationRenderer() {
		firstPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[처음]</a>&#160;"; 
		previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[이전]</a>&#160;";
		currentPageLabel = "<strong>{0}</strong>&#160;";
		otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a>&#160;";
		nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[다음]</a>&#160;";
		lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[마지막]</a>&#160;";
	}
}


아래와 같이 이미지로 각 요소를 보여 주는 PaginationRenderer인 EgovImgPaginationRenderer는 다음과 같다.

이미지

 

후자인 페이징 로직 자체도 커스터 마이징해야 하는 경우는 메소드 renderPagination을 오버라이드해야 한다.
egovframework.rte.ptl.mvc.tags.ui.pagination.AbstractPaginationRenderer의 renderPagination 메소드를 참고해서 구현 클래스에서 오버라이드한다.

import egovframework.rte.ptl.mvc.tags.ui.pagination.AbstractPaginationRenderer;

public class EgovImgPaginationRenderer extends AbstractPaginationRenderer implements ServletContextAware {

    private ServletContext servletContext;

    public EgovImgPaginationRenderer() {
        // no-op
    }

    /**
    * PaginationRenderer
    *
    * @see 개발프레임웍크 실행환경 개발팀
    */
    public void initVariables() {
        firstPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre10.gif' border=0/></a>&#160;";
        previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre1.gif' border=0/></a>&#160;";
        currentPageLabel = "<strong>{0}</strong>&#160;";
        otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a>&#160;";
        nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next1.gif' border=0/></a>&#160;";
        lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next10.gif' border=0/></a>&#160;";
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
        initVariables(); // ServletContext가 주입된 후에만 호출됨.
    }
	
    //renderPagination 메소드를 참고해서 구현 클래스에서 오버라이드
    @Override
    public String renderPagination(PaginationInfo paginationInfo,
            String jsFunction) {		
        ...
    }
}

 

혹은

import egovframework.rte.ptl.mvc.tags.ui.pagination.AbstractPaginationRenderer;

public class EgovImgPaginationRenderer extends AbstractPaginationRenderer {

    public EgovImgPaginationRenderer() {
        firstPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre10.gif' border=0/></a>&#160;";
        previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre1.gif' border=0/></a>&#160;";
        currentPageLabel = "<strong>{0}</strong>&#160;";
        otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a>&#160;";
        nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next1.gif' border=0/></a>&#160;";
        lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next10.gif' border=0/></a>&#160;";
    }

    //renderPagination 메소드를 참고해서 구현 클래스에서 오버라이드
    @Override
    public String renderPagination(PaginationInfo paginationInfo,
            String jsFunction) {		
        ...
    }
}

5. 코드 구현 예제: Java, JSP, JavaScript


src\main\resources\egovframework\spring\context-properties.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

	<bean name="propertiesService" class="egovframework.rte.fdl.property.impl.EgovPropertyServiceImpl" destroy-method="destroy">
		<property name="properties">
	        <map>
	        	<entry key="pageUnit" value="10"/>
	        	<entry key="pageSize" value="10"/>
	        </map>
		</property>
	</bean>
</beans>


SampleDefaultVO.java

더보기
/*
 * Copyright 2008-2009 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package board.sample.service;

import java.io.Serializable;

import org.apache.commons.lang3.builder.ToStringBuilder;

/**
 * @Class Name : SampleDefaultVO.java
 * @Description : SampleDefaultVO Class
 * @Modification Information
 * @
 * @  수정일      수정자              수정내용
 * @ ---------   ---------   -------------------------------
 * @ 2009.03.16           최초생성
 *
 * @author 개발프레임웍크 실행환경 개발팀
 * @since 2009. 03.16
 * @version 1.0
 * @see
 *
 *  Copyright (C) by MOPAS All right reserved.
 */
public class SampleDefaultVO implements Serializable {

	/**
	 *  serialVersion UID
	 */
	private static final long serialVersionUID = -858838578081269359L;

	/** 검색조건 */
	private String searchCondition = "";

	/** 검색Keyword */
	private String searchKeyword = "";

	/** 검색사용여부 */
	private String searchUseYn = "";

	/** 현재페이지 */
	private int pageIndex = 1;

	/** 페이지갯수 */
	private int pageUnit = 10;

	/** 페이지사이즈 */
	private int pageSize = 10;

	/** firstIndex */
	private int firstIndex = 1;

	/** lastIndex */
	private int lastIndex = 1;

	/** recordCountPerPage */
	private int recordCountPerPage = 10;
    
	/* 240509 선택한 페이지unit 개수 */
	private int selectPageUnit = 10;

	public int getFirstIndex() {
		return firstIndex;
	}

	public void setFirstIndex(int firstIndex) {
		this.firstIndex = firstIndex;
	}

	public int getLastIndex() {
		return lastIndex;
	}

	public void setLastIndex(int lastIndex) {
		this.lastIndex = lastIndex;
	}

	public int getRecordCountPerPage() {
		return recordCountPerPage;
	}

	public void setRecordCountPerPage(int recordCountPerPage) {
		this.recordCountPerPage = recordCountPerPage;
	}

	public String getSearchCondition() {
		return searchCondition;
	}

	public void setSearchCondition(String searchCondition) {
		this.searchCondition = searchCondition;
	}

	public String getSearchKeyword() {
		return searchKeyword;
	}

	public void setSearchKeyword(String searchKeyword) {
		this.searchKeyword = searchKeyword;
	}

	public String getSearchUseYn() {
		return searchUseYn;
	}

	public void setSearchUseYn(String searchUseYn) {
		this.searchUseYn = searchUseYn;
	}

	public int getPageIndex() {
		return pageIndex;
	}

	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex;
	}

	public int getPageUnit() {
		return pageUnit;
	}

	public void setPageUnit(int pageUnit) {
		this.pageUnit = pageUnit;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	@Override
	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
    
	public int getSelectPageUnit() {
		return selectPageUnit;
	}

	public void setSelectPageUnit(int selectPageUnit) {
		this.selectPageUnit = selectPageUnit;
	}

}

 


java

@Controller
public class EgovSampleController {

    /** EgovSampleService */
    @Resource(name = "BoardService")
    private BoardService boardService;

    /** EgovPropertyService */
    @Resource(name = "propertiesService")
    protected EgovPropertyService propertiesService;

    /* 조회화면 */
    @RequestMapping(value = "/boardList.do")
    public String selectSampleList(
        @ModelAttribute("searchVO") SampleDefaultVO searchVO,
        @RequestParam(value="selectPageUnit", required = false, defaultValue = "10") int selectPageUnit,
        ModelMap model,
        HttpServletRequest request, 
        HttpServletResponse response
    ) throws Exception {
        
        /* propertiesService을 통해 'pageSize', 'pageUnit'를 가져와서 
         * searchVO.setPageSize(propertiesService.getInt("pageSize")); 
         * searchVO.setPageSize(propertiesService.getInt("pageUnit")); 로 사용해도 된다.
         * 혹은 VO에 설정해놓은걸 그대로 가져와서 써도 된다.
         * searchVO.getPageSize();
         * searchVO.getPageUnit();
         */
         
        /* 한 페이지에 출력할 데이터 건수를 20개로 늘리고 싶은 경우 
         * paginationInfo.setRecordCountPerPage(20);
         * 혹은 searchVO.setPageUnit('20'); 을 통해서 할 수 있다. 
         * 혹은 searchVO.setPageUnit(selectPageUnit); 을 통해서 할 수 있다.
         */
         
        PaginationInfo paginationInfo = new PaginationInfo();
        paginationInfo.setCurrentPageNo(searchVO.getPageIndex());
        paginationInfo.setRecordCountPerPage(searchVO.getPageUnit());
        paginationInfo.setPageSize(searchVO.getPageSize());

        searchVO.setFirstIndex(paginationInfo.getFirstRecordIndex()+1);
        searchVO.setLastIndex(paginationInfo.getLastRecordIndex());
        searchVO.setRecordCountPerPage(paginationInfo.getRecordCountPerPage());

        List<BoardVO> boardList = boardService.selectEgovBoardList(searchVO);
        model.addAttribute("resultList", boardList);

        int totCnt = boardService.selectEgovListTotCnt(searchVO);
        paginationInfo.setTotalRecordCount(totCnt);
        paginationInfo.setPageSize(totCnt);
        model.addAttribute("paginationInfo", paginationInfo);

        return "board/list";
    }

}

 

javaScript 

/* pagination 페이지 링크 function */
function fn_egov_link_page(pageNo){
    document.listForm.pageIndex.value = pageNo;
    document.listForm.action = "<c:url value='/boardList.do'/>";
    document.listForm.submit();
}

 

jsp

<div id="paging">
    <ui:pagination paginationInfo = "${paginationInfo}" type="image" jsFunction="fn_egov_link_page" />
    <form:hidden path="pageIndex" />
</div>

 

xml - OracleSQL (예시)

SELECT *
FROM (
    SELECT 
        A.*,
        ROWNUM AS RNUM
    FROM (
        SELECT 
            EMPLOYEE_ID,
            EMPLOYEE_NAME,
            DEPARTMENT,
            SALARY
        FROM 
            EMPLOYEE
        ORDER BY 
            EMPLOYEE_ID DESC
    ) A
    WHERE ROWNUM <= (#firstIndex# + #recordCountPerPage#)
)
WHERE RNUM BETWEEN #firstIndex# + 1 AND #firstIndex# + #recordCountPerPage#;

 

xml - MySQL (예시)

<select id="getAllEmployees" parameterClass="java.util.Map"
    resultClass="com.easycompany.domain.Employee">
    select employeeid,
        name,
        age,
        departmentid,
        password,
        email
    from employee
    <dynamic prepend="WHERE">
        <isNotEmpty prepend="and" property="searchEid">
            employeeid = #searchEid#
        </isNotEmpty>
        <isNotEmpty prepend="and" property="searchDid">
            departmentid = #searchDid#
        </isNotEmpty>
        <isNotEmpty prepend="and" property="searchName">
            name like '%$searchName$%'
        </isNotEmpty>
    </dynamic>
    order by CONVERT(employeeid,SIGNED)
    limit #firstIndex#, #recordCountPerPage#
</select>

출처 : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:view:paginationtag

출처 : https://github.com/eGovFrame/egovframework.rte.root/blob/master/Presentation/egovframework.rte.ptl.mvc/src/main/java/egovframework/rte/ptl/mvc/tags/ui/pagination/PaginationInfo.java

출처 : http://rwiki.repia.com/doku.php?id=wiki:miscellaneous:%EC%A0%84%EC%9E%90%EC%A0%95%EB%B6%80%ED%91%9C%EC%A4%80%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC_%ED%8E%98%EC%9D%B4%EC%A7%95_%EC%BB%A4%EC%8A%A4%ED%85%80_%ED%8E%98%EC%9D%B4%EC%A7%80%EB%84%A4%EC%9D%B4%EC%85%98_%EB%A0%8C%EB%8D%94%EB%9F%AC

출처 : http://rwiki.repia.com/doku.php?id=wiki:miscellaneous:%EC%A0%84%EC%9E%90%EC%A0%95%EB%B6%80%ED%91%9C%EC%A4%80%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC_%ED%8E%98%EC%9D%B4%EC%A7%95%EC%B2%98%EB%A6%AC

출처 : http://rwiki.repia.com/doku.php?id=wiki:miscellaneous:egov_%ED%8E%98%EC%9D%B4%EC%A7%95_%EC%BB%A4%EC%8A%A4%ED%85%80

728x90
728x90