이번에는 지난 시간에 했던 성적 프로그램의 기능들을 클래스로 만들어 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
'웹개발 교육 > jsp' 카테고리의 다른 글
| [51~52일] jsp (18) - myweb 프로젝트(게시판) (0) | 2022.10.11 |
|---|---|
| [51일] jsp (17) - myweb 프로젝트(인트로 화면) (0) | 2022.10.11 |
| [50일] jsp (15) - Java Bean (0) | 2022.10.07 |
| [50일] jsp (14) - 계산기 (0) | 2022.10.07 |
| [49일] jsp (13) - 성적 페이지 (0) | 2022.10.06 |