전자정부프레임워크 Pagination 페이징처리

    전자정부프레임워크 Pagination 페이징처리

    기본적으로 전자정부 프레임워크에서는 페이징 처리를 편하게 하기 위해 <ui:pagination/> 태그를 제공한다.

     

    PaginationInfo는 렌더링에 필요한 데이터가 담겨져있는 빈 클래스로, Tag클래스에서 여기에 있는 정보를 기반으로 페이징을 렌더링 한다.

    이름 설명 사용자입력여부 계산공식
    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=totalPageCount}
    firstRecordIndex 페이징 SQL의 조건절에 사용되는 시작 rownum no firstRecordIndex = (currentPageNo - 1) * recordCountPerPage
    lastRecordIndex 페이징 SQL의 조건절에 사용되는 마지막 rownum no lastRecordIndex = currentPageNo * recordCountPerPage

     

     

    PaginationManager는 어떤 PaginationRenderer를 사용할지를 담당

    ( imageRenderer와 textRenderer가 있다. )

    <!-- For Pagination Tag -->	 
    	<bean id="imageRenderer" class="com.easycompany.tag.ImagePaginationRenderer"/>
     
    	<bean id="textRenderer" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationRenderer"/>
     
    	<bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
    		<property name="rendererType">
    			<map>
    				<entry key="image" value-ref="imageRenderer"/>
    				<entry key="text" value-ref="textRenderer"/>
    			</map>
    		</property>
    	</bean>

    사용자가 페이징 JSP페이지에서 image를 사용 하고싶다면 아래와 같이 넣어 주면 된다.

    <ui:pagination paginationInfo = "${paginationInfo}"
    	type="image"
    	jsFunction="linkPage"/>

    text또한 큰차이 없이 type부분을 text로 변경하여 주기만 하면 된다.

     

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

    아래와 같이 기본적인 코드가 제공 된다.

    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;";
    	}
    }

     

     

     

    사용 방법 예시

    위와 같이 예제 화면이 있다.

    1. 페이징 SQL 작성하기 (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>

    기분적인 동적 쿼리에 limit #firstIndex#, #recordCountPerPage# 을 추가하여 페이징 처리가 가능 하게 되어있다.

     

    2. Controller 작성하기 (페이징처리담당)

    package com.easycompany.controller.annotation;
    ...
    import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo;
     
    @Controller
    public class EmployeeListContrller {
     
    	@Autowired
    	private EmployeeService employeeService;
     
    	@RequestMapping(value="/employeeList.do")
    	public String getEmpList(@RequestParam(value="pageNo", required=false) String pageNo, ....) throws Exception {
    		...
    		//PaginationInfo에 필수 정보를 넣어 준다.
    		PaginationInfo paginationInfo = new PaginationInfo();
    		paginationInfo.setCurrentPageNo(currentPageNo); //현재 페이지 번호
    		paginationInfo.setRecordCountPerPage(3); //한 페이지에 게시되는 게시물 건수
    		paginationInfo.setPageSize(8); //페이징 리스트의 사이즈
     
    		int firstRecordIndex = paginationInfo.getFirstRecordIndex();
    		int recordCountPerPage = paginationInfo.getRecordCountPerPage();
    		commandMap.put("firstIndex", firstRecordIndex );
    		commandMap.put("recordCountPerPage", recordCountPerPage );
     
    		List<Employee> employlist = employeeService.getAllEmployees(commandMap);
    		...		
    		int employeeCount = employeeService.getEmployeeCount(commandMap);
    		paginationInfo.setTotalRecordCount(employeeCount); //전체 게시물 건 수
     
    		//페이징 관련 정보가 있는 PaginationInfo 객체를 모델에 반드시 넣어준다.
    		model.addAttribute("paginationInfo", paginationInfo);
    		return "employeelist";	
    	}
     
    }

     

    3. 페이징 빈 설정

    <!-- For Pagination Tag -->	 
    	<bean id="imageRenderer" class="com.easycompany.tag.ImagePaginationRenderer"/>
     
    	<bean id="textRenderer" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationRenderer"/>
     
    	<bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
    		<property name="rendererType">
    			<map>
    				<entry key="image" value-ref="imageRenderer"/>
    				<entry key="text" value-ref="textRenderer"/>
    			</map>
    		</property>
    	</bean>

     

    4. JSP

    이코드는 페이징 1~10 ~~처럼 페이지 처리가 보여질 곳에 삽입을 하여주면 된다.

    <%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
    ...
    <script type="text/javascript">
    	function linkPage(pageNo){
    		location.href = "/easycompany/employeeList.do?pageNo="+pageNo;
    	}	
    </script>
    <body>
    ...
    		<ui:pagination paginationInfo = "${paginationInfo}"
    			type="image"
    			jsFunction="linkPage"/>
    ...
    </body>

    댓글

    Designed by JB FACTORY