[JSP] 방명록 만들기
by 무작정 개발반응형
2022.02.17~18(39~40일 차)
오늘부터 이틀간 방명록 만들기 진행~
오늘의 수업 내용
방명록 기능
- Insert(작성) - 방명록 작성
- Delete(삭제) - 방명록 삭제
- 페이징
방명록 페이지 구성
- guest.jsp
- delete.jsp
- save.jsp
방명록 제작 순서
- DB 테이블 생성
- GuestDTO, GuestDAO 클래스 생성
- JSP페이지(guest, delete 등) 생성
1. Table 생성하기 - (테이블 이름 : guest)
Table 생성
CREATE TABLE GUEST
(NUM NUMBER(9) NOT NULL,
NAME VARCHAR2(20) NOT NULL,
EMAIL VARCHAR2(50),
HOMEPAGE VARCHAR2(50),
CONTENT VARCHAR2(4000),
CREATED DATE,
IPADDR VARCHAR2(20),
CONSTRAINT PK_GUEST_NUM PRIMARY KEY(NUM));
Table 생성 확인 - (검색해보기)
2. GuestDTO, GuestDAO 클래스 생성
GuestDTO 클래스 생성
package com.guest;
public class GuestDTO {
private int num;
private String name;
private String email;
private String homepage;
private String content;
private String created;
private String ipAddr;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getHomepage() {
return homepage;
}
public void setHomepage(String homepage) {
if(homepage==null)
this.homepage = "";
else if(homepage.equalsIgnoreCase("http://"))
this.homepage = "";
else
this.homepage = homepage;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreated() {
return created;
}
public void setCreated(String created) {
this.created = created;
}
public String getIpAddr() {
return ipAddr;
}
public void setIpAddr(String ipAddr) {
this.ipAddr = ipAddr;
}
}
GuestDAO 클래스 생성
package com.guest;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
//DAO는 테이블에 데이터를 넣는 클래스이기때문에 table을 만들었으면 dao도 만들 수 있음
public class GuestDAO {
//의존성 주입(객체를 생성함에 동시에 초기화)
private Connection conn = null;
public GuestDAO(Connection conn) {
this.conn = conn;
}
//num의 최대값
public int getMaxNum() {
int maxNum = 0;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select nvl(max(num),0) from guest";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) {
maxNum = rs.getInt(1);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return maxNum;
}
//입력
public int insertData(GuestDTO dto) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into guest (num,name,email,homepage,";
sql+= "content,created,ipAddr) ";
sql+= "values (?,?,?,?,?,sysdate,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dto.getNum());
pstmt.setString(2, dto.getName());
pstmt.setString(3, dto.getEmail());
pstmt.setString(4, dto.getHomepage());
pstmt.setString(5, dto.getContent());
pstmt.setString(6, dto.getIpAddr());
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//전체 데이터(가져오기)
public List<GuestDTO> getLists() {
List<GuestDTO> lists = new ArrayList<GuestDTO>();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select num,name,email,homepage,content,";
sql+= "created,ipAddr from guest ";
sql+= "order by num desc";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
GuestDTO dto = new GuestDTO();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setEmail(rs.getString("email"));
dto.setHomepage(rs.getString("homepage"));
dto.setContent(rs.getString("content"));
dto.setCreated(rs.getString("created"));
dto.setIpAddr(rs.getString("ipAddr"));
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
//삭제
public int deleteData(int num) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "delete guest where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,num);
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
}
JSP 페이지 생성
방명록 page - guest.jsp
<%@page import="com.util.MyUtil"%>
<%@page import="com.guest.GuestDTO"%>
<%@page import="java.util.List"%>
<%@page import="com.util.DBConn"%>
<%@page import="com.guest.GuestDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
//Connection conn = DBConn.getConnection();
//GuestDAO dao = new GuestDAO(conn);
//위의 2줄을 1줄로 가능
GuestDAO dao = new GuestDAO(DBConn.getConnection());
MyUtil myUtil = new MyUtil();
List<GuestDTO> lists = null;
int dataCount = dao.getDataCount();
//Myutil에서 page가 넘어온다.
String pageNum = request.getParameter("pageNum");
int currentPage = 1;
if(pageNum!=null) {
currentPage = Integer.parseInt(pageNum);
}
int numPerPage = 5;
int totalPage = 0;
//이건 혹시나 해서 검사하기 0이 아닐때만 실행해라
if(dataCount!=0) {
totalPage = myUtil.getPageCount(numPerPage, dataCount);
}
if(currentPage>totalPage) {
currentPage = totalPage;
}
int start = (currentPage-1) * numPerPage + 1;
int end = currentPage * numPerPage;
lists = dao.getLists(start,end);
String urlList = cp + "/guest/guest.jsp";
String pageIndexList =
myUtil.pageIndexList(currentPage, totalPage, urlList);
//int num = Integer.parseInt(request.getParameter("num"));
//response.sendRedirect("guest.jsp?num=" + num);
DBConn.close();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>방명록</title>
<link rel="stylesheet" href="<%=cp%>/guest/data/style.css"/>
<script type="text/javascript" src="<%=cp%>/guest/data/guest.js"></script>
<script type="text/javascript">
function isDelete(num) {
location.href="<%=cp%>/guest/delete.jsp?num=" + num;
}
</script>
</head>
<body>
<br/><br/>
<table width="560" border="2" cellpadding="0" cellspacing="0"
bordercolor="#d6d4a6" style="margin: auto;">
<tr height="40">
<td style="padding-left: 20px;">
<b>방 명 록</b>
</td>
</tr>
</table>
<br/>
<form action="" method="post" name="myForm">
<table width="560" border="0" cellpadding="0" cellspacing="3"
style="margin: auto;">
<tr><td colspan="2" height="3" bgcolor="#dbdbdb" align="center"></td></tr>
<tr>
<td width="20%" height="30" bgcolor="#eeeeee" style="padding-left: 20px;">
작성자
</td>
<td width="80%" style="padding-left: 10px;">
<input type="text" name="name" size="35" maxlength="20" class="boxTF"/>
</td>
</tr>
<tr><td colspan="2" height="1" bgcolor="#dbdbdb" align="center"></td></tr>
<tr>
<td width="20%" height="30" bgcolor="#eeeeee" style="padding-left: 20px;">
E-Mail
</td>
<td width="80%" style="padding-left: 10px;">
<input type="text" name="email" size="35" maxlength="50" class="boxTF"/>
</td>
</tr>
<tr><td colspan="2" height="1" bgcolor="#dbdbdb" align="center"></td></tr>
<tr>
<td width="20%" height="30" bgcolor="#eeeeee" style="padding-left: 20px;">
홈페이지
</td>
<td width="80%" style="padding-left: 10px;">
<input type="text" name="homepage" size="35" maxlength="50" class="boxTF"
value="http://"/>
</td>
</tr>
<tr><td colspan="2" height="1" bgcolor="#dbdbdb" align="center"></td></tr>
<tr>
<td width="20%" height="30" bgcolor="#eeeeee" style="padding-left: 20px;">
내 용
</td>
<td width="80%" style="padding-left: 10px;">
<textarea rows="7" cols="60" name="content" class="boxTA"></textarea>
</td>
</tr>
<tr><td colspan="2" height="3" bgcolor="#dbdbdb" align="center"></td></tr>
</table>
<table width="560" border="0" cellpadding="0" cellspacing="3"
style="margin: auto;">
<tr align="center">
<td height="40">
<input type="button" value=" 등록하기 " class="btn1" onclick="sendIt();"/>
<input type="reset" value=" 다시입력 " class="btn1"
onclick="document.myForm.name.focus();"/>
</td>
</tr>
</table>
</form>
<table width="560" border="0" cellpadding="0" cellspacing="0" style="margin: auto;">
<tr><td height="3" bgcolor="#dbdbdb" align="center"></td></tr>
</table>
<%for(GuestDTO dto : lists){ %>
<table width="560" border="0" cellpadding="0" cellspacing="0" bgcolor="#eeeeee"
style="margin: auto;">
<tr height="20">
<td width="50%" style="padding-left: 5px;">
<%if(dto.getEmail()==null) { %>
<b>No <%=dto.getNum() %>. <%=dto.getName() %></b>
<%}else{ %>
<b>No <%=dto.getNum() %>. <%=dto.getName() %>
(<a href="mailto:<%=dto.getEmail() %>"><%=dto.getEmail() %></a>)</b>
<%} %>
</td>
<td align="right" style="padding: 5px;">
<%if(!dto.getHomepage().equals("")) { %>
홈페이지 : <a href="<%=dto.getHomepage() %>" target="_blank">
<%=dto.getHomepage() %></a>
<%}else{
out.print(" ");
} %>
</td>
</tr>
<tr height="20">
<td style="padding-left: 5px;">
작성일 : <%=dto.getCreated() %> (<%=dto.getIpAddr() %>)
</td>
<td align="right" style="padding: 5px;">
<a href="javascript:isDelete('<%=dto.getNum() %>')">삭제</a>
</td>
</tr>
<tr><td colspan="2" bgcolor="#dbdbdb" height="1"></td></tr>
<tr>
<td bgcolor="#ffffff" colspan="2" height="20" valign="top" style="padding-left: 5px;">
<%=dto.getContent().replace("\r", "<br/>") %>
</td>
</tr>
<tr><td colspan="2" bgcolor="#dbdbdb" height="3"></td></tr>
</table>
<%} %>
<%if(dataCount==0) { %>
<table width="560" border="0" cellpadding="0" cellspacing="0"
bgcolor="#eeeeee" style="margin: auto;">
<tr align="center" height="50">
<td>
<b>등록된 자료가 없습니다.</b>
</td>
</tr>
</table>
<%}else{ %>
<table width="560" border="0" cellpadding="0" cellspacing="0"
bgcolor="#ffffff" style="margin: auto;">
<tr align="center" height="30">
<td>
<%=pageIndexList %>
</td>
</tr>
</table>
<%} %>
<br/><br/>
</body>
</html>
위의 사진을 보면 노란 선을 기준으로 2번 부분은 확장 for문을 사용해서 DB의 데이터를 가져와서 보여줍니다.
방명록이 0개이면 DB에도 데이터가 없기에 '등록된 자료가 없습니다'라는 문구를 보여줄 수 있게 했습니다.
방명록 삭제 기능 - delete.jsp
<%@page import="com.guest.GuestDAO"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
int num=Integer.parseInt(request.getParameter("num"));
Connection conn=DBConn.getConnection();
GuestDAO dao = new GuestDAO(conn);
dao.deleteData(num);
DBConn.close();
response.sendRedirect("guest.jsp");
%>
방명록 페이지는 메인 페이지에서 글 작성, 글 삭제가 이루어지기 때문에 자기 자신(guest.jsp)을 호출한다.
그리고 DB를 생성할때 PK를 NUM으로 설정했습니다. 그래서 삭제를 할 때도 NUM을 가지고 와서 삭제를 합니다.
delete.jsp페이지에서 request.getParameter로 num을 받고 Parameter은 자료형이 Object이기 때문에 int로 형 변환해서 받는다.
int num=Integer.parseInt(request.getParameter("num"));
방명록 저장 기능 - save.jsp
<%@page import="com.guest.GuestDAO"%>
<%@page import="com.util.DBConn"%>
<%@page import="java.sql.Connection"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String cp = request.getContextPath();
%>
<jsp:useBean id="dto" class="com.guest.GuestDTO" scope="page"></jsp:useBean>
<jsp:setProperty property="*" name="dto"/>
<!-- DB연결해주기 -->
<%
Connection conn = DBConn.getConnection();
GuestDAO dao = new GuestDAO(conn);
int maxNum = dao.getMaxNum(); //최대값 구하기
dto.setNum(maxNum + 1); //dto의 setNum에 maxNum+1의 값을 넣는다
dto.setIpAddr(request.getRemoteAddr()); //request로 받은 걸 넣는다
int result = dao.insertData(dto);
DBConn.close();
//response.sendRedirect(cp + "/guest/guest.jsp"); 이렇게 써도 된다.
response.sendRedirect("guest.jsp");
%>
끝
반응형
'Back-End > JSP & Struts & JDBC' 카테고리의 다른 글
[Servlet] 게시판 (0) | 2022.02.21 |
---|---|
[Servlet] 서블릿 구조, EL, JSTl (0) | 2022.02.18 |
[JSP] 게시판 만들기 (9) | 2022.02.15 |
[JSP] 네이버 회원 가입 페이지 DB연동 및 데이터 조회,수정,삭제 (0) | 2022.02.15 |
[JSP] 성적 처리 웹페이지 제작하기(DB연동) - (2) (0) | 2022.02.14 |
블로그의 정보
무작정 개발
무작정 개발