일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 오류
- Java
- CSS
- 태그
- TO_DATE
- controller
- 개념
- 암호화
- web.xml
- select
- 배열
- array
- sql
- 과정평가형
- eGov
- 함수
- Database
- Oracle
- mybatis
- javascript
- json
- input
- JVM
- eGovFramework
- Ajax
- POI
- spring
- html
- jQuery
- was
- Today
- Total
web developer
[egov] egovFramework 페이지네이션 기능 본문
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 태그인 <ui:pagination> 사용시에 paginationInfo 필드에 PaginationInfo 객체를 값으로 주어야 한다.
* </pre>
*<pre class="code">
*<ui:pagination paginationInfo = "${paginationInfo}"
* type="image"
* jsFunction="linkPage"
*>
*</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가지 경우가 있을 것이다.
-
페이징 로직은 AbstractPaginationRenderer과 동일하나, 각 요소의 포맷만 커스터마이징해야 하는 경우
-
포맷뿐 아니라 페이징 로직 자체도 커스터 마이징해야 하는 경우
전자인 경우는 주요 프로퍼티들만 오버라이드 하면 된다.
프레임워크에 제공하는 기본 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> ";
previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[이전]</a> ";
currentPageLabel = "<strong>{0}</strong> ";
otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a> ";
nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[다음]</a> ";
lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">[마지막]</a> ";
}
}
아래와 같이 이미지로 각 요소를 보여 주는 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> ";
previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre1.gif' border=0/></a> ";
currentPageLabel = "<strong>{0}</strong> ";
otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a> ";
nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next1.gif' border=0/></a> ";
lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next10.gif' border=0/></a> ";
}
@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> ";
previousPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_pre1.gif' border=0/></a> ";
currentPageLabel = "<strong>{0}</strong> ";
otherPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">{2}</a> ";
nextPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next1.gif' border=0/></a> ";
lastPageLabel = "<a href=\"#\" onclick=\"{0}({1}); return false;\">" + "<image src='" + servletContext.getContextPath() + "/images/egovframework/cmmn/btn_page_next10.gif' border=0/></a> ";
}
//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
'Framework > Egovframework [spring]' 카테고리의 다른 글
[egov] 트랜잭션 관리 (1) | 2024.09.12 |
---|---|
[egov] 트랜잭션 서비스 (2) | 2024.09.12 |
[egov] dispacther-servlet.xml / 로그인 체크 Interceptors 설정 (2) | 2024.05.28 |
[eclipse] IOConsole Updater (error) 원인 및 해결방안 (2) | 2022.04.20 |
[eclipse] Updating javascript index (error) 원인 및 해결방안 (2) | 2022.04.20 |