index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
</head>
<body>
<h1>메인 Index</h1>
<a href="board/list.jsp">게시판</a>
</body>
</html>
BoardDao.java
package board;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import common.JdbcUtil;
public class BoardDao {
private JdbcUtil ju;
public BoardDao() {
ju = JdbcUtil.getInstance();
}
//삽입(C)
public int insert(boardVo vo) {
Connection con = null;
PreparedStatement pstmt = null;
String query = "INSERT INTO board VALUES(nextval(board_seq),?,?,?,now(),0)";
int ret = -1;
try {
con = ju.getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getWriter());
pstmt.setString(3, vo.getContent());;
ret = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ret;
}
//조회(R)
public List<boardVo> selectAll() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String query = "SELECT * FROM board ORDER BY num DESC";
ArrayList<boardVo> ls = new ArrayList<boardVo>();
try {
con = ju.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(query);
while(rs.next()) {
boardVo vo = new boardVo(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
new Date(rs.getDate(5).getTime()),
rs.getInt(6));
ls.add(vo);
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ls;
}
public boardVo selectOne(int num) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String query = "SELECT * FROM board WHERE num=?";
boardVo vo = null;
ArrayList<boardVo> ls = new ArrayList<boardVo>();
try {
con = ju.getConnection();
pstmt = con.prepareStatement(query);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if(rs.next()) {
updateCnt(num); //조회수 증가
vo = new boardVo(
rs.getInt(1),
rs.getString(2),
rs.getString(3),
rs.getString(4),
new Date(rs.getDate(5).getTime()),
rs.getInt(6)+1);
ls.add(vo);
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return vo;
}
//수정(U)
public int update(boardVo vo) {
Connection con = null;
PreparedStatement pstmt = null;
String query = "update board set title=?, content=? where num=?";
int ret = -1;
try {
con = ju.getConnection();
pstmt = con.prepareStatement(query);
pstmt.setString(1, vo.getTitle());
pstmt.setString(2, vo.getContent());
pstmt.setInt(3, vo.getNum());;
ret = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ret;
}
public int updateCnt(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String query = "update board set cnt=cnt+1 where num=?";
int ret = -1;
try {
con = ju.getConnection();
pstmt = con.prepareStatement(query);
pstmt.setInt(1, num);
ret = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ret;
}
//삭제(D)
public int delete(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String query = "delete from board where num=?";
int ret = -1;
try {
con = ju.getConnection();
pstmt = con.prepareStatement(query);
pstmt.setInt(1, num);
ret = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return ret;
}
}
boardVo.java
package board;
import java.util.Date;
/**
* @author user
*
*/
public class boardVo {
private int num;
private String title;
private String writer;
private String content;
private Date regdate;
private int cnt;
public boardVo() {}
public boardVo(int num, String title, String writer, String content, Date regdate, int cnt) {
super();
this.num = num;
this.title = title;
this.writer = writer;
this.content = content;
this.regdate = regdate;
this.cnt = cnt;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
@Override
public String toString() {
return "boardVo [num=" + num + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regdate="
+ regdate + ", cnt=" + cnt + "]";
}
}
JdbcUti.java
package common;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class JdbcUtil {
private static JdbcUtil instance = new JdbcUtil();
private static DataSource ds;
static {
try {
Class.forName("org.mariadb.jdbc.Driver");
System.out.println("드라이버 로딩 성공");
InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mariaDB");
System.out.println("Connection Pool 생성");
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(NamingException e) {
e.printStackTrace();
}
}
private JdbcUtil() {}
public static JdbcUtil getInstance() {
return instance;
}
public Connection getConnection() throws SQLException {
return ds.getConnection(); //풀에서 커넥션 반환
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ page import="java.util.List"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
BoardDao dao = new BoardDao();
List<boardVo> ls = dao.selectAll();
pageContext.setAttribute("ls", ls);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
</head>
<body>
<h2>게시글 목록</h2>
<table border="1">
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>등록일</th>
<th>조회수</th>
</tr>
<c:forEach var="board" items="${ls}">
<tr>
<td>${board.num}</td>
<td><a href="${pageContext.request.contextPath}/board/boardDetail.jsp?num=${board.num}">${board.title}</a></td>
<td>${board.writer}</td>
<td>${board.regdate}</td>
<td>${board.cnt}</td>
</tr>
</c:forEach>
</table>
<a href="<c:url value="/board/registForm.jsp"/>"><button>글등록</button></a>
</body>
</html>
registForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 등록</title>
</head>
<body>
<h3>등록하기</h3>
<form action="regist.jsp" method="post">
<input type="text" name="title" placeholder="제목" required><br>
<input type="text" name="writer" placeholder="작성자" required><br>
<textarea rows="4" cols="20" name="content" placeholder="내용"></textarea>
<input type="submit" value="등록">
</form>
</body>
</html>
regist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="vo" class="board.boardVo"/>
<jsp:useBean id="dao" class="board.BoardDao"/>
<jsp:setProperty name="vo" property="*"/>
<%
dao.insert(vo);
//response.sendRedirect(request.getContextPath() + "/board/list.jsp");
%>
<c:redirect url="${pageContext.request.contextPath}/list.jsp"></c:redirect> <!-- 등록 후 리스트로 -->
boardDetail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<jsp:useBean id = "dao" class="board.BoardDao"/>
<%
int num = Integer.parseInt(request.getParameter("num"));
boardVo vo = dao.selectOne(num);
pageContext.setAttribute("vo", vo);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 내용</title>
</head>
<body>
<h3>글 정보</h3>
<p>번호:${vo.num}</p>
<p>제목:${vo.title}</p>
<p>작성자:${vo.writer}</p>
<p>내용:${vo.content}</p>
<p>등록일자:${vo.regdate}</p>
<p>조회수:${vo.cnt}</p>
<a href="<c:url value="/board/editForm.jsp?num=${vo.num}"/>"><button>수정</button></a>
<a href="<c:url value="/board/deleteForm.jsp?num=${vo.num}"/>"><button>삭제</button></a>
<a href="<c:url value="/board/list.jsp"/>"><button>목록</button></a>
</body>
</html>
editForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<jsp:useBean id = "dao" class="board.BoardDao"/>
<%
int num = Integer.parseInt(request.getParameter("num"));
boardVo vo = dao.selectOne(num);
pageContext.setAttribute("vo", vo);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 수정</title>
</head>
<body>
<h3>수정하기</h3>
<form action="edit.jsp" method="post">
<input type="hidden" name="num" value="${vo.num}">
<input type="text" name="title" value="${vo.title}" required><br>
<input type="text" name="writer" value="${vo.writer}" required disabled><br>
<textarea rows="4" cols="20" name="content" placeholder="내용">${vo.content}</textarea>
<input type="submit" value="수정">
</form>
</body>
</html>
edit.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="vo" class="board.boardVo"/>
<jsp:useBean id="dao" class="board.BoardDao"/>
<jsp:setProperty name="vo" property="*"/>
<%
dao.update(vo);
pageContext.setAttribute("vo", vo);
//response.sendRedirect(request.getContextPath() + "/board/list.jsp");
%>
<c:redirect url="${pageContext.request.contextPath}/boardDetail.jsp?num=${vo.num}"></c:redirect>
<!-- 게시글 번호 가져와 boardDetail로 넘어감 -->
deleteForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>삭제</title>
</head>
<body>
<%
int num = Integer.parseInt(request.getParameter("num"));
%>
<form action="delete.jsp">
<input type="hidden" value="<%=num %>" name="num">
삭제 하시겠습니까?<input type="submit" value="예">
</form>
</body>
</html>
delete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="board.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<jsp:useBean id="dao" class="board.BoardDao"/>
<%
int num = Integer.parseInt(request.getParameter("num"));
dao.delete(num);
%>
<c:redirect url="${pageContext.request.contextPath}/list.jsp"></c:redirect>
<!-- 삭제 후 목록으로 -->
실행 결과 순서대로 ⬇