오늘이라도
[Web] 30. 회원 관리 & 게시판 만들기 ⑤ : 게시글 등록, 전체 글 목록 조회, 페이징 본문
취업성공패키지 SW 개발자 교육/Web
[Web] 30. 회원 관리 & 게시판 만들기 ⑤ : 게시글 등록, 전체 글 목록 조회, 페이징
upcake_ 2020. 6. 19. 12:32반응형
https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- 회원 관리 & 게시판 만들기 ⑤ : 게시글 등록, 전체 글 목록 조회, 페이징 -
package com.board.action;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.board.study.BoardDAO;
import com.board.study.BoardDTO;
import com.commons.action.Action;
import com.commons.action.ActionForward;
public class BoardListAction implements Action {
@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String id = (String) session.getAttribute("id");
BoardDAO dao = new BoardDAO();
int listCount = dao.getListCount(); //글의 총 개수
System.out.println("listCount : " + listCount);
int page = 1; //시작 페이지 번호
int limit = 10; //한 페이지에 표시되는 페이지 개수
if(request.getParameter("page") != null) {
page = Integer.parseInt(request.getParameter("page"));
}
ArrayList<BoardDTO> list = new ArrayList<>();
list = dao.getBoardList(page, limit); //전체 글 목록
int maxPage = (int) ((float)listCount / 10 + 0.95); //최대 페이지수
//현재 페이지에 보여줄 시작 페이지 수 (1, 11, 11, 21 ~~)
int startPage = (((int)((float) page / 10 + 0.9)) - 1) * 10 + 1;
//현재 페이지에 보여줄 마지막 페이지 수(10, 20, 30 ~~)
int endPage = maxPage;
if(endPage > startPage + 10 - 1) {
endPage = startPage + 10 - 1;
}
request.setAttribute("page", page); //현재 페이지 수
request.setAttribute("maxPage", maxPage); //최대 페이지 수
request.setAttribute("startPage", startPage); //현재 페이지에 표시할 첫 페이지 수
request.setAttribute("endPage", endPage); //현재 페이지에 표시할 끝 페이지 수
request.setAttribute("listCount", listCount); //글의 개수
request.setAttribute("list", list); //전체 글 목록
ActionForward forward = new ActionForward();
//id 세션이 안만들어진 비정상적인 접근의 경우 로그인 화면으로 돌려보낸다
if(id == null) {
forward.setPath("memberLogin.me");
forward.setRedirect(true); //가져갈게 없으므로 sendRedirect
return forward;
}
forward.setPath("board/board_list.jsp");
forward.setRedirect(false);
return forward;
}
}
▲BoardListAction.java
package com.board.study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class BoardDAO {
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception!!!");
}
return conn;
} //getConn()
//게시글 등록
public int boardInsert(BoardDTO dto) {
conn = getConn();
String sql = "";
int b_num = 0;
int succ = 0;
try {
//글 번호를 검색한 후 등록할 글 번호(b_num)를 결정
sql = "SELECT MAX(board_num) FROM memberBoard";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()) { //글이 있으면 (글 갯수 + 1)번
b_num = rs.getInt(1);
b_num += 1;
} else { // 글이 없으면 1번
b_num = 1;
}
//글 등록
sql = "INSERT INTO memberBoard VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, sysdate)";
ps = conn.prepareStatement(sql);
ps.setInt(1, b_num);
ps.setString(2, dto.getBoard_id());
ps.setString(3, dto.getBoard_subject());
ps.setString(4, dto.getBoard_content());
ps.setString(5, dto.getBoard_file());
ps.setInt(6, b_num); //댓글을 쓰기 위한 그룹 번호
ps.setInt(7, 0); //댓글이 없으니 0
ps.setInt(8, 0);
ps.setInt(9, 0);
succ = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println("boardInsert() Exception!!!");
} finally {
dbClose();
}
return succ;
} //boardInsert()
//등록된 글의 총 개수
public int getListCount() {
conn = getConn();
String sql = "SELECT COUNT(*) FROM memberBoard";
//NULL이 들어갈 수 있는 필드도 있으므로 모든 필드를 센 다음에 가장 많이 나온 필드를 기준으로 한다.
int listCount = 0;
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()) {
listCount = rs.getInt(1); //board_num 필드는 NULL값이 들어올 수 없으니 board_num을 가져온다.
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("getListCount() Exception!!!");
} finally {
dbClose();
}
return listCount;
} //getListCount()
//전체 글 목록 조회(Feat : 페이징
public ArrayList<BoardDTO> getBoardList(int page, int limit) {
conn = getConn();
String sql = "SELECT * FROM";
sql += " (SELECT ROWNUM rnum, board_num, board_id,";
sql += " board_subject, board_content, board_file, board_re_ref,";
sql += " board_re_lev, board_re_seq, board_readcount, board_date";
sql += " FROM (SELECT * FROM memberBoard ORDER BY";
sql += " board_num DESC, board_re_seq ASC))";
sql += "WHERE rnum >= ? and rnum <= ?";
int startRow = (page - 1) * 10 + 1; //읽기 시작할 rownum
int endRow = startRow + limit - 1; //읽을 마지막 rownum
ArrayList<BoardDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, startRow);
ps.setInt(2, endRow);
rs = ps.executeQuery();
while(rs.next()) {
BoardDTO dto = new BoardDTO();
dto.setBoard_num(rs.getInt("board_num"));
dto.setBoard_id(rs.getString("board_id"));
dto.setBoard_subject(rs.getString("board_subject"));
dto.setBoard_content(rs.getString("board_content"));
dto.setBoard_file(rs.getString("board_file"));
dto.setBoard_re_ref(rs.getInt("board_re_ref"));
dto.setBoard_re_lev(rs.getInt("board_re_lev"));;
dto.setBoard_readcount(rs.getInt("board_readcount"));
dto.setBoard_date(rs.getString("board_date"));
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("getBoardList() Exception!!!");
} finally {
dbClose();
}
return list;
}
//DB 종료
public void dbClose() {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception!!!");
}
} //dbClose()
} //class
▲BoardDAO.java
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="com.board.study.BoardDTO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.member.study.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
String id = (String) session.getAttribute("id"); //JSP는 session이 내장 객체라 바로 사용 가능하다.
MemberDAO dao = new MemberDAO();
String member_pw = dao.getMember_pw(id);
Integer nowPage = (Integer)request.getAttribute("page");
Integer maxPage = (Integer)request.getAttribute("maxPage");
Integer startPage = (Integer) request.getAttribute("startPage");
Integer endPage = (Integer) request.getAttribute("endPage");
Integer listCount = (Integer) request.getAttribute("listCount");
ArrayList<BoardDTO> list = new ArrayList<>();
list = (ArrayList<BoardDTO>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>board list JSP</title>
<script type="text/javascript">
function fnModify(id, member_pw) {
//alert("id : " + id);
var pw = prompt("비밀번호를 입력하세요","");
//alert("member_pw : " + member_pw + "\npw : " + pw);
//member_pw : dto에 저장되어있던 비밀번호
//pw : 방금 사용자로부터 입력받은 비밀번호
if(member_pw == pw) { //맞는 비밀번호를 입력하면 URL이 바뀐다
//alert("비밀번호 일치합니다.")
location.href = "memberDetailAction.me?member_id=" + id;
} else {
alert("비밀번호가 일치하지 않습니다.");
}
}
</script>
</head>
<body>
<div align="center">
<h3>[자유 게시판]</h3>
<table border= "1">
<tr align="center";>
<th>번호</th>
<th width="200">제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
<%for(int i = 0; i < list.size(); i++) {
BoardDTO dto = list.get(i);%>
<tr align="center">
<td><%=dto.getBoard_num() %></td>
<td><a href="boardDeatilAction.bo?board_num=<%=dto.getBoard_num() %>"><%=dto.getBoard_subject() %></a></td>
<td><%=dto.getBoard_id() %></td>
<td><%=dto.getBoard_date().substring(0, 10) %></td>
<td><%=dto.getBoard_readcount() %></td>
</tr>
<%} %>
<tr align="center">
<td colspan="5">
<%if(nowPage <= 1) { %>
[이전]
<%} else { %>
<a href="boardList.bo?page=<%=nowPage - 1 %>">[이전]</a>
<%} %>
<%for(int i = startPage; i <= endPage; i++) { %>
<%if(i == nowPage) { %>
[<%=i %>]
<%} else { %>
<a href="boardList.bo?page=<%=i %>">[<%=i %>]</a>
<%} %>
<%} %>
<%if(nowPage >= maxPage) { %>
[다음]
<%} else { %>
<a href="boardList.bo?page=<%=nowPage + 1 %>">[다음]</a>
<%} %>
</td>
</tr>
<tr align="center">
<td colspan="5">
<%if(id != null && id.equals("admin")) { %>
<input type="button" value="회원 관리" onclick="location.href='memberListAction.me'" />
<%} %>
<input type="button" value="로그아웃" onclick="location.href='memberLogout.me'"/>
<input type="button" value="글쓰기" onclick="location.href='boardWrite.bo'" />
<input type="button" value="회원 정보 수정" onclick="fnModify('<%=id%>', '<%=member_pw %>')"/>
</td>
</tr>
</table>
</div>
</body>
</html>
▲board_list.jsp
반응형
'취업성공패키지 SW 개발자 교육 > Web' 카테고리의 다른 글
[Web] 32. 회원 관리 & 게시판 만들기 ⑦ : 답글 쓰기 (0) | 2020.06.24 |
---|---|
[Web] 31. 회원 관리 & 게시판 만들기 ⑥ : 게시글 조회, 삭제, 수정 (0) | 2020.06.22 |
[Web] 29. 회원 관리 & 게시판 만들기 ④ : 회원 정보 수정, 게시글 작성, 파일 업로드 (0) | 2020.06.18 |
[Web] 28. 회원 관리 & 게시판 만들기 ③ : 회원 목록, 회원 정보 상세 보기, 회원 삭제 구현 (2) | 2020.06.17 |
[Web] 27. 회원 관리 & 게시판 만들기 ② : 로그인, 회원가입 구현 (2) | 2020.06.16 |