ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day47. 웹 실습, 페이징처리
    기록 2022. 11. 11. 01:19

    StringUtils클래스에

    private static final DecimalFormat decimalFormat = new DecimalFormat("#,###.##");

     

    /** 정수를 3자리마다 ,가 포함된 문자열로 변환해서 반환한다.

    public static String numberToText(long number) {

         return decimalFormat.format(number);

    }

     

    /** 실수를 소숫점 3번째 자리에서 반올림하고, 정수부는 3자리마다 ,가 포함된 문자열로 변환해서 반환한다.

    public static String numberToText(double number) {

         return decimalFormat.format(number);

    }


    list.jsp에

    <%

        if ("Y".equals(product.getOnSell())) {

    %>

             <span class="badge text-bg-primary p-2">판매중</span>

    <%
    } else {
    %>
    <span class="badge text-bg-secondary">재고없음</span>
    <%
    }
    %>

     

    => DB에 PRODUCT_ON_SELL이 'N'이어야지 '재고없음'으로 나온다.


    // Product클래스에서 할인가격, 할인퍼센트 getter메소드 만들기 (* 표현식 안에서 수식을 적지 말고 vo안에다가 만들어놓으면 메소드 호출하기만 하면 된다. 가능하면 로직은 표현식 안에 직접 적지 말고 스크립틀릿 안에서 적든지 혹은 자바클래스 안에서 적기)

    public int getDiscountPrice() {

          return (int) (price*(1-discountRate));

    }

    public int getDiscountPerCent() {

          return (int) (discountRate*100);

    }


    // Book클래스에 판매중인지를 확인하는 메소드를 만든다. (테이블에 OnSell이 없어도 getter메소드이니까 만들 수 있음)

    public boolean isOnSell() {
            return stock > 0;
    }

    // detail.jsp에 로직 구현.

    // book.isOnSell()은 반환타입이 boolean타입이다. stock이 0보다 작거나 같으면 false가 반환되고 크면 true가 반환된다.

    <%
         if (book.isOnSell()) {
    %>
         <span class="badge text-bg-primary">판매중</span>
    <%
          } else {
    %>
         <span class="badge text-bg-secondary">재고없음</span>
    <%
          }
    %>


    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy년 M월 d일");

    /**
     * Date를 "2022년 11월 10일" 형식의 문자열로 변환해서 반환한다.
     * @param date 날짜
     * @return 년월일 형식의 문자열, 날짜가 null이면 빈 문자열을 반환한다.
     */

    public static String dateToText(Date date) {
       if (date == null) {
            return "";    // null일 경우 빈 문자열 반환한다.
        }
        return simpleDateFormat.format(date);
    }


    재고가 있으면 삭제가 되도록, 재고가 0이면 삭제되도록 만들기 (삼항연산자와 disabled(비활성화하기)사용하기!)

    detail.jsp에

    <a href="delete.jsp" class="btn btn-danger <%=book.isOnSell() ? "disabled" : "" %>">삭제</a>


    * 추가, 변경, 삭제는 html컨텐츠를 보여주는게 아니라서 jsp파일에 html태그가 필요 없다.

    어떤 책을 삭제해야하는지 URL에 책번호를 붙여서 알려줄 수 있다. 

    <a href="delete.jsp?bookNo=<%=book.getNo() %>" class="btn btn-danger <%=book.isOnSell() ? "disabled" : "" %>">삭제</a>


    detail.jsp에서는 delete.jsp?bookNo=책번호 이 URL을 서버로 보내서 도서정보 삭제를 요청한다.

    bookNo라는 이름으로 delete.jsp로 전달되므로 

    int bookNo = Integer.parseInt(request.getParameter("bookNo"));

    요청파라미터에서 bookNo로 책번호를 조회한다.

    그리고 dao에서 삭제를 하려면 삭제 쿼리가 sql에 정의되어 있어야 하므로 xml파일로 가서 쿼리를 작성한다.

     

    <delete id="deleteBookByNo" parameterClass="int">
       delete from
            sample_books
       where
            book_no = #value#
    </delete>


    상세화면 다음에 수정폼화면이 나오는 연결된 화면이더라도 모든 요청은 서버로 보내기 때문에 상세화면과 수정폼화면 사이에는 아무런 정보를 교환할 수 없다. 

    수정폼에 원래 값이 들어가있게 하기 위해 책정보를 조회하는 메소드가 <%= %>안에 들어가있다.


    readonly="readonly"는 읽기만 가능하게 해주는 기능, 커서는 가지만 값이 안바뀜. 서버로 전송은 됨.

    disabled="disabled"는 커서 자체가 안가도록 하는 기능, 서버에 전송도 안됨.

    selected="selected"는 미리 선택되어있게 하는 기능.

     

    삼항연산자는 활성화/비활성화 기능을 사용하고 싶을 때 사용한다. ('selected=' 이부분은 안적어도 됨)

    <%="한빛미디어".equals(book.getPublisher()) ? "selected" : "" %>>

     

    hidden필드 

        - 화면에 표시되지 않는 폼 입력요소다.

        - 화면에 표시할 필요는 없지만 폼 입력값을 서버로 제출할 때 포함되어야 하는 값을 hidden필드로 정의해 놓는다.

    <input type="hidden" name="no" value="<%=book.getNo() %>" />

     

    웹에서는 브라우저(클라이언트)하고 서버하고 항상 key-value의 쌍으로 값을 주고 받는다.


    값이 누락되었다고 뜰 때, 디버그 모드로 확인할 수 있다.

    서버를 끄고 서버에서 오른쪽 버튼 누르면 Debug라는게 있는데 클릭하면 디버그모드로 스타트가 된다.

    오류가 난 jsp에서 번호가 있는 곳 왼쪽에 더블클릭하여 브레이크포인트를 만들어놓는다.

    그 상태에서 브라우저에서 원하는 기능을 실행시켜보면 이클립스가 깜빡거린다.

    perspective를 변경할거냐 물으면 switch 클릭하면 이클립스 화면이 변경됨

    이클립스 창 위에 step over(F6)버튼을 눌러서 한칸씩 넘어가게 한다.

    db엑세스 작업을 마치면 마지막 생성된 행을 클릭하면 db에 뭐가 들어있는지 보인다.

    step over를 누르면 없는값이 null로 바뀐다.

    확인이 끝났으면 java EE를 클릭해서 원래상태로 놓는다.


    페이징 처리 (페이지번호에 맞는 데이터 출력하기)


    // 1. 한 화면에 표시할 행의 갯수를 결정하기
    final int rows = 10;

    // 2. 현재 페이지 번호를 조회하기
    int currentPage = Integer.parseInt(request.getParameter("page"));

    // 3. 현재 페이지 번호에 맞는 조회범위 계산하기
    int begin = (currentPage - 1)*rows + 1;
    int end = currentPage*rows;

    // 4. Map객체를 생성해서 조회범위를 저장한다.
    Map<String, Object> param = new HashMap<>();
    param.put("begin", begin);
    param.put("end", end);

    // 5. 현재 페이지번호에 맞는 책 목록을 조회하기 위해서 BookDao객체를 생성한다.
    BookDao bookDao = new BookDao();

    // 6. BookDao객체의 getBooks(Map<String, Object> param) 메소드를 실행해서 현재 페이지번호에 맞는 책 목록을 반환받는다.   
    List<Book> books = bookDao.getBooks(param);

     

    * vo에는 없는 값일 때 보통 Map객체에 담아서 보낸다.
    -----------------------------------------------------------------------------------------------------------------------------

    ROW NUMBER를 이용해서 10개씩 끊어서 보여주기

    페이징처리할 때는 요청할 때 꼭 페이지 값이 있어야 한다.


    페이지 내비게이션 출력하기

    // 1. 전체 데이터행의 갯수를 조회한다.
    int totalRows = bookDao.getTotalRows();

    // 2. 전체 페이지 갯수를 계산하기
    int totalPages = (int)Math.ceil( (double)totalRows/rows );

    // 3. 페이지 내비게이션을 출력한다.
    <%
    for (int number = 1; number <= totalPages; number++) {
    %>
    <li class="page-item"><a class="page-link" href="list.jsp?page=<%=number %>"><%=number %></a></li>
    <%
    }
    %>

    댓글

Designed by Tistory.