package guestbook;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Vector;
public class CommentMgr {
private DBConnectionMgr pool;
private final SimpleDateFormat SDF_DATE = new SimpleDateFormat("yyyy'년' M'월' d'일' (E)");
public CommentMgr() {
pool = DBConnectionMgr.getInstance();
}
// Comment Insert
//insert tblComment(num,cid,comment,cip,cregDate)values(?,?,?,?,now())
public void insertComment(CommentBean bean) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "insert tblComment(num,cid,comment,cip,cregDate)values(?,?,?,?,now())";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, bean.getNum());
pstmt.setString(2, bean.getCid());
pstmt.setString(3, bean.getComment());
pstmt.setString(4, bean.getCip());
pstmt.executeUpdate();// SQL로 실행
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
// Comment List
// select * from tblComment where num = ?
public Vector<CommentBean> listComment(int num){
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
Vector<CommentBean> vlist = new Vector<CommentBean>();
try {
con = pool.getConnection();
sql = "select * from tblComment where num = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
while(rs.next()) {
CommentBean bean = new CommentBean();
bean.setNum(rs.getInt("num"));
bean.setCid(rs.getString("cid"));
bean.setComment(rs.getString("comment"));
bean.setCip(rs.getString("cip"));
String tempDate = SDF_DATE.format(rs.getDate("cregDate"));
bean.setCregDate(tempDate);
bean.setCnum(rs.getInt("cnum"));
vlist.addElement(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return vlist;
}
// Comment Delete
// delete from tblComment where cnum = ?
public void deleteComment(int cnum) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "delete from tblComment where cnum = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, cnum);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
// Comment All delete
// delete from tblComment where num = ?
public void deleteAllComment(int num) {
Connection con = null;
PreparedStatement pstmt = null;
String sql = null;
try {
con = pool.getConnection();
sql = "delete from tblComment where num = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt);
}
}
}
<!-- showGuestBook.jsp -->
<%@page import="guestbook.CommentBean"%>
<%@page import="java.util.Vector"%>
<%@page import="guestbook.GuestBookBean"%>
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="guestbook.GuestBookMgr"/>
<jsp:useBean id="cmgr" class="guestbook.CommentMgr"/>
<%
String id = (String)session.getAttribute("idKey");
if(id==null){
// 현재 접속된 url 리턴
StringBuffer url = request.getRequestURL();
//out.println(url);
response.sendRedirect("login.jsp?url="+url);
return;
}
%>
<html>
<title>GuestBook</title>
<script type="text/javascript">
function updateFn(num) {
url = "updateGuestBook.jsp?num="+num;
window.open(url, "GuestBook Update", "width=540, height=300");
}
// commentFn(this.form)
function commentFn(frm){
if(frm.comment.value==""){
alert("댓글을 입력하세요");
frm.comment.focus();
return;
}
frm.submit();
}
function disFn(num) {
//alert(num);
var v = "cmt"+num; // cmt7
var e = document.getElementById(v);
if(e.style.display=='none')
e.style.display='block'; // 보이는것
else
e.style.display='none'; // 안보임
}
function delFn(cnum) {
document.delFrm.action="commentProc.jsp"
document.delFrm.cnum.value=cnum;
document.delFrm.submit();
}
</script>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<body bgcolor="#996600">
<div align="center">
<%@include file="postGuestBook.jsp" %>
<table width="520" cellspacing="0" cellpadding="3">
<tr bgcolor="#F5F5F5">
<td><b><%=login.getName()%></b></td>
<td align="right"><a href="logout.jsp">로그아웃</a></b></td>
</tr>
</table>
<!-- GuestBook List Start -->
<%
Vector<GuestBookBean> vlist = mgr.listGuestBook(id, login.getGrade());
//out.print(vlist.size());
if(vlist.isEmpty()){
%> <table width="520" cellspacing="0" cellpadding="7">
<tr>
<td>등록된 글이 없습니다.</td>
</tr>
</table>
<% }else{
for(int i=0;i<vlist.size();i++){
// 방명록 글
GuestBookBean bean = vlist.get(i);
// 방명록 글쓴이
JoinBean writer = mgr.getJoin(bean.getId());
%>
<table width="520" border="1" bordercolor="#000000" cellspacing="0" cellpadding="0">
<tr>
<td>
<table bgcolor="#F5F5F5">
<tr>
<td width="225">NO : <%=vlist.size()-i %> </td>
<td width="225">
<img src="img/face.bmp" border="0" alt="이름">
<a href="mailto:<%=writer.getEmail()%>">
<%=writer.getName() %>
</a>
</td>
<td width="150" align="center">
<%if(writer.getHp()==null || writer.getHp().equals("")){
out.print("홈페이지가 없네요");
}else{
%>
<a href="http://<%=writer.getHp()%>">
<img alt="홈페이지" src="img/hp.bmp" border="0">
</a>
<%}%>
</td>
</tr>
<tr>
<td colspan="3"><%=bean.getContents() %></td>
</tr>
<tr>
<td>IP : <%=bean.getIp() %></td>
<td><%=bean.getRegdate()+" "+bean.getRegtime() %></td>
<td>
<%
// 수정, 삭제 : 로그인 id가 동일 활성
// 삭제: 관리자
// 비밀글 : secret 1일때
boolean chk = login.getId().equals(writer.getId());
if(chk||login.getGrade().equals("1")){
if(chk){
%>
<a href="javascript:updateFn('<%=bean.getNum()%>')">[수정]</a>
<%}//---if2%>
<a href="deleteGuestBook.jsp?num=<%=bean.getNum()%>">[삭제]</a>
<%if(bean.getSecret().equals("1")){%>
비밀글
<%
}//---if3
}//---if1
%>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- Comment List Start -->
<div id="cmt<%=bean.getNum()%>" style="display:none">
<%
Vector<CommentBean> cvlist = cmgr.listComment(bean.getNum());
if(!cvlist.isEmpty()){
%>
<table width="500" bgcolor="#F5F5F5">
<%
for(int j=0;j<cvlist.size();j++){
CommentBean cbean = cvlist.get(j);
%>
<tr>
<td>
<table width="500">
<tr>
<td><b><%=cbean.getCid()%></b> </td>
<td align="right">
<!-- 삭제는 로그인 id 와 댓글 쓴 id랑 동일 -->
<%if(id.equals(cbean.getCid())){ %>
<%-- <a href="commentProc.jsp?flag=delete&cnum=<%=cbean.getCnum()%>">[삭제]</a> --%>
<a href="#" onclick="javascript:delFn('<%=cbean.getCnum()%>')">[삭제]</a>
<%}%>
</td>
</tr>
<tr>
<td colspan="2"><%=cbean.getComment() %></td>
</tr>
<tr>
<td><%=cbean.getCip()%></td>
<td align="right"><%=cbean.getCregDate()%></td>
</tr>
</table>
<hr>
</td>
</tr>
<%}//---for(Comment)%>
</table>
<% } // --if(comment)%>
</div>
<!-- Comment List End -->
<table width="500">
<tr><td>
<button onclick="disFn('<%=bean.getNum()%>')">
댓글<%=cvlist.isEmpty()?"":cvlist.size()%></button>
</td></tr>
</table>
<!-- Comment Form Start -->
<form name="cFrm" method="post" action="commentProc.jsp">
<table>
<tr>
<td>
<textarea placeholder="댓글입력..." name="comment" rows="2"
cols="65" maxlength="1000"></textarea>
</td>
<td>
<input type="button" value="댓글" onclick="commentFn(this.form)">
<input type="hidden" name="flag" value="insert">
<!-- 방명록 글번호 -->
<input type="hidden" name="num" value="<%=bean.getNum()%>">
<!-- 로그인 id -->
<input type="hidden" name="cid" value="<%=login.getId()%>">
<!-- 댓글 입력 ip 주소 -->
<input type="hidden" name="cip" value="<%=request.getRemoteAddr()%>">
</td>
</tr>
</table>
</form>
<!-- Comment Form End -->
<%
} // --GuestBook for
} // -- GuestBook if-else%>
<!-- GuestBook List End -->
<form method="post" name="delFrm">
<input type="hidden" name="flag" value="delete">
<input type="hidden" name="cnum">
</form>
</div>
</body>
</html>
<!-- commentProc.jsp -->
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="cmgr" class="guestbook.CommentMgr"/>
<jsp:useBean id="mgr" class="guestbook.GuestBookMgr"/>
<jsp:useBean id="cbean" class="guestbook.CommentBean"/>
<jsp:setProperty property="*" name="cbean"/>
<%
String flag = request.getParameter("flag");
String method = request.getMethod();
//System.out.println("method :"+ method);
if(method.equalsIgnoreCase("POST")){
if(flag.equals("insert")){
cmgr.insertComment(cbean);
}else if(flag.equals("delete")){
cmgr.deleteComment(cbean.getCnum());
}
}
response.sendRedirect("showGuestBook.jsp");
%>
<!-- deleteGuestBook.jsp -->
<%@page import="guestbook.MyUtil"%>
<%@page contentType="text/html; charset=UTF-8"%>
<jsp:useBean id="mgr" class="guestbook.GuestBookMgr"/>
<jsp:useBean id="cmgr" class="guestbook.CommentMgr"/>
<%
int num = 0;
if(request.getParameter("num")!=null){
num = MyUtil.parseInt(request, "num");
mgr.deleteGuestBook(num);
// 방명록 원글 삭제시 관련된 댓글 모두 삭제
cmgr.deleteAllComment(num);
}
response.sendRedirect("showGuestBook.jsp");
%>
댓글 삭제시 form 에서 get 방식을 사용할 경우
http://localhost/myapp/guestbook/commentProc.jsp?flag=delete&cnum=5
처럼 삭제 주소가 나오기 때문에 post 방식을 사용해야한다.
ex) POST 방식 이외의 GET방식 코드 무시
if(method.equalsIgnoreCase("POST")){
if(flag.equals("insert")){
cmgr.insertComment(cbean);
}else if(flag.equals("delete")){
cmgr.deleteComment(cbean.getCnum());
}
}
<showGuestBook.jsp>
function delFn(cnum) {
document.delFrm.action="commentProc.jsp"
document.delFrm.cnum.value=cnum;
document.delFrm.submit();
}
<td><b><%=cbean.getCid()%></b></td>
<td align="right">
<!-- 삭제는 로그인 id 와 댓글 쓴 id랑 동일 -->
<%if(id.equals(cbean.getCid())){ %>
<%-- <a href="commentProc.jsp?flag=delete&cnum=<%=cbean.getCnum()%>">[삭제]</a> --%>
<a href="#" onclick="javascript:delFn('<%=cbean.getCnum()%>')">[삭제]</a>
<%}%>
</td>
<!-- GuestBook List End -->
<form method="post" name="delFrm">
<input type="hidden" name="flag" value="delete">
<input type="hidden" name="cnum">
</form>
- 로그인 및 회원가입, 회원수정
- package 및 폴더명 : ch14
- table.sql : tblMember, tblZipcode
- zipcode.txt는 HiedSQL실행
- MemberBean.java, ZipcodeBean.java 생성
- DBConnectionMgr.java 복사
DROP TABLE IF EXISTS tblMember;
CREATE TABLE `tblMember` (
`id` char(20) NOT NULL,
`pwd` char(20) NOT NULL,
`name` char(20) NOT NULL,
`gender` char(1) NOT NULL,
`birthday` char(6) NOT NULL,
`email` char(30) NOT NULL,
`zipcode` char(5) NOT NULL,
`address` char(50) NOT NULL,
`hobby` char(5) NOT NULL,
`job` char(20) NOT NULL,
PRIMARY KEY (`id`)
)COLLATE='euckr_korean_ci';
DROP TABLE IF EXISTS tblZipcode;
CREATE TABLE `tblZipcode` (
`zipcode` char(5) NOT NULL,
`area1` char(10) DEFAULT NULL,
`area2` char(20) DEFAULT NULL,
`area3` char(30) DEFAULT NULL
)COLLATE='euckr_korean_ci';
zipcode.txt 파일안의 주소 데이터들 HeidSQL에 tblZipcode 테이블에 넣기
<MemberBean.java>
package ch14;
public class MemberBean {
private String id;
private String pwd;
private String name;
private String gender;
private String birthday;
private String email;
private String zipcode;
private String address;
private String hobby[];
private String job;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String []getHobby() {
return hobby;
}
public void setHobby(String []hobby) {
this.hobby = hobby;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
<ZipcodeBean.java>
package ch14;
public class ZipcodeBean {
private String zipcode;
private String area1;
private String area2;
private String area3;
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getArea1() {
return area1;
}
public void setArea1(String area1) {
this.area1 = area1;
}
public String getArea2() {
return area2;
}
public void setArea2(String area2) {
this.area2 = area2;
}
public String getArea3() {
return area3;
}
public void setArea3(String area3) {
this.area3 = area3;
}
}
package ch14;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MemberMgr {
private DBConnectionMgr pool;
public MemberMgr() {
pool = DBConnectionMgr.getInstance();
}
// 로그인: 성공 -> true
public boolean loginMember(String id, String pwd) {
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql = null;
boolean flag = false;
try {
con = pool.getConnection();
sql = "select id from tblMember where id = ? and pwd = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1,id);
pstmt.setString(2,pwd);
rs = pstmt.executeQuery();
flag = rs.next();
} catch (Exception e) {
e.printStackTrace();
} finally {
pool.freeConnection(con, pstmt, rs);
}
return flag;
}
}