본문 바로가기

bitcamp/면접족보

면접족보 21/01/29_페이징 구현, 유효성 검사

1. spring에서의 리소스 처리방법에 대하여 설명하시오.

· spring에서는 jsp를 제외한 모든 문서는 정적으로 인식되어 접근이 불가하기 때문에 servlet-context.xml

 아래와 같이 맵핑시킨 코드 내용을 추가해야 접근이 가능해진다.

· webApp은 resource폴더(정적 리소스 저장하는 장소) WEB-INF폴더(보안이 필요한 파일을 저장하는 장소)로 나누어 사용한다.

 

 

2. 페이징을 구현하시오.

<테스트 항목을 넣기 위한 sql문>

 

 

<구현 화면>

 

 

<Criteria.java>

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Criteria {
    private int page; // 보여줄 페이지
    private int perPageNum; // 페이지당 보여줄 페이지수
    private int rowStart;
    private int rowEnd;
 
    public Criteria() {
        this.page = 1// 사용자가 세팅하지 않으면 기본 1
        this.perPageNum = 10// 페이지당 기본 10개씩 출력하도록 세팅
    }
 
    public int getPage() {
        return page;
    }
 
    public void setPage(int page) {
        if (page <= 0) {
        // 페이지는 1페이지이므로 0보다 작거나 같은값일 경우 무조건 첫번째 페이지로 설정되도록 해준다.
            this.page = 1;
        } else
            this.page = page;
    }
 
    public int getPerPageNum() {
        return perPageNum;
    }
 
    public void setPerPageNum(int perPageNum) {
        if (perPageNum <= 0 || perPageNum > 100) {
            this.perPageNum = 10;
        } else
            this.perPageNum = perPageNum;
    }
 
    public int getRowStart() {
        rowStart = ((page - 1* perPageNum) + 1;
        return rowStart;
    }
 
    public int getRowEnd() {
        rowEnd = rowStart + perPageNum - 1;
        return rowEnd;
    }
}
cs

 

 

<PageMaker.java>

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
31
32
33
34
public class PageMaker {
    private Criteria cri;   // page, perPageNum을 불러옴
 
    private int totalCount;  // 전체 게시글 수
    private int startPage;   // 현재 화면에서 보이는 페이지의 시작 번호
    private int endPage;     // 현재 화면에서 보이는 페이지의 마지막 번호
    private boolean prev;    // 페이징 이전 버튼 활성화 여부
    private boolean next;    // 페이징 다음 버튼 활성화 여부
    private int displayPageNum = 10;// 화면 하단에 보여지는 페이지의 개수
    private int tempEndPage;
 
    public int getTotalCount() {
        return totalCount;
    }
 
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
        calcData();
    }
 
    private void calcData() {// 전체 필드 변수 값들을 계산하는 메서드
        endPage = (int) (Math.ceil(cri.getPage() / (double) displayPageNum) * displayPageNum);
        startPage = (endPage - displayPageNum) + 1;
 
        int tempEndPage = (int) (Math.ceil(totalCount / (double) cri.getPerPageNum()));
        this.tempEndPage = tempEndPage;
 
        if (endPage > tempEndPage) {
            endPage = tempEndPage;
        }
        prev = startPage == 1 ? false : true;// 1페이지면 이전 누를 수 없게 false
        next = endPage * cri.getPerPageNum() >= totalCount ? false : true;
    }
  // 밑부분은 getter, setter 설정
cs

 

 

<BoardController.java>

1
2
3
4
5
6
7
8
9
10
11
12
13
@GetMapping("/board/listPage")
public String listPage(@ModelAttribute("cri") Criteria cri, Model model) throws Exception {
    log.info(cri.toString());
        
    model.addAttribute("list1", boardService.listPage(cri));  // 게시판의 글 리스트
    
    PageMaker pageMaker = new PageMaker();
    pageMaker.setCri(cri);
    pageMaker.setTotalCount(boardService.listCount());
    model.addAttribute("pageMaker", pageMaker);  // 게시판 하단의 페이징 관련, 이전페이지, 페이지 링크 , 다음 페이지
        
    return "listPage";
}
cs

 

 

<BoardMapper.xml>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 페이징 처리 -->
  <select id="listPage" resultType="edu.bit.ex.board.vo.BoardVO" parameterType="edu.bit.ex.board.vo.Criteria">
  <![CDATA[
       select bId, bName, bTitle, bDae, bHit       
       from (select bId, bName, bTitle, bDae, bHit, row_number() over(order by bId desc) as rNum from mvc_board) mb
       where rNum between #{rowStart} and #{rowEnd}
   ]]>
  </select>
 
<!-- 게시물 총 개수 출력 -->
  <select id="listCount" resultType="int">
  <![CDATA[
         select count(*from mvc_board
   ]]>
  </select>
cs

 

 

금일 예제

· emp정보를 템플릿 적용하여 출력하고, 글작성 클릭하면 작성페이지를 출력하시오.

  단, 작성페이지에서 매니저와 부서는 DB의 내용과 연결시켜 선택할 수 있도록 옵션 형태로, 날짜는 달력 형태로 작성하고,

  클라이언트가 동일한 사원번호 입력 시 오류메세지 발생할 것(클라이언트, 서버 유효성 검사)!

 

 

<작성페이지 구현화면>

<정보입력 후 list 화면>

 

 

 

 

 

<사원번호 유효성 검사>

· 클라이언트에서 중복된 사원번호를 입력한 경우 오류메세지 발생!

 

 

 

 

<사원번호 유효성 검사>

· 입력된 사원번호가 0인 경우 오류메세지 발생과 동시에 작성페이지 return!

· 서버쪽에서 사원번호 중복 검사를 하기 위해 EmpValidator에서 EmpVO의 empno 값을 불러오기위해 시도중...

  방법을,,,,,알고싶어요