SELECT * FROM javadb.board;
SELECT seq, title, user_id, create_date, cnt FROM board WHERE deleted_yn = 'N' order by seq DESC;
SELECT seq, title, contents, user_id, create_date, update_date, cnt FROM board
WHERE seq = 1;
INSERT INTO board(title, contents, user_id, create_date)
VALUES ('제목5', '내용5', 'test5', now());
UPDATE board SET title = '제목4', contents = '내용4', update_date = now() WHERE seq = 5;
DELETE FROM board WHERE seq = 5;
UPDATE board SET deleted_yn = 'Y' WHERE seq = 5;
UPDATE board SET cnt = cnt + 1 WHERE seq = 2;
프로젝트명: jspBoardGJY
데이터베이스명 : t_board
컬럼명 : 글번호(idx, int), 글제목(title, varchar(50), NN), 글내용(contents, varchar(500)), 글쓴이(user_id, varchar(45), NN), 글비밀번호(pwd, varchar(45), NN), 글등록시간(create_dt, datetime, NN), 글수정시간(update_dt, datetime), 조회수(hit_cnt, int, 기본값: 0), 글삭제여부(deleted_yn, char(1), 기본값: 'N')
추가 : 추천수(like_cnt, int, 기본값: 0)
DB
dbconn.jsp
<%@ page import="java.sql.*" %>
<%
Connection conn = null;
String url = "jdbc:mysql://localhost:3306/javadb";
String user = "test1";
String passwd = "java505";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, user, passwd);
%>
tBoardList.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
<head>
<title>글 목록</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<%@ include file="dbconn.jsp"%>
<header class="container mt-3">
<div class="p-5 mb-4 bg-light rounded-3">
<div class="container-fluid py-4">
<h1 class="text-center">게시물 리스트 페이지</h1>
</div>
</div>
</header>
<main class="container mt-4">
<div class="row">
<div class="col-sm">
<table class="table table-hover table striped">
<thead>
<tr>
<th>글번호</th>
<th>글제목</th>
<th>글쓴이</th>
<th>등록시간</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<%
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
String sql = "SELECT idx, title, user_id, create_dt, hit_cnt FROM t_board WHERE deleted_yn = 'N' order by idx DESC";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
int idx = rs.getInt("idx");
String title = rs.getString("title");
String userId = rs.getString("user_id");
String createDt = rs.getString("create_dt");
int cnt = rs.getInt("hit_cnt");
%>
<tr>
<td><%=idx%></td>
<td><a href="tBoardDetail.jsp?idx=<%=idx%>"><%=title%></a></td>
<td><%=userId%></td>
<td><%=createDt%></td>
<td><%=cnt%></td>
</tr>
<%
}
}
catch (SQLException e) {
out.println("SQLException : " + e.getMessage());
}
finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
</tbody>
</table>
<div class="d-flex justify-content-end">
<a href="write.jsp" class="btn btn-info">글쓰기</a>
</div>
</div>
</div>
</main>
<footer class="container-fluid mt-5 p-5 border-top">
<p class="lead text-muted text-center">made by bitc java505</p>
</footer>
</body>
</html>
tBoardDetail.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>상세 글 읽기</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
window.addEventListener('DOMContentLoaded', function () {
const btnList = document.querySelector('#btn-list');
const btnUpdate = document.querySelector('#btn-update');
const btnDelete = document.querySelector('#btn-delete');
const frm = document.querySelector('#frm');
btnList.addEventListener('click', function () {
history.back();
});
btnUpdate.addEventListener('click', function () {
frm.action = "tBoardUpdate_process.jsp";
frm.submit();
});
btnDelete.addEventListener('click', function () {
frm.action = "tBoardDelete_process.jsp";
frm.submit();
});
});
</script>
</head>
<body>
<%@ include file="dbconn.jsp"%>
<%
// tBoardList 에서 넘겨받은 idx
int idx = Integer.parseInt(request.getParameter("idx"));
String title = "";
String contents = "";
String userId = "";
String pwd = "";
String createDate = "";
String updateDate = "";
int hitCnt = 0;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// hitCnt 카운트업
String sql = "UPDATE t_board SET hit_cnt = hit_cnt + 1 WHERE idx = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, idx);
pstmt.executeUpdate();
// 쿼리문 재셋팅
sql = "SELECT idx, title, contents, user_id, pwd, create_dt, update_dt, hit_cnt FROM t_board ";
sql += "WHERE idx = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, idx);
rs = pstmt.executeQuery();
if (rs.next()) {
title = rs.getString("title");
contents = rs.getString("contents");
userId = rs.getString("user_id");
pwd = rs.getString("pwd");
createDate = rs.getString("create_dt");
updateDate = rs.getString("update_dt");
hitCnt = rs.getInt("hit_cnt");
}
}
catch (SQLException e) {
out.println("SQLExceprion : " + e.getMessage());
}
finally {
if (rs != null) {
rs.close();
}
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
%>
<header class="container mt-3">
<div class="p-5 mb-4 bg-light rounded-3">
<div class="container-fluid py-4">
<h1 class="text-center">상세 글 읽기 페이지</h1>
</div>
</div>
</header>
<main class="container mt-5">
<div class="row">
<form action="#" method="post" id="frm">
<input type="hidden" name="pwd" value="<%=pwd%>">
<div class="col-sm-6 mx-auto">
<div class="form-floating my-3">
<input type="text" class="form-control" id="idx" name="idx" placeholder="글 번호를 입력하세요" readonly value="<%=idx%>">
<label for="idx" class="form-label">글 번호</label>
</div>
<div class="form-floating my-3">
<input type="text" class="form-control" id="title" name="title" placeholder="제목을 입력하세요" value="<%=title%>">
<label for="title" class="form-label">글 제목</label>
</div>
<div class="form-floating my-3">
<input type="text" class="form-control" id="user-id" name="userId" placeholder="ID를 입력하세요" readonly value="<%=userId%>">
<label for="user-id" class="form-label">아이디</label>
</div>
<div class="form-floating my-3">
<input type="password" class="form-control" id="user-pw" name="userPwd" placeholder="비밀번호를 입력하세요">
<label for="user-pw" class="form-label">비밀번호</label>
</div>
<div class="form-floating my-3">
<input type="text" class="form-control" id="create-date" name="createDate" placeholder="날짜를 입력하세요" readonly value="<%=createDate%>">
<label for="create-date" class="form-label">등록 날짜</label>
</div>
<div class="form-floating my-3">
<input type="text" class="form-control" id="hit-cnt" name="hitCnt" placeholder="조회수를 입력하세요" readonly value="<%=hitCnt%>">
<label for="hit-cnt" class="form-label">조회수</label>
</div>
<div class="form-floating my-3">
<textarea class="form-control" id="contents" name="contents" rows="10" placeholder="내용을 입력하세요"><%=contents%></textarea>
<label for="contents" class="form-label">내용</label>
</div>
<div class="my-3 row">
<div class="col-sm">
<button class="btn btn-secondary" type="button" id="btn-list">목록으로</button>
</div>
<div class="col-sm d-flex justify-content-end">
<button class="btn btn-warning me-2" type="button" id="btn-update">수정</button>
<button class="btn btn-danger" type="button" id="btn-delete">삭제</button>
</div>
</div>
</div>
</form>
</div>
</main>
</body>
</html>
write.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>글쓰기</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script>
window.addEventListener('DOMContentLoaded', function () {
const btnBack = document.querySelector('#btn-back');
btnBack.addEventListener('click', function () {
history.back();
});
});
</script>
</head>
<body>
<header class="container mt-3">
<div class="p-5 mb-4 bg-light rounded-3">
<div class="container-fluid py-1">
<h1 class="text-center">게시물 글쓰기 페이지</h1>
</div>
</div>
</header>
<main class="container mt-5">
<div class="row">
<div class="col-sm-6 mx-auto">
<form action="write_process.jsp" method="post" class="border rounded-3 p-4">
<div class="form-floating my-3">
<input type="text" class="form-control" id="title" name="title" placeholder="제목을 입력하세요.">
<label for="title" class="form-label">제목</label>
</div>
<div class="form-floating my-3">
<input type="text" class="form-control" id="user_id" name="userId" placeholder="아이디를 입력하세요">
<label for="user_id" class="form-label">아이디</label>
</div>
<div class="form-floating my-3">
<input type="password" class="form-control" id="user_pw" name="userPw" placeholder="비밀번호를 입력하세요">
<label for="user_pw" class="form-label">비밀번호</label>
</div>
<div class="form-floating row-6 my-3">
<textarea class="form-control" name="contents" id="contents" cols="30" rows="30" placeholder="내용을 입력하세요"></textarea>
<label for="contents" class="form-label">내용</label>
</div>
<div class="d-grid gap-2">
<button class="btn btn-info" type="submit">글쓰기</button>
<button class="btn btn-secondary" type="button" id="btn-back">돌아가기</button>
</div>
</form>
</div>
</div>
</main>
<footer class="container-fluid mt-5 p-5 border-top">
<p class="lead text-muted text-center">made by bitc java505</p>
</footer>
</body>
</html>
write_process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ include file="dbconn.jsp"%>
<%
request.setCharacterEncoding("UTF-8");
String title = request.getParameter("title");
String userId = request.getParameter("userId");
String userPw = request.getParameter("userPw");
String contents = request.getParameter("contents");
PreparedStatement pstmt = null;
try {
String sql = "INSERT INTO t_board(title, contents, user_id, pwd, create_dt) ";
sql += "VALUES (?, ?, ?, ?, now()) ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, title);
pstmt.setString(2, contents);
pstmt.setString(3, userId);
pstmt.setString(4, userPw);
pstmt.executeUpdate();
}
catch (SQLException e) {
out.println("SQLException : " + e.getMessage());
}
finally {
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
response.sendRedirect("tBoardList.jsp");
%>
상세 글 페이지에서 이동, 비밀번호 입력 부분 필요
+) 비밀번호 넣어야 수정되게
tBoardUpdate.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ include file="dbconn.jsp"%>
<%
request.setCharacterEncoding("UTF-8");
int idx = Integer.parseInt(request.getParameter("idx"));
String title = request.getParameter("title");
String contents = request.getParameter("contents");
String pwd = request.getParameter("pwd");
String userPwd = request.getParameter("userPwd");
if (pwd.equals(userPwd)) {
String sql = "UPDATE t_board SET title = ?, contents = ? ";
sql += "WHERE idx = ? ";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, title);
pstmt.setString(2, contents);
pstmt.setInt(3, idx);
pstmt.executeUpdate();
} catch (SQLException e) {
out.println("SQLException : " + e.getMessage());
} finally {
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
response.sendRedirect("tBoardList.jsp");
}
else {
out.println("비밀번호가 틀렸습니다.");
}
%>
상세 글 페이지에서 이동, 비밀번호 입력 부분 필요
+) 비밀번호 넣어야 삭제되게
tBoardDelete_process.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ include file="dbconn.jsp"%>
<%
request.setCharacterEncoding("UTF-8");
int idx = Integer.parseInt(request.getParameter("idx"));
String userPwd = request.getParameter("userPwd");
String pwd = request.getParameter("pwd");
if (pwd.equals(userPwd)) {
String sql = "UPDATE t_board SET deleted_yn = 'Y' ";
sql += "WHERE idx = ?";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, idx);
pstmt.executeUpdate();
} catch (SQLException e) {
out.println("SQLException : " + e.getMessage());
} finally {
if (pstmt != null) {
pstmt.close();
}
if (conn != null) {
conn.close();
}
}
response.sendRedirect("tBoardList.jsp");
}
else {
out.println("비밀번호가 틀렸습니다.");
}
%>
데이터베이스명 : t_member
컬럼명 : 사용자index(user_idx, int, PK), 사용자id(user_id, varchar(45), UQ, NN), 비밀번호(user_pw, varchar(45), NN), 사용자명(user_name, varchar(45), NN), 이메일(user_email, varchar(45), NN)