1. 아래 조건을 만족하는 웹사이트 구축을 위한 프로그램 작성
조건)
- JSP&JDBC를 이용한 방명록 프로젝트 작성.
- 일반 사용자가 웹페이지에 방문해서 방명록 글을 남길 수 있다. 글쓴이, 패스워드, 글내용을 입력한다. insert 버튼 클릭시 서버로 전송되어서 데이터베이스에 저장된다. 입력시 글자수를 확인해서 출력하도록 자바스크립트로 처리한다. 서버 전송 전에 빈 항목이 없도록 자바스크립트로 통제한다.
- 일반 사용자가 웹페이지에 방문해서 방명록 글을 볼 수 있다. 번호, 글쓴이, 글내용, 작성일이 출력된다. 작성일은 오늘인 경우로 '오늘'로 출력되고, 오늘 이전 날짜인 경우 날짜가 출력되도록 한다.
- 결혼 날짜는 수료일(2015.7.3)로 작성하고 남은 일수가 자동 계산되어서 출력되도록 한다. 남은 날짜 계산 과정은 자바스크립트 함수를 이용한다.
- 삭제 버튼 선택시 패스워드 입력 여부를 확인하고, 패스워드와 글번호를 서버로 전송하고, 서버에서 패스워드와 글번호를 수신한 다음 데이터베이스 질의를 통해서 패스워드가 맞는 경우 해당 게시글이 삭제가 되도록 한다.
2. 데이터베이스 구성
- 방명록 저장 테이블
CREATE TABLE board (
bid NUMBER --PK
,writer NVARCHAR2(30)
,pw VARCHAR2(30)
,content NVARCHAR2(200)
,writeDay DATE DEFAULT SYSDATE
);
ALTER TABLE board
ADD CONSTRAINT board_bid_pk PRIMARY KEY (bid);
CREATE SEQUENCE boardSeq;
INSERT INTO board (bid, writer, pw, content)
VALUES (boardSeq.nextval, '주인장(홍길동, 박길순)', '1234', '많이 축하해주세요. 추가로 결혼식 사진도 올릴 예정입니다.');
COMMIT;
3. 화면 구성
4. 프로그램 구성
//MyTable.css
//DBConn.java
//Board.java
//BoardDAO.java
//BoardMain.jsp
//BoardInsert.jsp
//BoardDelete.jsp
5. 프로그램 소스 코드
//MyTable.css
@CHARSET "EUC-KR";
#customers
{
font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
width:100%;
border-collapse:collapse;
}
#customers td, #customers th
{
font-size:1em;
border:1px solid #98bf21;
padding:3px 7px 2px 7px;
}
#customers th
{
font-size:1.1em;
text-align:left;
padding-top:5px;
padding-bottom:4px;
background-color:#A7C942;
color:#ffffff;
}
#customers tr.alt td
{
color:#000000;
background-color:#EAF2D3;
}
//DBConn.java
package com.test;
import java.sql.*;
//데이터베이스 연결 및 마무리 액션 클래스
public class DBConn {
//static 접근제어자
//-> 객체 간의 데이터 공유
//-> 객체 생성 과정 없이 접근 가능
//-> 클래스이름.메소드()
//-> static 멤버는 static 멤버와만 접근 가능
private static Connection conn;
public static Connection getConnection()
throws ClassNotFoundException, SQLException {
if (conn == null) {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:사용자아이디/패스워드@IP주소:1521:xe");
}
return conn;
}
public static void close() throws SQLException {
if (conn != null) {
conn.close();
}
conn = null;
}
}
//Board.java
package com.test;
public class Board {
private String bid, writer, pw, content, writeday;
public String getWriteday() {
return writeday;
}
public void setWriteday(String writeday) {
this.writeday = writeday;
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
//BoardDAO.java
package com.test;
import java.sql.*;
import java.util.*;
public class BoardDAO {
public ArrayList<Board> list(){
ArrayList<Board> result = new ArrayList<Board>();
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBConn.getConnection();
/*
SELECT bid , writer , pw, content
, DECODE(TO_CHAR(writeday, 'YYYY-MM-DD'), TO_CHAR(SYSDATE, 'YYYY-MM-DD'), '오늘', TO_CHAR(writeday, 'YYYY-MM-DD')) AS writeday
FROM board
ORDER BY bid;
*/
String sql = "SELECT bid , writer , pw, content, DECODE(TO_CHAR(writeday, 'YYYY-MM-DD'), TO_CHAR(SYSDATE, 'YYYY-MM-DD'), '오늘', TO_CHAR(writeday, 'YYYY-MM-DD')) AS writeday FROM board ORDER BY bid";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
Board b = new Board();
b.setBid(rs.getString("bid"));
b.setWriter(rs.getString("writer"));
b.setContent(rs.getString("content"));
b.setWriteday(rs.getString("writeday"));
result.add(b);
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
}catch(Exception e){
e.printStackTrace();
}
try {
DBConn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
public int add(Board b) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBConn.getConnection();
/*
INSERT INTO board (bid, writer, pw, content)
VALUES (boardSeq.nextval, '주인장(홍길동, 박길순)', '1234', '많이 축하해주세요. 추가로 결혼식 사진도 올릴 예정입니다.');
*/
String sql = "INSERT INTO board (bid, writer, pw, content) VALUES (boardSeq.nextval, ?, ?, ?)";
pstmt = conn.prepareStatement(sql);
//데이터 바인딩
pstmt.setString(1, b.getWriter());
pstmt.setString(2, b.getPw());
pstmt.setString(3, b.getContent());
result = pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
}catch(Exception e){
e.printStackTrace();
}
try {
DBConn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
public int remove(Board b) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBConn.getConnection();
/*
DELETE FROM board
WHERE bid=1 AND pw='1234';
*/
String sql = "DELETE FROM board WHERE bid=? AND pw=?";
pstmt = conn.prepareStatement(sql);
//데이터 바인딩
pstmt.setString(1, b.getBid());
pstmt.setString(2, b.getPw());
result = pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
}catch(Exception e){
e.printStackTrace();
}
try {
DBConn.close();
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
}
//BoardMain.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.test.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
StringBuilder sb = new StringBuilder();
BoardDAO dao = new BoardDAO();
for (Board b : dao.list()) {
sb.append(String.format("<tr>"));
sb.append(String.format("<td>%s</td>", b.getBid()));
sb.append(String.format("<td>%s</td>", b.getWriter()));
sb.append(String.format("<td>%s</td>", b.getContent()));
sb.append(String.format("<td>%s</td>", b.getWriteday()));
sb.append(String.format("<td><input type=\"button\" class=\"deleteBtn\" value=\"삭제\"></td>" ));
sb.append(String.format("</tr>\r\n"));
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>홍길동, 박길순의 결혼식 청첩장</title>
<link rel="stylesheet" type="text/css" href="MyTable.css">
<style type="text/css">
div {font-size:10pt;}
h1 {font-size:14pt;}
.red {color:red}
</style>
<script type="text/javascript">
window.onload=function() {
//날짜 계산 출력 함수
dday();
var myForm = document.getElementById("myForm");
var writer = document.getElementById("writer");
var pw = document.getElementById("pw");
var content = document.getElementById("content");
writer.onkeyup=function() {
document.getElementById("writerLength").innerText = writer.value.length;
};
pw.onkeyup=function() {
document.getElementById("pwLength").innerText = pw.value.length;
};
content.onkeyup=function() {
document.getElementById("contentLength").innerText = content.value.length;
};
document.getElementById("insertBtn").onclick=function() {
if (writer.value == "" || pw.value == "" || content.value=="") {
alert("빈 항목(글쓴이, 패스워드, 내용)을 채워야 합니다.");
} else {
myForm.action="BoardInsert.jsp";
myForm.submit();
}
};
var btnNodes = document.getElementsByClassName("deleteBtn");
for (var i=0; i<btnNodes.length; ++i) {
var btn = btnNodes[i];
btn.onclick=function() {
var node = this; //<input type="button">
var pnode = node.parentNode; //<td>
var ppnode = pnode.parentNode; //<tr>
var tdNode = ppnode.firstChild; //<td>
var bid = tdNode.innerText; //번호
if (pw.value == "") {
alert("빈 항목(패스워드)을 채워야 합니다.");
} else {
if (confirm(bid + "번 자료를 삭제할까요? 패스워드가 일치하면 삭제됩니다.")) {
myForm.action="BoardDelete.jsp?bid="+bid;
myForm.submit();
}
}
};
}
}
function dday() {
var toDay = new Date();
var dDay = new Date("2015-07-03");
var count = Math.floor((dDay.getTime() - toDay.getTime())/86400000)+1;
document.getElementById("day").innerHTML = "(D-" + count +")";
}
</script>
</head>
<body>
<div>
<p>
<a href="">[Admin Login]</a><br>
<img src="WeddingPhoto.jpg" width="100%">
</p>
<h1>홍길동, 박길순의 결혼식 청첩장 사이트</h1>
<p>
일시 : 2015.07.03 <span class="red" id="day">(D-0)</span><br>
장소 : SSIT<br>
찾아오시는 방법 : 지하철 2호선 역삼역 3번 출구 한독빌딩 8층<br>
</p>
<p>방명록에 글을 남겨주세요</p>
<form method="post" id="myForm">
<table id="customers">
<tr>
<td style="width: 100px">글쓴이*</td>
<td><input type="text" id="writer" name="writer" required="required" maxlength="30"> (<span class="red" id="writerLength">0</span>/30)</td>
</tr>
<tr>
<td>패스워드*</td>
<td>
<input type="password" id="pw" name="pw" required="required" maxlength="30"> (<span class="red" id="pwLength">0</span>/30)
</td>
</tr>
<tr>
<td>내용*</td>
<td>
<input type="text" style="width: 80%" id="content" name="content" required="required" maxlength="200"> (<span class="red" id="contentLength">0</span>/200)
<input type="button" value="insert" id="insertBtn">
</td>
</tr>
</table>
<table id="customers">
<tr>
<th style="width: 60px;">번호</th>
<th>글쓴이</th>
<th>글내용</th>
<th style="width: 100px;">작성일</th>
<th style="width: 60px;">삭제</th>
</tr>
<!--
<tr>
<td>1</td>
<td>주인장(홍길동, 박길순)</td>
<td>많이 축하해주세요. 추가로 결혼식 사진도 올릴 예정입니다.</td>
<td>오늘</td>
<td><input type="button" value="delete" class="deleteBtn"></td>
</tr>
<tr>
<td>2</td>
<td>신랑 홍길동의 친구</td>
<td>축하한다!</td>
<td>오늘</td>
<td><input type="button" value="delete" class="deleteBtn"></td>
</tr>
-->
<%=sb.toString()%>
</table>
</form>
</div>
</body>
</html>
//BoardInsert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.test.*" %>
<%
//데이터 수신
request.setCharacterEncoding("UTF-8");
String writer = request.getParameter("writer");
String pw = request.getParameter("pw");
String content = request.getParameter("content");
//데이터베이스 액션
BoardDAO dao = new BoardDAO();
Board b = new Board();
b.setWriter(writer);
b.setPw(pw);
b.setContent(content);
dao.add(b);
//강제 페이지 전환
response.sendRedirect("BoardMain.jsp");
%>
//BoardDelete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.test.*" %>
<%
//데이터 수신
request.setCharacterEncoding("UTF-8");
String bid = request.getParameter("bid");
String pw = request.getParameter("pw");
//데이터베이스 액션
BoardDAO dao = new BoardDAO();
Board b = new Board();
b.setBid(bid);
b.setPw(pw);
dao.remove(b);
//강제 페이지 전환
response.sendRedirect("BoardMain.jsp");
%>
--------------------------------------------
'Test' 카테고리의 다른 글
JSP Test - 문제 (1) | 2015.06.22 |
---|---|
JDBC TEST - 답 (1) | 2015.06.21 |
JDBC TEST - 문제 (0) | 2015.06.21 |
JavaSE - Test 2 (답) (0) | 2015.06.21 |
JavaSE - Test 2 (문제) (0) | 2015.06.21 |