웹개발 교육/jsp

[50일] jsp (16) - 성적 데이터베이스 관련 비즈니스 로직 구현

ewok 2022. 10. 7. 18:19

이번에는 지난 시간에 했던 성적 프로그램의 기능들을 클래스로 만들어 DAO(Data Access Object)를 구현해보자

 

DB open과 close를 위한 클래스를 만들기 위해 net.utility 패키지 안에 DBClose.java와 DBOpen.java를 만든다.

 

DBOpen.java

package net.utility;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBOpen {
	
	//오라클 DB 연결 메소드
	public Connection getConection() {
		Connection con = null;
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "system";
			String password = "1234";
			String driver = "oracle.jdbc.driver.OracleDriver";			
			Class.forName(driver);			
			con = DriverManager.getConnection(url, user, password);
		} catch (Exception e) {
			System.out.println("오라클DB연결실패:" + e);
		}//end
		return con;
	}//getConnection() end
	
}//class end

 

DBClose.java

package net.utility;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DBClose { //DB 연결 자원 반납
	
	public static void close(Connection con) {
 		try {
 			if(con!=null) {con.close();}
 		} catch (Exception e) {}
	}//close() end
	
	public static void close(Connection con, PreparedStatement pstmt) {
 		try {
 			if(pstmt!=null) {pstmt.close();}
 		} catch (Exception e) {}
 		
 		try {
 			if(con!=null) {con.close();}
 		} catch (Exception e) {}
	}//close() end
	
	public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
		try {
 			if(rs!=null) {rs.close();}
 		} catch (Exception e) {}
		
		try {
 			if(pstmt!=null) {pstmt.close();}
 		} catch (Exception e) {}
		
 		try {
 			if(con!=null) {con.close();}
 		} catch (Exception e) {}
	}//close() end

}//class end

 

성적 데이터 입력을 위해 SungjukDAO.java를 생성하자

 

SungjukDAO.java

package net.sungjuk;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import net.utility.DBClose;
import net.utility.DBOpen;

public class SungjukDAO {  //Data Access Object
		                   //데이터베이스 관련 비즈니스 로직 구현
	private DBOpen dbopen = null;
	private Connection con = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;
	private StringBuilder sql = null;
	
	public SungjukDAO() {
		dbopen = new DBOpen();
	}//end
	
	public int insert(String uname, int kor, int eng, int mat, int aver, String addr) {
		int cnt = 0; //성공 또는 실패 여부 반환
		try {
			con = dbopen.getConection(); //DB연결
			
			sql = new StringBuilder();
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, sysdate) ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, uname);
			pstmt.setInt(2, kor);
			pstmt.setInt(3, eng);
			pstmt.setInt(4, mat);
			pstmt.setInt(5, aver);
			pstmt.setString(6, addr);
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("행추가 실패 : " + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;
	}//insert() end
	
}//class end

 


이제 성적 페이지를 만들자. sugnjukbean 폴더를 생성해서 관리할 것이다.

sungjukForm은 지난 시간에 사용했던 파일을 그대로 사용한다.

 

sungjukForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukForm.jsp</title>
</head>
<body>
	<h3>*성적 입력 폼*</h3>
	<p><a href="sungjukList.jsp">[성적목록]</a></p>
	
	<form name="sungjukfrm" id="sungjukfrm" method="post" action="sungjukIns.jsp">
	<table>
	<tr>
	  <th>이름</th>
	  <td><input type="text" name="uname" maxlength="20" required autofocus></td>
	</tr> 
	<tr>
	  <th>국어</th>
	  <td><input type="number" name="kor" size="5" min="0" max="100" placeholder="숫자입력"></td>
	</tr>
	<tr>
	  <th>영어</th>
	  <td><input type="number" name="eng" size="5" min="0" max="100" placeholder="숫자입력"></td>
	</tr> 
	<tr>
	  <th>수학</th>
	  <td><input type="number" name="mat" size="5" min="0" max="100" placeholder="숫자입력"></td>
	</tr>
	<tr>
	  <th>주소</th>
	  <td>
	      <select name="addr">
              <option value="Seoul">서울</option>
              <option value="Jeju">제주</option>
              <option value="Suwon">수원</option>
              <option value="Busan">부산</option>
	      </select> 
	  </td>
	</tr>
	<tr>
	  <td colspan="2" align="center">
	     <input type="submit" value="전송">
	     <input type="reset"  value="취소">
	  </td>
	</tr>
	</table>
	</form>
	
