디지털 컨버전스/Project
[BoardProject] 일부 데이터만 출력
gimyeondong
2020. 5. 7. 15:44
DAO에 가짜 데이터 생성 코드 만들기
public static void main(String[] args) throws Exception {
// 가짜 데이터 넣는 코드
Connection con = new BoardDAO().getConnection();
Statement stat = con.createStatement();
for (int i = 0 ; i <200 ; i++){
stat.executeUpdate("insert into board values(board_seq.nextval,'제목"+i+"','내용"+i+"','작성자"+i+"',sysdate,0,'127.0.0.1')");
Thread.sleep(100);
System.out.println(i+" 번째 데이터 입력");
}
con.commit();
con.close();
}
- 오타 주의
- DAO 이름 SQL 고려해서 명명하기
10개만 출력하고 싶을 때
시간을 기준으로 내림차순 (최신글이 첫글이 되도록)
추가로 컬럼 하나를 만들어서 순번 정하기
rank() over
문제점 : 같은 순위가 있을 경우
row_number() over
순번
rnum 이라고 컬럼이름 주기
rnum 에서 1~10 값 꺼내기
단, SQL 실행순서 고려하기
서브쿼리를 사용하여 rnum 명명 후 선택되도록 하기
write_date 외의 모든 것 출력
*만 찍으면 뒤쪽에 더 출력할 수 없음
board.* 으로 적으면 보드테이블의 모든 것이라는 의미로 한정되서 출력 가능해짐
DAO로 만들기
public List<BoardDTO> selectByPageNo(int cpage) throws Exception{
// 1 : 1 ~ 10
// 2 : 11 ~ 20
// 3 : 21 ~ 30
int start = cpage * Configuration.recordCountPerpage - (Configuration.naviCountPerPage-1);
int end = start + (Configuration.recordCountPerpage-1);
String sql = "select * from (select board.*, row_number() over(order by seq desc) rnum from board) where rnum between ? and ?";
List<BoardDTO> list = new ArrayList<>();
try(Connection con = this.getConnection();
PreparedStatement pstat = con.prepareStatement(sql);
){
pstat.setInt(1, start);
pstat.setInt(2, end);
try(ResultSet rs = pstat.executeQuery();){
while(rs.next()) {
int seq = rs.getInt("seq");
String title = rs.getString("title");
String contents = rs.getString("contents");
String writer = rs.getString("writer");
Timestamp write_date = rs.getTimestamp("write_date");
int view_count = rs.getInt("view_count");
String ip_addr = rs.getString("ip_addr");
BoardDTO dto = new BoardDTO(seq,title,contents,writer,write_date,view_count,ip_addr);
list.add(dto);
}
return list;
}
}
}
BoardController
- 게시판 보기
selectAll 을 selectByPageNo로 변경해서
한번에 특정 seq 범위만 노출되도록 설정
package kh.backend.controller;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kh.backend.dao.BoardDAO;
import kh.backend.dto.BoardDTO;
import kh.backend.dto.MemberDTO;
@WebServlet("*.boa")
public class BoardController extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String contextPath = request.getContextPath();
String requestURI = request.getRequestURI();
String cmd = requestURI.substring(contextPath.length());
BoardDAO dao = new BoardDAO();
try {
if(cmd.contentEquals("/toBoard.boa")) {
// 게시판 보기
int cpage = 1; // 바로 게시판으로 들어갈 경우
try{
cpage = Integer.parseInt(request.getParameter("cpage")); //현재 페이지 받아오기
}catch(Exception e) {}
System.out.println("현재 페이지 : " + cpage); //
List<BoardDTO> list = dao.selectByPageNo(cpage); // 전체 목록이 아닌 일부만 불러오기
String navi = dao.getpageNavi(cpage); // 에러?
request.setAttribute("list", list);
request.setAttribute("navi", navi);
RequestDispatcher rd = request.getRequestDispatcher("boardView.jsp");
rd.forward(request, response);
}else if(cmd.contentEquals("/toWrite.boa")) {
// 글쓰기 버튼 누르면 글쓰기 페이지로
response.sendRedirect("writeView.jsp");
}else if(cmd.contentEquals("/write.boa")) {
// 글쓰기 페이지에서 글 입력
MemberDTO dto = (MemberDTO) request.getSession().getAttribute("loginInfo");
String title = request.getParameter("title");
String contents = request.getParameter("contents");
String writer = dto.getId();
String ip_addr = request.getRemoteAddr();
int result = dao.write(new BoardDTO(title,contents,writer,ip_addr));
List<BoardDTO> boardlist = dao.selectAll(); // 목록 다시 불러오기
request.setAttribute("boardlist", boardlist);
RequestDispatcher rd = request.getRequestDispatcher("boardView.jsp");
rd.forward(request, response);
}else if(cmd.contentEquals("/toContents.boa")) {
// 글제목 클릭해서 내용 보기
//클릭한 글 seq get방식으로 받기?
int seq = Integer.parseInt(request.getParameter("seq"));
List<BoardDTO> contents = dao.selectBySeq(seq);
request.setAttribute("contents", contents);
RequestDispatcher rd = request.getRequestDispatcher("contentsView.jsp");
rd.forward(request, response);
}
}catch(Exception e) {
e.printStackTrace();
response.sendRedirect("error.jsp");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}