Everything has an expiration date
[JSP & JDBC & Oracle] 20231217 처음부터 재작성 복습 ② - 회원 성적 관리(MemberScore) 모든 페이지 재작성 코드 (Practice_MemberScoreSelect ~ Practice_MemberScoreDelete) 본문
[JSP & JDBC & Oracle]/Program source (JSP & JDBC & Oracle)
[JSP & JDBC & Oracle] 20231217 처음부터 재작성 복습 ② - 회원 성적 관리(MemberScore) 모든 페이지 재작성 코드 (Practice_MemberScoreSelect ~ Practice_MemberScoreDelete)
Jelly-fish 2023. 12. 18. 01:15
◎ 작성한 페이지 이동 ◎
http://localhost:3306/WebApp12/Practice_MemberScoreSelect.jsp
01234567
MemberScoreDTO.java
/*==================================================
MemberScoreDTO.java
- 객체 전용(데이터 보관 및 전송) → JAVA Bean
==================================================*/
package com.test;
public class MemberScoreDTO
{
// VIEW_MEMBERSCORE 조회 항목을 기준으로
// 프로퍼티(property) 구성
private String sid, name; //-- 번호, 이름
private int kor, eng, mat; //-- 국어점수, 영어점수, 수학점수
private int tot, rank; //-- 총점, 석차(등수)
private double avg; //-- 평균
// getter / setter 구성
public String getSid()
{
return sid;
}
public void setSid(String sid)
{
this.sid = sid;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
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 getTot()
{
return tot;
}
public void setTot(int tot)
{
this.tot = tot;
}
public int getRank()
{
return rank;
}
public void setRank(int rank)
{
this.rank = rank;
}
public double getAvg()
{
return avg;
}
public void setAvg(double avg)
{
this.avg = avg;
}
}
MemberScoreDAO.java
1. 주요 속성 구성, 데이터베이스 연결 담당 메소드
`Connection connection()`
// 주요 속성 구성
private Connection conn;
// 데이터베이스 연결 담당 메소드
public Connection connection() throws ClassNotFoundException, SQLException
{
conn = DBConn.getConnection();
return conn;
}
2. 성적 데이터 입력 담당 메소드
`int add(MemberScoreDTO score)`
// 데이터 입력 담당 메소드(성적 데이터 입력)
public int add(MemberScoreDTO score) throws SQLException
{
int result = 0;
String sql = "INSERT INTO TBL_MEMBERSCORE(SID, KOR, ENG, MAT)"
+ " VALUES(?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(score.getSid()));
pstmt.setInt(2, score.getKor());
pstmt.setInt(3, score.getEng());
pstmt.setInt(4, score.getMat());
result = pstmt.executeUpdate();
pstmt.close();
return result;
}
3. 성적 리스트 전체 출력 담당 메소드
`ArrayList<MemberScoreDTO> lists()`
// 성적 전체 리스트 출력 담당 메소드 (성적 데이터 전체 출력)
// 성적 정보 출력 메소드 (sid, name, kor, eng, mat, tot, avg, rank)
public ArrayList<MemberScoreDTO> lists() throws SQLException
{
ArrayList<MemberScoreDTO> result = new ArrayList<MemberScoreDTO>();
String sql = "SELECT SID, NAME, KOR, ENG, MAT"
+ ", (KOR+ENG+MAT) AS TOT"
+ ", (KOR+ENG+MAT)/3 AS AVG"
+ ", RANK() OVER (ORDER BY (KOR+ENG+MAT) DESC) AS RANK"
+ " FROM VIEW_MEMBERSCORE"
+ " ORDER BY SID";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
MemberScoreDTO memberScore = new MemberScoreDTO();
memberScore.setSid(rs.getString("SID"));
memberScore.setName(rs.getString("NAME"));
memberScore.setKor(rs.getInt("KOR"));
memberScore.setEng(rs.getInt("ENG"));
memberScore.setMat(rs.getInt("MAT"));
memberScore.setTot(rs.getInt("TOT"));
memberScore.setAvg(rs.getDouble("AVG"));
memberScore.setRank(rs.getInt("RANK"));
result.add(memberScore);
}
rs.close();
pstmt.close();
return result;
}
4. 성적 정보 개수 확인 담당 메소드
`int count()`
// 성적 정보 개수 확인 메소드
public int count() throws SQLException
{
int result = 0;
String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBERSCORE";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
result = rs.getInt("COUNT");
}
rs.close();
pstmt.close();
return result;
}
5. 성적 데이터 수정 담당 메소드
`int modify(MemberScoreDTO score)`
// 메소드 추가
// 성적 데이터 수정 담당 메소드
public int modify(MemberScoreDTO score) throws SQLException
{
int result = 0;
String sql = "UPDATE TBL_MEMBERSCORE"
+ " SET KOR=?, ENG=?, MAT=?"
+ " WHERE SID=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, score.getKor());
pstmt.setInt(2, score.getEng());
pstmt.setInt(3, score.getMat());
pstmt.setInt(4, Integer.parseInt(score.getSid()));
result = pstmt.executeUpdate();
pstmt.close();
return result;
}
6. 성적 데이터 삭제 담당 메소드
`int remove(String sid)`
// 메소드 추가
// 성적 데이터 삭제 담당 메소드
public int remove(String sid) throws SQLException
{
int result = 0;
String sql = "DELETE"
+ " FROM TBL_MEMBERSCORE"
+ " WHERE SID=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(sid));
result = pstmt.executeUpdate();
return result;
}
7. 성적 정보 검색 메소드 (SID)
`MemberScoreDTO search(String sid)`
// 메소드 추가
// 번호 검색 담당 메소드
// 성적 정보 검색 메소드 (SID)
public MemberScoreDTO search(String sid) throws SQLException
{
MemberScoreDTO result = new MemberScoreDTO();
String sql = "SELECT SID, NAME, KOR, ENG, MAT"
+ " FROM VIEW_MEMBERSCORE"
+ " WHERE SID=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(sid));
ResultSet rs = pstmt.executeQuery();
while(rs.next())
{
result.setSid(rs.getString("SID"));
result.setName(rs.getString("NAME"));
result.setKor(rs.getInt("KOR"));
result.setEng(rs.getInt("ENG"));
result.setMat(rs.getInt("MAT"));
}
// [참 고 사 항]
//****************************************************************
// MemberScoreDTO의 항목 중
// tot, avg, rank 를 set 해주지 않아도 된다.
// 성적 정보를 수정을 하기 위해 가져올 때
// 입력창에 뿌려줄 항목들을 가져오기 위해 구성한 메소드이므로...
// 그리고, MemberScoreDTO 의 속성변수
// tot, avg, rank 를 set 해 주지 않으면
// 초기값으로 설정되기 때문에 신경쓰지 않아도 괜찮다.
//****************************************************************
rs.close();
pstmt.close();
return result;
}
8. 데이터베이스 연결 종료(해제) 담당 메소드
`void close()`
// 데이터베이스 연결 종료(해제) 담당 메소드
public void close() throws SQLException
{
DBConn.close();
}
【회원 성적 관리 페이지】 - Practice_MemberScoreSelect.jsp
Practice_MemberScoreSelect.jsp
<%@page import="com.test.MemberScoreDTO"%>
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// 스트링버퍼를 통해 동적 테이블 구성하기
// MemberScoreDAO 의 lists() 메소드 → ArrayList<MemberScoreDTO> 반환
// 이를 이용하여 출력을 처리해 보자.
StringBuffer str = new StringBuffer();
MemberScoreDAO dao = new MemberScoreDAO();
// th는 변화하지 않는 고정 값이므로 미리 append 한다.
str.append("<table class='table' style='width: 100%;'>");
str.append(" <tr>");
str.append(" <th class='numTh'>번호</th>");
str.append(" <th class='nameTh'>이름</th>");
str.append(" <th>국어점수</th>");
str.append(" <th>영어점수</th>");
str.append(" <th>수학점수</th>");
str.append(" <th>총점</th>");
str.append(" <th>평균</th>");
str.append(" <th>석차</th>");
str.append(" <th>성적처리</th>");
str.append(" </tr>");
try
{
dao.connection();
for (MemberScoreDTO score : dao.lists())
{
str.append("<tr>");
//str.append(" <td>1</td>");
str.append(" <td>" + score.getSid() + "</td>");
//str.append(" <td>노은하</td>");
str.append(" <td>" + score.getName() + "</td>");
//str.append(" <td>44</td>");
str.append(" <td>" + score.getKor() + "</td>");
//str.append(" <td>55</td>");
str.append(" <td>" + score.getEng() + "</td>");
//str.append(" <td>66</td>");
str.append(" <td>" + score.getMat() + "</td>");
//str.append(" <td>165</td>");
str.append(" <td>" + score.getTot() + "</td>");
//str.append(" <td>55.00</td>");
str.append(" <td>" + String.format("%.2f", score.getAvg()) + "</td>");
//str.append(" <td>5</td>");
str.append(" <td>" + score.getRank() + "</td>");
/* ⓐ 국어점수, 영어점수, 수학점수가 모두 -1 이라면
성적 정보가 입력되지 않은 것. */
/* ⓑ 그게 아니라면, 성적 입력 처리가 된 것. */
/***************************************************************/
/* 【ⓐ : 성적 입력이 안 됐을 때】 */
/***************************************************************/
/*
→ [입력] : 활성화, class="btn01"
<a href="Practice_MemberScoreInsertForm.jsp">
→ [수정] : 비활성화(disabled="disabled"), class="btn02"
→ [삭제] : 비활성화(disabled="disabled"), class="btn02"
*/
/***************************************************************/
/***************************************************************/
/* 【ⓑ : 성적 입력이 됐을 때】 */
/***************************************************************/
/*
→ [입력] : 비활성화(disabled="disabled"), class="btn02"
→ [수정] : 활성화, class="btn01"
<a href="Practice_MemberScoreUpdateForm.jsp">
→ [삭제] : 활성화, class="btn01"
<a href="javascript:memberScoreDelete(sid, 'name')">
*/
/***************************************************************/
if (score.getKor()==-1 && score.getEng()==-1 && score.getMat()==-1)
{
str.append(" <td>");
//********************************************************************
// 성적 입력을 클릭했을 때, 클릭한 회원의 번호와 이름을
// 성적 입력 폼(Practice_MemberInsertForm.jsp)으로 전달할 수 있도록
// method="get" 방식으로 url을 통해 전송해 준다.
//********************************************************************
str.append(" <a href='Practice_MemberScoreInsertForm.jsp?sid=" + score.getSid() + "&&name=\"" + score.getName() + "\"'>");
str.append(" <button type='button' class='btn01'>입력</button>");
str.append(" </a>");
str.append(" <button type='button' class='btn02' disabled='disabled'>");
str.append(" 수정");
str.append(" </button>");
str.append(" <button type='button' class='btn02' disabled='disabled'>");
str.append(" 삭제");
str.append(" </button>");
str.append(" </td>");
}
else
{
str.append(" <td>");
str.append(" <button type='button' class='btn02' disabled='disabled'>입력</button>");
str.append(" <a href='Practice_MemberScoreUpdateForm.jsp?sid=" + score.getSid() + "&&name=" + score.getName() + "'>");
//str.append(" <a href='Practice_MemberScoreUpdateForm.jsp?sid=" + score.getSid() + "'>");
str.append(" <button type='button' class='btn01'>수정</button>");
str.append(" </a>");
str.append("<a href='javascript:memberScoreDelete(" + score.getSid() + ", \"" + score.getName() + "\")'>");
str.append(" <button type='button' class='btn01'>삭제</button>");
str.append(" </a>");
str.append(" </td>");
}
str.append("</tr>");
}
str.append("</table>");
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Practice_MemberScoreSelect.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
a {text-decoration: none;}
</style>
<script type="text/javascript">
function memberScoreDelete(sid, name)
{
//alert("함수 호출 확인~!!!");
// ① 사용자에게 정말로 삭제할 것인지 묻기
// → confirm() 함수 사용.
var isOkDel = confirm("번호 : " + sid + ", 이름 : " + name + "\n 정말로 이 성적 데이터를 삭제하시겠습니까?");
// ② 정말로 삭제하겠다고 했다면,
// → 『window.location.href = "이동시킬주소";』 를 사용하여
// Practice_MemberScoreDelete.jsp 페이지로 이동시키기. sid를 주소로 같이 전송!
// 즉... 【Practice_MemberScoreDelete.jsp?sid= sid】
if (isOkDel)
window.location.href="Practice_MemberScoreDelete.jsp?sid=" + sid;
}
</script>
</head>
<body>
<!-- div>h2({회원 }+span[style="color: blue;"]{성적}+{관리 및 출력 페이지})+hr -->
<div>
<h2>회원 <span style="color: blue;">성적</span>관리 및 출력 페이지</h2>
<hr />
</div>
<!-- div>a[href="Practice_MemberSelect.jsp"]>button[type="button"]{회원 명단 관리} -->
<div>
<a href="Practice_MemberSelect.jsp">
<button type="button">회원 명단 관리</button>
</a>
</div>
<br />
<!--=======================================================================================-->
<!-- 【Emmet - <th>, <td> 구성 】-->
<!--=======================================================================================-->
<!-- 『th 구성』 -->
<!-- table.table[style="width: 100%;"]>(tr>th{번호}+th{이름}+th{국어점수}+th{영어점수}+th{수학점수}+th{총점}+th{평균}+th{석차}+th{성적처리}) -->
<!-- 『td 구성』 -->
<!-- tr>td{1}+td{노은하}+td{44}+td{55}+td{66}+td{165}+td{55.00}+td{5} -->
<!--=======================================================================================-->
<!--=======================================================================================-->
<!-- 【Emmet - 버튼 구성 】 -->
<!--=======================================================================================-->
<!-- 『입력 버튼』 -->
<!-- a[href="Practice_MemberScoreInsertForm.jsp"]>button[type="button"].btn01{입력} -->
<!-- 『수정 버튼』-->
<!-- a[href="Practice_MemberScoreUpdateForm.jsp"]>button[type="button"].btn01{수정} -->
<!-- 『삭제 버튼』 -->
<!-- a[href="javascript:memberScoreDelete(1, '노은하')"]>button[type="button"].btn01{삭제} -->
<!-- 『<td></td> 태그 내부에 버튼 모두 넣기』 -->
<!-- td>(a[href="Practice_MemberScoreInsertForm.jsp"]>button[type="button"].btn01{입력})+(a[href="Practice_MemberScoreUpdateForm.jsp"]>button[type="button"].btn01{수정})+(a[href="javascript:memberScoreDelete(1, '노은하')"]>button[type="button"].btn01{삭제}) -->
<!--=======================================================================================-->
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
<!-- 【정적인 테이블 구성】 -->
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
<!--
<table class="table" style="width: 100%;">
<tr>
<th>번호</th>
<th>이름</th>
<th>국어점수</th>
<th>영어점수</th>
<th>수학점수</th>
<th>총점</th>
<th>평균</th>
<th>석차</th>
<th>성적처리</th>
</tr>
<tr>
<td>1</td>
<td>노은하</td>
<td>44</td>
<td>55</td>
<td>66</td>
<td>165</td>
<td>55.00</td>
<td>5</td>
<td>
<a href="Practice_MemberScoreInsertForm.jsp">
<button type="button" class="btn01">입력</button>
</a>
<a href="Practice_MemberScoreUpdateForm.jsp">
<button type="button" class="btn01">수정</button>
</a>
<a href="javascript:memberScoreDelete(1, '노은하')">
<button type="button" class="btn01">삭제</button>
</a>
</td>
</tr>
</table>
-->
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
<!-- 【동적인 테이블 구성】 -->
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
<div>
<%=str.toString() %>
</div>
<!--▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨-->
</body>
</html>
Ⅰ [성적 데이터 입력] - Practice_MemberScoreInsertForm.jsp, Practice_MemberScoreInsert.jsp
Practice_MemberScoreInsertForm.jsp
<%@page import="com.test.MemberScoreDTO"%>
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// ※ 이름(name)의 경우, 한글을 포함한 문자열일 수 있기 때문에
// request.getParameter("name") 으로 값을 가져오기 전에
// 인코딩 타입을 변경해 주어야 한다.
// → 『request.setCharacterEncoding("UTF-8");』
request.setCharacterEncoding("UTF-8");
// ① 이전 페이지(Practice_MemberScoreSelect.jsp)로부터 넘어온 데이터 수신
// → name, sid
String sid = request.getParameter("sid");
// ① 【방식 수정 : 다시 sid를 통해 회원의 이름(name)을 얻어오는 방식으로 수정.】
// ② MemberScoreDAO 객체를 생성한다.
MemberScoreDAO dao = new MemberScoreDAO();
String name = "";
try
{
// ③ try~catch 문 내부에서 데이터베이스와 연결을 진행한다.
dao.connection();
// ④ 이전 페이지(Practice_MemberScoreSelect.jsp)에서 전달받은
// sid 값을 통해, sid 에 해당하는 MemberScoreDTO 를 반환받아
// name을 얻어낸다.
// → 『MemberScoreDTO dao.search(String sid)』
MemberScoreDTO score = dao.search(sid);
name = score.getName();
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
//==================================================
// [최종적으로...]
//==================================================
// 이렇게 얻어낸 값을...
// 국어점수 [ ]
// 영어점수 [ ]
// 수학점수 [ ]
// 입력창 위에 뿌려준다.
// ↓↓↓↓↓↓↓(HTML 내부에 스크립트릿으로 구성.)
//==================================================
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Practice_MemberInsertForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
a {text-decoration: none;}
</style>
<script type="text/javascript">
// 이름이 제대로 입력됐을 경우
// Practice_MemberInsert.jsp 페이지로 이동하여
// 회원 입력이 이루어지도록 하는 함수
function memberScoreSubmit()
{
//alert("함수 호출 확인~!!");
// ① 국어점수, 영어점수, 수학점수 객체와, 에러 메시지를 가져온다. (객체로)
// → document.getElementById("id");
var kor = document.getElementById("kor");
var eng = document.getElementById("eng");
var mat = document.getElementById("mat");
var korMsg = document.getElementById("korMsg");
var engMsg = document.getElementById("engMsg");
var matMsg = document.getElementById("matMsg");
// ② 모든 에러 메시지를 보이지 않도록 한다.
korMsg.style.display = "none";
engMsg.style.display = "none";
matMsg.style.display = "none";
// ③ 점수 입력값이 0~100 사이의 수가 아니거나,
// 입력하지 않았거나,
// 숫자형태의 문자열이 아닐 경우
// ⓐ 에러 메시지를 "inline"으로 바꾸어 표시되도록 하고
// ⓑ 해당 입력창에 focus를 준 후
// ⓒ return 시킨다.
if (parseInt(kor.value) < 0 || parseInt(kor.value) > 100 || kor.value == "" || isNaN(kor.value))
{
korMsg.style.display = "inline";
kor.focus();
return;
}
if (parseInt(eng.value) < 0 || parseInt(eng.value) > 100 || eng.value == "" || isNaN(eng.value))
{
engMsg.style.display = "inline";
eng.focus();
return;
}
if (parseInt(mat.value) < 0 || parseInt(mat.value) > 100 || mat.value == "" || isNaN(mat.value))
{
matMsg.style.display = "inline";
mat.focus();
return;
}
memberScoreForm.submit();
}
// 취소 버튼을 눌렀을 때,
// 입력 값이 초기화되도록 하는 함수
function memberScoreReset()
{
// ① 에러 메시지 객체와 국어, 영어, 수학점수 입력 객체를 가져온다.
var kor = document.getElementById("kor");
var eng = document.getElementById("eng");
var mat = document.getElementById("mat");
var korMsg = document.getElementById("korMsg");
var engMsg = document.getElementById("engMsg");
var matMsg = document.getElementById("matMsg");
// ② 에러 메시지를 전부 보이지 않게 변경한다.
korMsg.style.display = "none";
engMsg.style.display = "none";
matMsg.style.display = "none";
// ③ memberScoreForm 을 reset() 시킨다.
memberScoreForm.reset();
// ④ 국어점수 입력 칸에 focus 를 준다.
kor.focus();
}
</script>
</head>
<body>
<div>
<h1>회원 <span style="color:red;">성적</span> 관리 및 <span style="color: green;">입력</span> 페이지</h1>
<hr />
</div>
<!-- div>a[href="Practice_MemberSelect.jsp"]>button[type="button"].btn{회원 명단 관리} -->
<div>
<a href="Practice_MemberScoreSelect.jsp">
<button type="button">회원 성적 관리</button>
</a>
</div>
<br />
<div>
<form action="Practice_MemberScoreInsert.jsp?sid=<%=sid %>" method="post" name="memberScoreForm" >
<table class='table'>
<tr>
<th>번호</th>
<!-- <td>1</td> -->
<td><%=sid %></td>
</tr>
<tr>
<th>이름</th>
<!-- <td>홍길동</td> -->
<td><%=name %></td>
</tr>
<tr>
<th>국어점수</th>
<td><input type="text" name="kor" id="kor" class="txtScore" /></td>
<!-- td>span.errMsg[id="korMsg"]{국어점수를 0부터~100까지의 정수로 입력해 주십시오.} -->
<td><span class="errMsg" id="korMsg">국어점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<th>영어점수</th>
<td><input type="text" name="eng" id="eng" class="txtScore"/></td>
<td><span class="errMsg" id="engMsg">영어점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<th>수학점수</th>
<td><input type="text" name="mat" id="mat" class="txtScore"/></td>
<td><span class="errMsg" id="matMsg">수학점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<td></td>
<td>
<a href="javascript:memberScoreSubmit()">
<button type="button" class="btn">입력하기</button>
</a>
<a href="javascript:memberScoreReset()">
<button type="button" class="btn">취소하기</button>
</a>
<a href="Practice_MemberScoreSelect.jsp">
<button type="button" class="btn">목록으로</button>
</a>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
Practice_MemberScoreInsert.jsp
<%@page import="com.test.MemberScoreDTO"%>
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// ① 이전 페이지(Practice_MemberScoreInsertForm.jsp)로부터 넘어온 데이터 수신
// → sid, kor, eng, mat
String sid = request.getParameter("sid");
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int mat = Integer.parseInt(request.getParameter("mat"));
// ================================================================
// 데이터를 입력할 때는 sid, kor, eng, mat 값만 필요하다.
// ================================================================
// String sql = "INSERT INTO TBL_MEMBERSCORE(SID, KOR, ENG, MAT)"
// + " VALUES(?, ?, ?, ?)";
// ================================================================
// → (TBL_MEMBERSCORE) 테이블에 이름은 들어가지 않는다~!!
// ================================================================
// ② MemberScoreDAO 객체 생성
MemberScoreDAO dao = new MemberScoreDAO();
try
{
// ③ try~catch 내부에서 dao.connection() 메소드로 데이터베이스 연결
dao.connection();
// ④ MemberScoreDTO 객체 생성
// → 『MemberScoreDTO score = new MemberScoreDTO();』
// 성적 데이터를 입력하는 dao.add(MemberScoreDTO score) 메소드를
// 사용하기 위함.
MemberScoreDTO score = new MemberScoreDTO();
// ⑤ MemberScoreDTO score 객체에
// 사용자가 입력한 값들을 set 해준다.
score.setSid(sid);
score.setKor(kor);
score.setEng(eng);
score.setMat(mat);
// ⑥ dao.add(MemberScoreDTO score) 메소드를 통해
// 성적 데이터를 입력한다.
dao.add(score);
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
// ⑦ 데이터 입력 처리가 끝났다면, 성적 목록 페이지로
// 클라이언트를 이동시킨다.
response.sendRedirect("Practice_MemberScoreSelect.jsp");
// 아래 부분 (HTML)은 모두 삭제한다.
%>
Ⅱ [회원 성적 데이터 수정] - Practice_MemberScoreUpdateForm.jsp, Practice_MemberScoreUpdate.jsp
Practice_MemberScoreUpdateForm.jsp
<%@page import="com.test.MemberScoreDTO"%>
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// ① 이전 페이지(Practice_MemberScoreSelect.jsp)로부터 넘어온 데이터 수신
// → sid
String sid = request.getParameter("sid");
// ▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨
// <a href="Practice_MemberScoreUpdateForm.jsp?sid=score.getSid()&&name=score.getName()">
// ▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨▨
// → 위와 같은 형태로 sid와 name 모두 전송하여 수신해서 처리할 수도 있다.
//String name2 = request.getParameter("name");
// ② MemberScoreDAO 객체 생성
MemberScoreDAO dao = new MemberScoreDAO();
String name = "";
int kor, eng, mat;
kor=eng=mat=0;
try
{
// ③ try~catch 문 내부에서 데이터베이스와 연결을 진행한다.
dao.connection();
// ③ 받아온 sid에 해당하는 원본 데이터를 뿌려주기 위해
// 『MemberScoreDTO dao.search(String sid)』 메소드 사용하여
// 원본 값을 name, kor, eng, mat 변수에 저장.
MemberScoreDTO score = dao.search(sid);
name = score.getName();
kor = score.getKor();
eng = score.getEng();
mat = score.getMat();
// ④ 이 값을, 사용자의 수정 입력창의 value 값에
// 스크립트릿 형식으로 뿌려준다.
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
//==================================================
// [최종적으로...]
//==================================================
// 이렇게 얻어낸 값을...
// 국어점수 [ ]
// 영어점수 [ ]
// 수학점수 [ ]
// 입력창 위에 뿌려준다.
// ↓↓↓↓↓↓↓(HTML 내부에 스크립트릿으로 구성.)
//==================================================
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Practice_MemberInsertForm.jsp</title>
<link rel="stylesheet" type="text/css" href="css/MemberScore.css">
<style type="text/css">
a {text-decoration: none;}
a {text-align: }
</style>
<script type="text/javascript">
// 이름이 제대로 입력됐을 경우
// Practice_MemberInsert.jsp 페이지로 이동하여
// 회원 입력이 이루어지도록 하는 함수
function memberScoreSubmit()
{
//alert("함수 호출 확인~!!");
// ① 국어점수, 영어점수, 수학점수 객체와, 에러 메시지를 가져온다. (객체로)
// → document.getElementById("id");
var kor = document.getElementById("kor");
var eng = document.getElementById("eng");
var mat = document.getElementById("mat");
var korMsg = document.getElementById("korMsg");
var engMsg = document.getElementById("engMsg");
var matMsg = document.getElementById("matMsg");
// ② 모든 에러 메시지를 보이지 않도록 한다.
korMsg.style.display = "none";
engMsg.style.display = "none";
matMsg.style.display = "none";
// ③ 점수 입력값이 0~100 사이의 수가 아니거나,
// 입력하지 않았거나,
// 숫자형태의 문자열이 아닐 경우
// ⓐ 에러 메시지를 "inline"으로 바꾸어 표시되도록 하고
// ⓑ 해당 입력창에 focus를 준 후
// ⓒ return 시킨다.
if (parseInt(kor.value) < 0 || parseInt(kor.value) > 100 || kor.value == "" || isNaN(kor.value))
{
korMsg.style.display = "inline";
kor.focus();
return;
}
if (parseInt(eng.value) < 0 || parseInt(eng.value) > 100 || eng.value == "" || isNaN(eng.value))
{
engMsg.style.display = "inline";
eng.focus();
return;
}
if (parseInt(mat.value) < 0 || parseInt(mat.value) > 100 || mat.value == "" || isNaN(mat.value))
{
matMsg.style.display = "inline";
mat.focus();
return;
}
memberScoreForm.submit();
}
// 취소 버튼을 눌렀을 때,
// 입력 값이 초기화되도록 하는 함수
function memberScoreReset()
{
// ① 에러 메시지 객체와 국어, 영어, 수학점수 입력 객체를 가져온다.
var kor = document.getElementById("kor");
var eng = document.getElementById("eng");
var mat = document.getElementById("mat");
var korMsg = document.getElementById("korMsg");
var engMsg = document.getElementById("engMsg");
var matMsg = document.getElementById("matMsg");
// ② 에러 메시지를 전부 보이지 않게 변경한다.
korMsg.style.display = "none";
engMsg.style.display = "none";
matMsg.style.display = "none";
// ③ memberScoreForm 을 reset() 시킨다.
memberScoreForm.reset();
// ④ 국어점수 입력 칸에 focus 를 준다.
kor.focus();
}
</script>
</head>
<body>
<div>
<h1>회원 <span style="color:red;">성적</span> 관리 및 <span style="color: blue;">수정</span> 페이지</h1>
<hr />
</div>
<!-- div>a[href="Practice_MemberSelect.jsp"]>button[type="button"].btn{회원 명단 관리} -->
<div>
<a href="Practice_MemberScoreSelect.jsp">
<button type="button">회원 성적 관리</button>
</a>
</div>
<br />
<div>
<form action="Practice_MemberScoreUpdate.jsp?sid=<%=sid %>" method="post" name="memberScoreForm" >
<table class='table'>
<tr>
<th>번호</th>
<!-- <td>1</td> -->
<td><%=sid %></td>
</tr>
<tr>
<th>이름</th>
<!-- <td>홍길동</td> -->
<td><%=name %></td>
<%-- <td><%=name2 %></td> --%>
</tr>
<tr>
<th>국어점수</th>
<td><input type="text" name="kor" id="kor" class="txtScore" value="<%=kor %>"/></td>
<td><span class="errMsg" id="korMsg">국어점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<th>영어점수</th>
<td><input type="text" name="eng" id="eng" class="txtScore" value="<%=eng %>"/></td>
<td><span class="errMsg" id="engMsg">영어점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<th>수학점수</th>
<td><input type="text" name="mat" id="mat" class="txtScore" value="<%=mat %>"/></td>
<td><span class="errMsg" id="matMsg">수학점수를 0부터~100까지의 정수로 입력해 주십시오.</span></td>
</tr>
<tr>
<td></td>
<td>
<a href="javascript:memberScoreSubmit()">
<button type="button" class="btn">수정하기</button>
</a>
<a href="javascript:memberScoreReset()">
<button type="button" class="btn">취소하기</button>
</a>
<a href="Practice_MemberScoreSelect.jsp">
<button type="button" class="btn">목록으로</button>
</a>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
Practice_MemberScoreUpdate.jsp
<%@page import="com.test.MemberScoreDTO"%>
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// ① 이전 페이지(Practice_MemberScoreSelect.jsp)로부터 넘어온 데이터 수신
// → sid, kor, eng, mat
String sid = request.getParameter("sid");
int kor = Integer.parseInt(request.getParameter("kor"));
int eng = Integer.parseInt(request.getParameter("eng"));
int mat = Integer.parseInt(request.getParameter("mat"));
// ② MemberScoreDAO 객체 생성
MemberScoreDAO dao = new MemberScoreDAO();
try
{
// ③ try~catch 문 내부에서, 데이터베이스 연결
dao.connection();
// ④ MemberScoreDTO 객체 생성
MemberScoreDTO score = new MemberScoreDTO();
// → 『int dao.modify(MemberScoreDTO score)』
// 성적 데이터 수정을 담당하는 메소드의 매개변수가
// MemberScoreDTO 객체이기 때문~!!
// ⑤ MemberScoreDTO 객체에
// 사용자가 입력한 값들을 set
score.setSid(sid);
score.setKor(kor);
score.setEng(eng);
score.setMat(mat);
// ⑥ 성적 데이터 수정 메소드인 modify(MemberScoreDTO score)를 호출하여
// 최종적으로 성적 수정.
dao.modify(score);
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
// ⑦ 성적 수정을 모두 완료했다면, 성적 명단 관리 페이지로
// 클라이언트를 이동시킨다.
response.sendRedirect("Practice_MemberScoreSelect.jsp");
// 아래의 HTML 부분 모두 삭제.
// Practice_MemberScoreUpdate.jsp 는
// 클라이언트에게 노출되지 않는 페이지 뒷단 로직 처리 페이지이므로...
%>
Ⅲ [회원 성적 데이터 삭제] - Practice_MemberScoreDelete.jsp
Practice_MemberScoreDelete.jsp
<%@page import="com.test.MemberScoreDAO"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// ① 이전 페이지(Practice_MemberScoreSelect.jsp)로부터 넘어온 데이터 수신
// → sid
String sid = request.getParameter("sid");
// ② MemberScoreDAO 객체 생성
MemberScoreDAO dao = new MemberScoreDAO();
try
{
// ③ try~catch 문 내부에서 데이터 베이스와 연결
// → connection() 에서 사용된 DBConn.getConnection() 메소드는
// SQLException, ClassNotFoundException 을 throws 하는 형태이므로...
dao.connection();
// ④ 성적 삭제의 경우, 회원 정보 삭제와 달리
// 자식 레코드가 존재하지 않는 최하위 레코드이므로
// 따져야할 사항 없이 바로 삭제가 가능하다.
// → 『int dao.remove(String sid)』
// 성적 데이터 삭제 메소드를 통해 성적 정보를 삭제한다.
dao.remove(sid);
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
dao.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
// ⑤ 성적 정보를 삭제했다면, 클라이언트를 회원 성적 관리 페이지로
// 페이지를 이동 시킨다.
response.sendRedirect("Practice_MemberScoreSelect.jsp");
// 아래 부분 모두 삭제한다.
// 이 페이지는 사용자에게 노출되지 않고, 데이터 삭제만 수행하는 페이지 이므로...
%>