무작정 개발.Vlog

[JSP] 방명록 만들기

by 무작정 개발
반응형
2022.02.17~18(39~40일 차)

 

오늘부터 이틀간 방명록 만들기 진행~

 

오늘의 수업 내용

 

방명록 기능

  • Insert(작성) - 방명록 작성
  • Delete(삭제) - 방명록 삭제
  • 페이징

방명록 페이지 구성

  • guest.jsp
  • delete.jsp
  • save.jsp

방명록 제작 순서

  1. DB 테이블 생성
  2. GuestDTO, GuestDAO 클래스 생성
  3. 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 생성 확인 - (검색해보기)

Table 생성 확인 - (검색해보기)
guest 테이블


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;">
	내&nbsp;&nbsp;&nbsp;&nbsp;용
	</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("&nbsp;");
} %>
	</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>

guest.jsp 실행화면
guest.jsp 실행화면

 

위의 사진을 보면 노란 선을 기준으로 2번 부분은 확장 for문을 사용해서 DB의 데이터를 가져와서 보여줍니다. 

확장 for문 사용
확장 for문 사용

방명록이 0개이면 DB에도 데이터가 없기에 '등록된 자료가 없습니다'라는 문구를 보여줄 수 있게 했습니다.

방명록이 0개일 때
방명록이 0개일 때

 

 

방명록 삭제 기능 - 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을 가지고 와서 삭제를 합니다.

guest.jsp 삭제 부분 소스
guest.jsp 삭제 부분 소스

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");

%>

 

 

끝 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기