Tag Archives: jsp

Custom Tag의 인코딩 옵션을 바꿀때

[code]<%@ taglib prefix=”template” tagdir=”/WEB-INF/tags/” %>[/code]

와 같이 tag파일들로 커스텀 태그를 사용하다 보니 한글이 제대로 보이지 않는 문제가 발생하였다.

그래서 익숙하게 다음의 코드를 맨 위에 붙여 주었다.

[code]<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>[/code]

이런… 예상치 못한 에러가 발생했다.

&lt;%@ page directive cannot be used in a tag file

라고 한다. 태그 파일 안에서 page 지시자는 사용할수 없다고 한다. 아무리 구글링을 하여봐도 관련 자료를 찾을수가 없었다.

그러다가 문서를 발견하였는데. tag지시자에 대해 설명하면서 page지시자와 비슷한것이라고 되어있었다.

다음과 같이 지시자를 붙여줌으로서 UTF-8기반하의 한글을 매우 잘 출력할수 있게 되었다. EUC-KR기반이라도 다를바 없을것이라 생각한다.

[code]<%@ tag language=”java” body-content=”empty” pageEncoding=”UTF-8″%>[/code]

게시판용 페이징 클래스

게시판에서 쓸만한 페이징 클래스를 제작해 보았다. 문제 발견시 피드백 부탁드립니다^^

1342418818.txt
—————————————————————————————
페이징 클래스 소스코드 :
—————————————————————————————
[code]public class PageNavigation {
   
    private        boolean        isPrevPage;
    private        boolean        isNextPage;
    protected    int            nowPage;
    protected    int            rowTotal;
    protected    int            blockList;
    protected    int            blockPage;
    private        int            totalPage;
    private        int            startPage;
    private        int            endPage;
    private        int            startRow;
    private        int            endRow;
   
    // 페이지를 계산하는 생성자
    public PageNavigation(int nowPage, int rowTotal, int blockList, int blockPage) {
        super();
       
        // 각종 플래그를 초기화
        isPrevPage = false;
        isNextPage = false;
       
        // 입력된 전체 열의 수를 통해 전체 페이지 수를 계산한다
        this.totalPage    = (int) Math.ceil((double)rowTotal / (double)blockList);
       
        // 현재 페이지가 전체 페이지수보다 클경우 전체 페이지수로 강제로 조정한다
        if(nowPage > this.totalPage)
        {
            nowPage = this.totalPage;
        }
       
        // DB입력을 위한 시작과 종료값을 구한다
        this.startRow    = (int) (nowPage – 1) * blockList;
        this.endRow        = (int) this.startRow + blockList – 1;
       
        // 시작페이지와 종료페이지의 값을 구한다
        this.startPage    = (int) ((nowPage – 1) / blockPage) * blockPage + 1;
        this.endPage    = (int) this.startPage + blockPage – 1;
       
        // 마지막 페이지값이 전체 페이지값보다 클 경우 강제 조정
        if(this.endPage > this.totalPage)
        {
            this.endPage = totalPage;
        }
       
        // 시작 페이지가 1보다 클 경우 이전 페이징이 가능한것으로 간주한다
        if(this.startPage > 1)
        {
            this.isPrevPage = true;
        }
       
        // 종료페이지가 전체페이지보다 작을경우 다음 페이징이 가능한것으로 간주한다
        if(this.endPage < this.totalPage)
        {
            this.isNextPage = true;
        }
       
        // 기타 값을 저장한다
        this.nowPage = nowPage;
        this.rowTotal = rowTotal;
        this.blockList = blockList;
        this.blockPage = blockPage;
    }
   
    public void Debug()
    {
        System.out.println(“Total Page : ” + this.totalPage + ” / Start Page : ” + this.startPage + ” / End Page : ” + this.endPage);
        System.out.println(“Total Row : ” + this.rowTotal + ” / Start Row : ” + this.startRow + ” / End Row : ” + this.endRow);
    }
   
    // 전체 페이지 수를 알아온다
    public int getTotalPage()
    {
        return totalPage;
    }
   
    // 시작 Row값을 가져온다
    public int getStartRow()
    {
        return startRow;
    }
   
    // 마지막 Row값을 가져온다
    public int getEndRow()
    {
        return endRow;
    }
   
    // Block Row 크기를 가져온다
    public int getBlockSize()
    {
        return blockSize;
    }
   
    // 시작페이지값을 가져온다
    public int getStartPage()
    {
        return startPage;
    }

    // 마지막 페이지값을 가져온다
    public int getEndPage()
    {
        return endPage;
    }
   
    // 이전페이지의 존재유무를 가져온다
    public boolean isPrevPage()
    {
        return isPrevPage;
    }
   
    // 다음페이지의 존재유무를 가져온다
    public boolean isNextPage()
    {
        return isNextPage;
    }
}[/code]

—————————————————————————————
서블릿(Controller) 소스코드 :
—————————————————————————————

[code]// 리스트를 가져온다
if(request.getParameter(“page”) == null)
{
    nowPage = 1;
}
else
{
    nowPage = Integer.parseInt(request.getParameter(“page”));
   
    if(nowPage < 1)
    {
        nowPage = 1;
    }
}

// 객체를 생성한다 (현재페이지, 전체글수, 페이지당표시할 글의수, 한번에 표시할 페이징블록수)   
PageNavigation pageNav = new PageNavigation(nowPage, rowTotal, 10, 5);

// 디버깅이 필요할시 사용한다. 안써도 됨
pageNav.Debug();

// 시작Row값과 종료Row값을 넣어 쿼리문을 작성한다
sql = “SELECT * FROM TableName ORDER BY no DESC LIMIT ” + pageNav.getStartRow() + “, ” + pageNav.getBlockSize();

// 뷰에게 넘길 값을 지정한다
request.setAttribute(“pageIsPrev”,    pageNav.isPrevPage());    // 이전페이지 블록의 존재유무
request.setAttribute(“pageIsNext”,    pageNav.isNextPage());    // 다음페이지 블록의 존재유무
request.setAttribute(“pageStart”,    pageNav.getStartPage());// 시작페이지 번호
request.setAttribute(“pageEnd”,        pageNav.getEndPage());    // 종료페이지 번호[/code]

—————————————————————————————
jsp(View) 소스코드(EL표기법, JSTL사용) :
—————————————————————————————
[code]<div>
    <center>
        <c:if test=”${pageIsPrev}”>
            <a href=”index.do?page=${pageStart – 1}”>prev</a>
        </c:if>
        <c:forEach var=”page” begin=”${pageStart}” end=”${pageEnd}”>
            <a href=”index.do?page=${page}”>[${page}] </a>
        </c:forEach>
        <c:if test=”${pageIsNext}”>
            <a href=”index.do?page=${pageEnd + 1}”>next</a>
        </c:if>
    </center>
</div>[/code]

—————————————————————————————
결과 :
—————————————————————————————
prev [11] [12] [13] [14] [15] next