Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

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
1 [성적 입력], 2 [성적 수정], 3 [성적 삭제]

 


 

 

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");
// 아래 부분 모두 삭제한다.
// 이 페이지는 사용자에게 노출되지 않고, 데이터 삭제만 수행하는 페이지 이므로...
%>