[50일] jsp (16) - 성적 데이터베이스 관련 비즈니스 로직 구현
이번에는 지난 시간에 했던 성적 프로그램의 기능들을 클래스로 만들어 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