</body>
</html>

 

sungjukIns.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="net.sungjuk.*"%>
<jsp:useBean id="dao" class="net.sungjuk.SungjukDAO" scope="page"></jsp:useBean>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukIns.jsp</title>
</head>
<body>
	<h3>*성적 결과 페이지*</h3>
<%
	request.setCharacterEncoding("UTF-8");
	String uname = request.getParameter("uname").trim();
	int kor = Integer.parseInt(request.getParameter("kor").trim());
	int eng = Integer.parseInt(request.getParameter("eng").trim());
	int mat = Integer.parseInt(request.getParameter("mat").trim());
	String addr = request.getParameter("addr");
	int aver=(kor+eng+mat)/3;
	
	int cnt = dao.insert(uname, kor, eng, mat, aver, addr);
	
	if(cnt==0){
		out.print("<p>성적 입력이 실패했습니다!!</p>");
		out.print("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
	} else {
		out.print("<script>");
		out.print("		alert('성적이 입력되었습니다~');");
		out.print("		location.href='sungjukList.jsp';"); //목록페이지 이동
		out.print("</script>");
	}//if end
	
%>
</body>
</html>

아직 sungjukList.jsp을 만들지 않아서 404 오류가 나온다. 어쨌든 데이터베이스에 정상적으로 입력된 것을 확인할 수 있다.

 

그런데 이와 같이 값을 넘겨주는 것 말고

전송 객체를 만들어 한꺼번에 넘겨줄 수 있다.

 

전송 객체를 한번 만들어보자

net.sungjuk 패키지에 SungjukDTO 클래스를 생성한다. DTO는 Data Transfer Object로 전송 객체라는 의미이다.

 

SungjukDTO.java

package net.sungjuk;

public class SungjukDTO { //Data Transfer Object 전송 객체
				          //Value Object
	
	//sungjuk 테이블의 칼럼명을 기준으로 멤버변수(field) 선언
	private int sno;
	private String uname;
	private int kor;
	private int eng;
	private int mat;
	private int aver;
	private String addr;
	private String wdate;
	
	public SungjukDTO() {} //기본 생성자 default constructor

	//private 멤버변수 각각에 대한 getter와 setter함수 작성
	public int getSno() {
		return sno;
	}

	public void setSno(int sno) {
		this.sno = sno;
	}

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMat() {
		return mat;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public int getAver() {
		return aver;
	}

	public void setAver(int aver) {
		this.aver = aver;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public String getWdate() {
		return wdate;
	}

	public void setWdate(String wdate) {
		this.wdate = wdate;
	}

	@Override
	public String toString() {
		return "SungjukDTO [sno=" + sno + ", uname=" + uname + ", kor=" + kor + ", eng=" + eng + ", mat=" + mat
				+ ", aver=" + aver + ", addr=" + addr + ", wdate=" + wdate + "]";
	}
	
		
}//class end

getter와 setter 메서드를 만들고 Object 클래스의 toString 메서드를 오버라이드 하여 입력한 값이 올바른 지 확인하는 용도로 사용한다.

 

다시 sungjukIns.jsp에서 SungjukDTO Bean을 입력해준다.

<jsp:useBean id="dto" class="net.sungjuk.SungjukDTO" scope="page"></jsp:useBean>

 

sungjukIns.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="net.sungjuk.*"%>
<jsp:useBean id="dao" class="net.sungjuk.SungjukDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.sungjuk.SungjukDTO" scope="page"></jsp:useBean>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukIns.jsp</title>
</head>
<body>
	<h3>*성적 결과 페이지*</h3>
<%
	request.setCharacterEncoding("UTF-8");
	String uname = request.getParameter("uname").trim();
	int kor = Integer.parseInt(request.getParameter("kor").trim());
	int eng = Integer.parseInt(request.getParameter("eng").trim());
	int mat = Integer.parseInt(request.getParameter("mat").trim());
	String addr = request.getParameter("addr");
	int aver=(kor+eng+mat)/3;
	
	//1)dto 객체를 사용하기 전 
	//int cnt = dao.insert(uname, kor, eng, mat, aver, addr);
	
	//2)dto 객체를 사용한 경우
	//전달값을 모두 dto 객체에 담기
	dto.setUname(uname);
	dto.setKor(kor);
	dto.setEng(eng);
	dto.setMat(mat);
	dto.setAver(aver);
	dto.setAddr(addr);
	
	int cnt = dao.create(dto);
	
	
	if(cnt==0){
		out.print("<p>성적 입력이 실패했습니다!!</p>");
		out.print("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
	} else {
		out.print("<script>");
		out.print("		alert('성적이 입력되었습니다~');");
		out.print("		location.href='sungjukList.jsp';"); //목록페이지 이동
		out.print("</script>");
	}//if end
	
%>
</body>
</html>

여기서 cnt에 create메서드를 실행한 결과를 담았다.

int cnt = dao.create(dto);

아직 create 메서드를 만들지 않았기 때문에 sugnjukDAO.java로 가서 만들자

 

 

sungjukDAO.java

package net.sungjuk;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import net.utility.DBClose;
import net.utility.DBOpen;

public class SungjukDAO {  //Data Access Object
		                   //데이터베이스 관련 비즈니스 로직 구현
	private DBOpen dbopen = null;
	private Connection con = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;
	private StringBuilder sql = null;
	
	public SungjukDAO() {
		dbopen = new DBOpen();
	}//end
	
	public int insert(String uname, int kor, int eng, int mat, int aver, String addr) {
		int cnt = 0; //성공 또는 실패 여부 반환
		try {
			con = dbopen.getConection(); //DB연결
			
			sql = new StringBuilder();
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, sysdate) ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, uname);
			pstmt.setInt(2, kor);
			pstmt.setInt(3, eng);
			pstmt.setInt(4, mat);
			pstmt.setInt(5, aver);
			pstmt.setString(6, addr);
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("행추가 실패 : " + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;
	}//insert() end
	
	public int create(SungjukDTO dto) {
		int cnt = 0; //성공 또는 실패 여부 반환
		try {
			con = dbopen.getConection(); //DB연결
			
			sql = new StringBuilder();
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, sysdate) ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, dto.getUname());
			pstmt.setInt(2, dto.getKor());
			pstmt.setInt(3, dto.getEng());
			pstmt.setInt(4, dto.getMat());
			pstmt.setInt(5, dto.getAver());
			pstmt.setString(6, dto.getAddr());
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("행추가 실패 : " + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;		
	}//create() end
	
}//class end

 

 

성적을 입력하면 다시 성적 리스트를 보여줘야 한다. sungjukList.jsp를 만들어 작업한다.

 

sungjukList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="net.sungjuk.*" %>

<jsp:useBean id="dao" class="net.sungjuk.SungjukDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.sungjuk.SungjukDTO" scope="page"></jsp:useBean>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukList.jsp</title>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<h3>*성적 목록*</h3>
	<p><a href="sungjukForm.jsp">[성적쓰기]</a></p>
	
	<table>
	<tr>
		<th>이름</th>
		<th>국어</th>
		<th>영어</th>
		<th>수학</th>
		<th>등록일</th>
	</tr>
	
<%
	dao.list();

%>
	</table>
	
</body>
</html>

 

 

테이블을 sungjukList에 주기 위해 테이블의 행들을 ArrayList에 담고 list 함수를 이용한다.

 

ArrayList에 담을 때에는

rs를 이용해 커서를 내리면서 담아준다.

이제 한 사람의 정보(행)를 담아야 하는데 이때 sungjukDTO를 사용한다. 

 

SungjukDAO.java

package net.sungjuk;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import net.utility.DBClose;
import net.utility.DBOpen;

public class SungjukDAO {  //Data Access Object
		                   //데이터베이스 관련 비즈니스 로직 구현
	private DBOpen dbopen = null;
	private Connection con = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;
	private StringBuilder sql = null;
	
	public SungjukDAO() {
		dbopen = new DBOpen();
	}//end
	
	public int insert(String uname, int kor, int eng, int mat, int aver, String addr) {
		int cnt = 0; //성공 또는 실패 여부 반환
		try {
			con = dbopen.getConection(); //DB연결
			
			sql = new StringBuilder();
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, sysdate) ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, uname);
			pstmt.setInt(2, kor);
			pstmt.setInt(3, eng);
			pstmt.setInt(4, mat);
			pstmt.setInt(5, aver);
			pstmt.setString(6, addr);
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("행추가 실패 : " + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;
	}//insert() end
	
	public int create(SungjukDTO dto) {
		int cnt = 0; //성공 또는 실패 여부 반환
		try {
			con = dbopen.getConection(); //DB연결
			
			sql = new StringBuilder();
			sql.append(" INSERT INTO sungjuk(sno, uname, kor, eng, mat, aver, addr, wdate) ");
			sql.append(" VALUES(sungjuk_seq.nextval, ?, ?, ?, ?, ?, ?, sysdate) ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setString(1, dto.getUname());
			pstmt.setInt(2, dto.getKor());
			pstmt.setInt(3, dto.getEng());
			pstmt.setInt(4, dto.getMat());
			pstmt.setInt(5, dto.getAver());
			pstmt.setString(6, dto.getAddr());
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("행추가 실패 : " + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;		
	}//create() end
	
	public ArrayList<SungjukDTO> list() {
		//DB에서 가져온 데이터(rs)를 한꺼번에 모아서(ArrayList)
		//sungjukList.jsp에 전달한다
		ArrayList<SungjukDTO> list = null;
		
		try {
			
			con=dbopen.getConection();
			StringBuilder sql = new StringBuilder();
			sql.append(" SELECT sno, uname, kor, eng, mat, wdate ");
			sql.append(" FROM sungjuk ");
			sql.append(" ORDER BY sno DESC ");
			
			pstmt = con.prepareStatement(sql.toString());
			rs = pstmt.executeQuery();
			
			if(rs.next()){
				//전체 행을 저장
				list = new ArrayList<>();
				do {
					//커서가 가리키는 한줄 저장
					SungjukDTO dto = new SungjukDTO();
					dto.setSno(rs.getInt("sno"));
					dto.setUname(rs.getString("uname"));
					dto.setKor(rs.getInt("kor"));
					dto.setEng(rs.getInt("eng"));
					dto.setMat(rs.getInt("mat"));
					dto.setWdate(rs.getString("wdate"));
					list.add(dto); //list 저장
				} while(rs.next());
			} else {
				list = null;
			}//if end
			
		} catch (Exception e) {
			System.out.println("목록실패:" + e);
		} finally {
			DBClose.close(con, pstmt, rs);
		}//end
		return list;
	}//list() end
	
}//class end

 

다시 sungjukList.js로 가서 list를 출력하자

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="net.sungjuk.*" %>
<%@ page import="java.util.ArrayList"%>

<jsp:useBean id="dao" class="net.sungjuk.SungjukDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.sungjuk.SungjukDTO" scope="page"></jsp:useBean>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukList.jsp</title>
</head>
<body>
	<h3>*성적 목록*</h3>
	<p><a href="sungjukForm.jsp">[성적쓰기]</a></p>
	
	<table>
	<tr>
		<th>이름</th>
		<th>국어</th>
		<th>영어</th>
		<th>수학</th>
		<th>등록일</th>
	</tr>
	
<%
	ArrayList<SungjukDTO> list = dao.list();
	if(list==null){
		out.println("<tr>");
		out.println("	<td colspan='5'>글없음!!</td>");
		out.println("</tr>");
	} else {
		for(int i=0; i<list.size(); i++) {
			dto = list.get(i);
%>
			<tr>
				<td><a href="sungjukRead.jsp?sno=<%=dto.getSno()%>"><%=dto.getUname()%></a></td>
				<td><%=dto.getKor()%></td>
				<td><%=dto.getEng()%></td>
				<td><%=dto.getMat()%></td>
				<td><%=dto.getWdate().substring(0, 10)%></td>
			</tr>
<%
		}//for end
	}//if end
%>
	</table>
	
</body>
</html>

 

공통 페이지에 해당하는 코드를 따로 모아 사용하기 쉽게 하기 위해 ssi.jsp를 만든다.

 

ssi.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- ssi.jsp 공통 페이지 --%>

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<%@ page import="net.sungjuk.*" %>

<jsp:useBean id="dao" class="net.sungjuk.SungjukDAO" scope="page"></jsp:useBean>
<jsp:useBean id="dto" class="net.sungjuk.SungjukDTO" scope="page"></jsp:useBean>

<%request.setCharacterEncoding("UTF-8"); %>

공통 페이지에 jsp 코드가 들어있다면 위 방식으로 해야 한다.

 

이제 개개인의 성적을 상세보기 위해 sungjukRead.jsp를 만들 차례이다.

 

sungjukRead.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<%--
	<jsp:include page="ssi.jsp"></jsp:include>
 --%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukRead.jsp</title>
</head>
<body>
	<h3>*성적 상세보기*</h3>
	<p>
		<a href="sungjukForm.jsp">[성적쓰기]</a>
		<a href="sungjukList.jsp">[성적목록]</a>
	</p>
<%
	int sno = Integer.parseInt(request.getParameter("sno"));
	dto = dao.read(sno);
	if (dto==null) {
		out.println("해당 글없음!!");
	} else {
%>
		<table>
		<tr>
			<th>이름</th>
			<td><%=dto.getUname() %></td>
		</tr>
		
		<tr>
			<th>국어</th>
			<td><%=dto.getKor() %></td>
		</tr>
		<tr>
			<th>영어</th>
			<td><%=dto.getEng() %></td>
		</tr>
		<tr>
			<th>수학</th>
			<td><%=dto.getMat() %></td>
		</tr>
		<tr>
			<th>평균</th>
			<td><%=dto.getAver() %></td>
		</tr>
		<tr>
			<th>주소</th>
			<td><%=dto.getAddr() %></td>
		</tr>
		<tr>
			<th>작성일</th>
			<td><%=dto.getWdate() %></td>
		</tr>					
		</table>					

<%
	}//if end


%>	
</body>
</html>

read 메서드는 SungjukDAO.java에서 만든다.

 

SungjukDAO.java

	public SungjukDTO read(int sno) {
		SungjukDTO dto = null;
		try {
			con = dbopen.getConection();
			
			sql = new StringBuilder();
			sql.append(" SELECT sno, uname, kor, eng, mat, aver, addr, wdate ");
			sql.append(" FROM sungjuk ");
			sql.append(" WHERE sno=? ");
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setInt(1, sno);
			rs = pstmt.executeQuery();
			if(rs.next()){
				dto = new SungjukDTO();
				dto.setSno(rs.getInt("sno"));
				dto.setUname(rs.getString("uname"));
				dto.setKor(rs.getInt("kor"));
				dto.setEng(rs.getInt("eng"));
				dto.setMat(rs.getInt("mat"));
				dto.setAver(rs.getInt("aver"));
				dto.setAddr(rs.getString("addr"));
				dto.setWdate(rs.getString("wdate"));
			} else {
				dto = null;
			}//if end
			
		} catch (Exception e) {
			System.out.println("상세보기실패:" + e);
		} finally {
			DBClose.close(con, pstmt, rs);
		}//end
		return dto;
	}//read() end
	
}//class end

 

상세보기 페이지에서 데이터를 수정, 삭제할 수 있도록 페이지를 만들어 연결하자

 

sungjukDel.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukDel.jsp</title>
</head>
<body>
	<h3>* 성적 삭제 *</h3>
	<p>
		<a href="sungjukForm.jsp">[성적쓰기]</a>
		<a href="sungjukList.jsp">[성적목록]</a>
	</p>
<%
	int sno = Integer.parseInt(request.getParameter("sno"));
	int cnt = dao.delete(sno);
	if(cnt==0){
		out.print("<p>성적 삭제 실패했습니다!!</p>");
		out.print("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
	} else {
		out.print("<script>");
		out.print("		alert('성적이 삭제되었습니다~');");
		out.print("		location.href='sungjukList.jsp';"); //목록페이지 이동
		out.print("</script>");
	}//if end
%>
</body>
</html>

 

SungjukDAO에 delete 메서드를 추가한다.

 

SungjukDAO.java

	public int delete(int sno) {
		int cnt = 0;
		try {
			con = dbopen.getConection();
			
			sql = new StringBuilder();
			sql.append(" DELETE FROM sungjuk ");
			sql.append(" WHERE sno=? ");
			
			pstmt = con.prepareStatement(sql.toString());
			pstmt.setInt(1, sno);
			
			cnt = pstmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("삭제실패:" + e);
		} finally {
			DBClose.close(con, pstmt);
		}//end
		return cnt;
	}//delete() end

 

 

수정

이제 데이터를 수정할 수 있도록 페이지를 만들 차례이다.

sungjukRead.jsp에서 넘긴 sno를 sungjukUpdate.jsp가 받아와서 새로운 페이지를 만든다.

 

먼저 수정하고자 하는 행을 DB에서 가져와야 하는데 우리는 이 작업을 하는 read()를 이미 만들었다.

이를 활용해서 만들면 된다.


sungjukUpdate.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukUpdate.jsp</title>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<h3>* 성적 수정 *</h3>
	<p>
		<a href="sungjukForm.jsp">[성적쓰기]</a>
		<a href="sungjukList.jsp">[성적목록]</a>
	</p>
<%

	int sno = Integer.parseInt(request.getParameter("sno"));
	dto = dao.read(sno);  //dao는 ssi.jsp에 있음(3번째 줄)
	if (dto==null) {
		out.println("해당 글 없음!!");
	} else {
%>			
	<form name="sungjukfrm" id="sungjukfrm" method="post" action="sungjukUpdateProc.jsp">
		<input type="hidden" name="sno" value="<%=sno%>"> <!-- 수정하고자 하는 글번호 -->
		<table class="table">
		<tr>
		  <th  class="success">이름</th>
		  <td><input type="text" name="uname" value="<%=dto.getUname()%>" maxlength="20" required autofocus></td>
		</tr> 
		<tr>
		  <th class="success">국어</th>
		  <td><input type="number" name="kor" value="<%=dto.getKor()%>" size="5" min="0" max="100" placeholder="숫자입력"></td>
		</tr>
		<tr>
		  <th class="success">영어</th>
		  <td><input type="number" name="eng" value="<%=dto.getEng()%>" size="5" min="0" max="100" placeholder="숫자입력"></td>
		</tr> 
		<tr>
		  <th class="success">수학</th>
		  <td><input type="number" name="mat" value="<%=dto.getMat()%>" size="5" min="0" max="100" placeholder="숫자입력"></td>
		</tr>
		<tr>
		  <th class="success">주소</th>
		  <td>
		      <% String addr = dto.getAddr(); %>
		      <select name="addr">
	              <option value="Seoul" <%if (addr.equals("Seoul")) {out.print("selected");}%>>서울</option>
	              <option value="Jeju" <%if (addr.equals("Jeju")) {out.print("selected");}%>>제주</option>
	              <option value="Suwon" <%if (addr.equals("Suwon")) {out.print("selected");}%>>수원</option>
	              <option value="Busan" <%if (addr.equals("Busan")) {out.print("selected");}%>>부산</option>
		      </select> 
		  </td>
		</tr>
		<tr>
		  <td colspan="2" align="center">
		     <input type="submit" value="수정">
		     <input type="reset"  value="취소">
		  </td>
		</tr>
		</table>
		</form>
<%
	}//if end
%>		
	
</body>
</html>

 

 

sungjukUpdateProc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="ssi.jsp" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>sungjukUpdateProc.jsp</title>
</head>
<body>
	<h3>*성적 수정 결과*</h3>
	<p>
		<a href="sungjukForm.jsp">[성적쓰기]</a>
		<a href="sungjukList.jsp">[성적목록]</a>
	</p>
<%
	//한글 인코딩
	request.setCharacterEncoding("UTF-8");

	//사용자가 수정 입력한 정보를 가져와서 변수에 담기
 	String uname = request.getParameter("uname").trim();
 	int kor = Integer.parseInt(request.getParameter("kor").trim());
 	int eng = Integer.parseInt(request.getParameter("eng").trim());
 	int mat = Integer.parseInt(request.getParameter("mat").trim());
 	String addr = request.getParameter("addr");
 	int sno = Integer.parseInt(request.getParameter("sno").trim()); //글번호
 	int aver=(kor+eng+mat)/3; 

 	//dto 객체에 담기
 	dto.setUname(uname);
 	dto.setKor(kor);
 	dto.setEng(eng);
 	dto.setMat(mat);
 	dto.setAver(aver);
 	dto.setAddr(addr);
 	dto.setSno(sno);
 	
 	int cnt = dao.updateProc(dto);
 	
	if(cnt==0){
		out.println("<p>성적 수정이 실패했습니다!!</p>");
		out.print("<p><a href='javascript:history.back()'>[다시시도]</a></p>");
	} else {
		out.print("<script>");
		out.print("		alert('성적이 수정되었습니다~');");
		out.print("		location.href='sungjukList.jsp';"); //목록페이지 이동
		out.print("</script>");
	}//if end
%>
</body>
</html>

이제 updateProc()를 만들자

 

sungjukDAO.java

public int updateProc(SungjukDTO dto) {
    int cnt = 0;
    try {
        con = dbopen.getConection();

        sql = new StringBuilder();
        sql.append(" UPDATE sungjuk ");
        sql.append(" SET uname=?, kor=?, eng=?, mat=?, aver=?, addr=? ");
        sql.append(" WHERE sno=? ");

        pstmt = con.prepareStatement(sql.toString());
        pstmt.setString(1, dto.getUname());
        pstmt.setInt(2, dto.getKor());
        pstmt.setInt(3, dto.getEng());
        pstmt.setInt(4, dto.getMat());
        pstmt.setInt(5, dto.getAver());
        pstmt.setString(6, dto.getAddr());
        pstmt.setInt(7, dto.getSno());

        cnt = pstmt.executeUpdate();

    } catch (Exception e) {
        System.out.println("수정실패:" + e);
    } finally {
        DBClose.close(con, pstmt);
    }
    return cnt;
}//updateProc() end