-
[JSP] 006. JAVA Bean(자바 빈)SsY/Class 2023. 5. 25. 14:50728x90
JAVA Bean(자바 빈)
- JAVA Bean 의 개요
■■■ JAVA Bean(자바 빈) ■■■ ○ 개요 - 자바로 작성된 컴포넌트(객체)들을 일반적으로 일컫는 말 ○ 사용 목적 - JSP 페이지에서 로직 부분을 분리하여 코드를 재사용함으로써 프로그램 구성 효율을 높이기 위함 ○ JAVA Bean 만들기 - 자바 빈은 클래스이므로 자바 클래스를 설계하는 것과 기본 규칙이 같다. - 자바 빈에서는 멤버 변수를 프로퍼티(Property)라고 부른다. - 클래스 선언은 『public』, 프로퍼티 선언은 『private』으로 한다. //-- 모든 모듈에서 사용할 수 있게~ //--정보은닉 - 프로퍼티 당 하나의 getter 와 setter 를 갖는다. //-- getter/setter 로 프로퍼티 접근 - (매개변수가 없는) 기본 생성자를 포함한다. //-- 사용자정의 생성자 생성시 //-- default 생성자가 자동 생성되지 않으므로 //-- 매개변수 없이 인스턴스생성가능하도록 만들어둔다! - 직렬화 할 수 있어야 한다. - POJO(Plain Old Java Object)(포조) //-- 상속, 인터페이스가 전혀 없는! //-- RMI 가 사용되지 않게 되면서 조금 더 완화됨 //-- 결합도를 낮추기 위해서 사용하는 것 //-- 하나의 부품처럼 규격과 사이즈를 통일해두면 여러군데서 활용이 가능
WebApp10
- DTO , DAO 의 개념을 적용을 통한 기능 구현- MemberDTO
/* =========================== MemberDTO.java - 데이터 전송 객체 활용 =========================== */ package com.test; public class MemberDTO { // 주요 속성 구성 private String sid, name, tel; //-- TBL_Member 테이블의 컬럼 구조 //-- 또는 쿼리문 조회를 위해 생성한 VIEW의 속성과 동일하게 구성 // 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 String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
- MemberDAO
/* ========================================== MemberDAO.java - 데이터베이스 액션 처리 전용 객체 활용 =========================================== */ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.util.DBConn; public class MemberDAO { // 주요 속성 구성 private Connection conn; // 데이터베이스 연결 메소드 정의 → 생성자 형태로 정의 public MemberDAO() throws ClassNotFoundException, SQLException { conn = DBConn.getConnection(); } // 데이터 입력 메소드 정의 public int add(MemberDTO dto) throws SQLException { int result = 0; String sql = "INSERT INTO TBL_MEMBER(SID,NAME,TEL)" + " VALUES(MEMBERSEQ.NEXTVAL, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); // ? 에 대한 값 setting pstmt.setString(1, dto.getName()); pstmt.setString(2, dto.getTel()); result = pstmt.executeUpdate(); pstmt.close(); return result; } // 리스트 출력 메소드 정의 -- MemberDTO 들을 반환할 수 있는 자료구조형 public ArrayList<MemberDTO> list() throws SQLException { ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID"; PreparedStatement pstmt = conn.prepareStatement(sql); // 넘겨줄 변수가 없으면 setting 생략 ResultSet rs = pstmt.executeQuery(); while(rs.next()) { // MemberDTO 인스턴스 생성 MemberDTO dto = new MemberDTO(); dto.setSid(rs.getString("SID")); dto.setName(rs.getString("NAME")); dto.setTel(rs.getString("TEL")); result.add(dto); } rs.close(); pstmt.close(); return result; } // 인원 수 조회 메소드 정의 public int count() throws SQLException { int result = 0; String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); // 얻어내는 값이 단일 값일 때 반복문이 아닌 아래와 같이 if 문 구성 가능 if (rs.next()) result = rs.getInt("COUNT"); rs.close(); pstmt.close(); return result; } // 데이터베이스 연결 종료 메소드 정의 public void close() throws SQLException { DBConn.close(); } }//end MemberDAO
- MemberList.jsp
<%-- 내 풀이 import <%@page import="com.test.MemberDTO"%> <%@page import="java.util.ArrayList"%> <%@page import="com.test.MemberDAO"%> --%> <%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% StringBuffer str = new StringBuffer(); MemberDAO dao = null; String memberCount = "<span id='memberCount'>전체 인원 수 : "; try { dao = new MemberDAO(); memberCount += dao.count() + "명</span>"; // 전체 인원수 조회 메소드 사용 -> 인원수 구하기 str.append("<table class='table'>"); str.append("<tr><th>번호</th><th>이름</th><th>전화번호</th></tr>"); // MemberDAO 객체의 lists() 메소드 호출 //-- 반복문을 톨해 <table> 하위 엘리먼트 생성 for(MemberDTO member :dao.list()) { str.append("<tr>"); str.append("<td class='record'>"+member.getSid()+"</td>"); str.append("<td class='record'>"+member.getName()+"</td>"); str.append("<td class='record'>"+member.getTel()+"</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()); } } /* -- 내 풀이 // 데이터 전체 조회 // MemberDAO 인스턴스 생성 -- 생성자 : DB 연결 MemberDAO dao = new MemberDAO(); // 자료 받아올 ArrayList() 생성 ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); // 전체 리스트 조회 메소드 담기 result = dao.list(); // 결과 담을 변수 선언 String list = ""; // 반복문 통해서 담기 list += "<table>"; list += "<tr><th>번호</th><th>이름</th><th>전화번호</th></tr>"; for(MemberDTO dto : result) { list += String.format("<tr><td class='record'>%s</td> <td class='record'>%s</td> <td class='record'>%s</td></tr>", dto.getSid(), dto.getName(), dto.getTel()); } list += "</table>"; // 전체 인원수 조회 메소드 int count = dao.count(); dao.close(); */ %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MemberList.jsp</title> <link rel="stylesheet" type="text/css" href="css/main.css"> <style type="text/css"> .record {text-align: center;} input {width: 200px; border-radius: 6px;} button {width: 324px; height: 40px; font-family: 맑은 고딕; font-weight: bold;} .errMsg {font-size: small; font-color:red; display:none;} </style> <script> function formcheck() { } </script> </head> <body> <div> <h1>데이터베이스 연동 회원관리 실습</h1> <hr> </div> <div> <h2>DAO, DTO 개념 적용</h2> <form omsubmit="return formCheck()"> <table class="table"> <tr> <th>이름</th> <td> <input type="text" id="userName" class="txt"> <span class="errMsg" id="nameMsg">이름을 입력해야 합니다.</span> </td> </tr> <tr> <th>전화번호</th> <td> <input type="text" id="userTel" name="userTel" class="txt"> </td> </tr> <tr> <td colspan="2"> <button type="submit" class="btn" id="btnAdd">회원 추가</button> </td> </tr> </table> </form> </div> <br><br> <div> <!-- <span id="memberCount">전체 인원 수 : 3 명</span> --> <!-- <table> <tr> <th>번호</th><th>이름</th><th>전화번호</th> </tr> <tr> <td class="record">1</td> <td class="record">고길동</td> <td class="record">010-1111-1111</td> </tr> <tr> <td class="record">2</td> <td class="record">도우너</td> <td class="record">010-2222-2222</td> </tr> <tr> <td class="record">3</td> <td class="record">마이콜</td> <td class="record">010-3333-3333</td> </tr> </table> --> <%=memberCount %> <!-- 테이블 결과 --> <%=str.toString() %> <!-- String Buffer 전체를 String으로 변환 --> <%--내 풀이 <span id="memberCount">전체 인원 수 : <%=count %> 명</span> <%=list %> --%> </div> </body> </html>
- MemberInsert.jsp
<%-- 내 풀이 <%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> --%> <%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberInsert.jsp //-- 데이터 입력 액션 처리 페이지 // 한글 데이터가 깨지지 않도록 인코딩 설정 //-- 이전 수신 페이지의 CharacterSet 으로 설정해야 깨지지 않는다. request.setCharacterEncoding("UTF-8"); // 이전 페이지(MemberList.jsp) 로 부터 데이터 수신 //-- userName, userTel String userName = request.getParameter("userName"); String userTel = request.getParameter("userTel"); MemberDAO dao = null; // DBConn 에서 예외를 throw 하고 있기 때문에 안에서 작업 try { dao = new MemberDAO(); // MemberDTO 구성 MemberDTO member = new MemberDTO(); member.setName(userName); member.setTel(userTel); // dao 의 add() 메소드 호출 → insert 쿼리문 수행 dao.add(member); // 필요하다면 add() 메소드의 리턴값을 받아 // insert 액션의 정상처리 여부 확인 후 추가 코드 구성 가능 } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch(Exception e) { System.out.println(e.toString()); } } // URL 주소가 적혀있는(기록되어 있는) 쪽지를 클라이언트에 전달 // (이 주소를 요청해서 찾아가도록 하세요) response.sendRedirect("MemberList.jsp"); %> <%-- 내 풀이 <% // 이전 페이지(MemberList.jsp) 로 부터 데이터 수신 //-- userName, userTel // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); String name = request.getParameter("userName"); String tel = request.getParameter("userTel"); // 결과 값 담을 변수 선언 int res = 0; // 데이터베이스 연결 MemberDAO dao = null; try { // 인스턴스 생성 -- DB 연결 dao = new MemberDAO(); // dto 객체 생성 MemberDTO dto = new MemberDTO(); // dto 에 값 담기 dto.setName(name); dto.setTel(tel); // add 메소드로 값 담고 반환받기 res = dao.add(dto); if(res<1) response.sendError(500, "데이터 입력에 실패하였습니다."); else response.sendRedirect("MemberList.jsp"); } catch(Exception e) { System.out.println(e.toString()); } finally { // DB 연결 닫기 dao.close(); } %> --%> <!-- 클라이언트를 만나지 않는 페이지 클라이언트의 동선을 최소화하기 위한 처리 -- 현재 진행중인 트렌드 요즘 트렌드는 점점 보안성을 위해 재로그인 등의 처리를 추가하는 과도기에 있다고 함 -->
WebApp11
성적처리 프로세스 구현
- ScoreDTO / ScoreDAO / ScoreList / ScoreInsert- ScoreDTO
package com.test; public class ScoreDTO { private String sid, name; private int kor, eng, mat, tot; private double avg; 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 double getAvg() { return avg; } public void setAvg(double avg) { this.avg = avg; } }
- ScoreDAO
package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.util.DBConn; public class ScoreDAO { private Connection conn; // DB 접속 메소드 -- 생성자 형태 public ScoreDAO() throws ClassNotFoundException, SQLException { conn = DBConn.getConnection(); } // DB 종료 메소드 public void close() throws SQLException { DBConn.close(); } // 전체 성적 리스트 조회 메소드 public ArrayList<ScoreDTO> list() { ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>(); try { // 쿼리문 준비 String sql = "SELECT SID, NAME, KOR, ENG, MAT, (KOR+ENG+MAT) AS TOT" + ", ROUND((KOR+ENG+MAT)/3,2) AS AVG FROM TBL_SCORE ORDER BY SID"; // preparedStatement 객체 생성 PreparedStatement pstmt = conn.prepareStatement(sql); // 결과 값 Result Set 에 담기 ResultSet rs = pstmt.executeQuery(); // 반복문으로 rs 값 ArrayList 에 담아내기 while(rs.next()) { // 새 DTO 객체 생성 ScoreDTO dto = new ScoreDTO(); // DTO 에 값 담아내기 dto.setSid(rs.getString("SID")); dto.setName(rs.getString("NAME")); dto.setKor(rs.getInt("KOR")); dto.setEng(rs.getInt("ENG")); dto.setMat(rs.getInt("MAT")); dto.setTot(rs.getInt("TOT")); dto.setAvg(rs.getDouble("AVG")); // 값이 채워진 DTO ArrayList 에 담기 result.add(dto); } // 사용한 객체 반납 rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end list() // 데이터 입력 메소드 public int insert(ScoreDTO dto) { int result = 0; try { // 쿼리문 준비 String sql = "INSERT INTO TBL_SCORE(SID,NAME,KOR,ENG,MAT) VALUES(SCORESEQ.NEXTVAL,?,?,?,?)"; // PreparedStatement 객체 준비 PreparedStatement pstmt = conn.prepareStatement(sql); // PreparedStatement 의 ? 에 값 Setting //-- 이름, 국어점수, 영어점수, 수학점수 pstmt.setString(1, dto.getName()); pstmt.setInt(2, dto.getKor()); pstmt.setInt(3, dto.getEng()); pstmt.setInt(4, dto.getMat()); // 채워진 PreparedStatement 객체 전달 result = pstmt.executeUpdate(); // 사용한 객체 반납 pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end insert() // 성적 리스트 인원 수 메소드 public int count() { int result = 0; try { // 쿼리문 준비 String sql = "SELECT COUNT(*) AS COUNT FROM TBL_SCORE"; // PreparedStatement 객체 생성 PreparedStatement pstmt = conn.prepareStatement(sql); // PreparedStatement 객체 전달 ResultSet rs = pstmt.executeQuery(); // ResultSet 의 결과 result 에 담기 if (rs.next()) result = rs.getInt("COUNT"); // 사용한 객체 반납 rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end count() }// end Class ScoreDAO
- ScoreList
<%@page import="com.test.ScoreDTO"%> <%@page import="com.test.ScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // 결과 받을 객체 생성 StringBuffer str = new StringBuffer(); ScoreDAO dao = null; String count = "<span class='countMsg'>전체 성적 데이터 수 : "; try { // DB 연결 dao = new ScoreDAO(); // 전체 데이터 수 조회 count += (dao.count() + " (개)</span>"); // 리스트 담아내기 str.append("<table class='listTbl'>"); str.append("<tr><th>번호</th><th>이름</th><th>국어점수</th><th>영어점수</th><th>수학점수</th><th>총점</th><th>평균</th></tr>"); // list 메소드 로 리스트 받아와 str 에 담기 for(ScoreDTO dto : dao.list()) { str.append("<tr>"); str.append("<td>"+ dto.getSid() +"</td>"); str.append("<td>"+ dto.getName() +"</td>"); str.append("<td>"+ dto.getKor() +"</td>"); str.append("<td>"+ dto.getEng() +"</td>"); str.append("<td>"+ dto.getMat() +"</td>"); str.append("<td>"+ dto.getTot() +"</td>"); str.append("<td>"+ dto.getAvg() +"</td>"); str.append("</tr>"); } str.append("</table>"); } catch(Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch(Exception e) { System.out.println(e.toString()); } } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>ScoreList.jsp</title> <link rel="stylesheet" type="text/css" href="css/main.css"> <style type="text/css"> * {margin: auto; text-align: center;} .btn {width: 280px; height: 50px; background-color: #1a64d5; color: white; border:#1a64d5;} .errMsg {font-size:small; color:red; display:none;} .listTbl {width: 600px; text-align: center; } .countMsg {font-weight: bold; color: #11438e;} th {background-color: #1a64d5; color: white;} .title {height: 150px;} </style> <script type="text/javascript"> function formCheck() { var name = document.getElementById("uName"); var msg = document.getElementById("nameMsg"); var kor = document.getElementById("uKor"); var eng = document.getElementById("uEng"); var mat = document.getElementById("uMat"); msg.style.display="none"; if (name.value=="") { msg.style.display="inline"; name.focus(); return false; } if (parseInt(kor.value)>100 || parseInt(kor.value)<0) { kor.focus(); return false; } if (parseInt(eng.value)>100 || parseInt(eng.value)<0) { eng.focus(); return false; } if (parseInt(mat.value)>100 || parseInt(mat.value)<0) { mat.focus(); return false; } if (kor.value=="") document.getElementById("uKor").value = 0; if (eng.value=="") document.getElementById("uEng").value = 0; if (mat.value=="") document.getElementById("uMat").value = 0; return true; } </script> </head> <body> <div class='title'> <br> <h1>성적처리 프로세스 구현</h1> <br> <hr> </div> <div class='inputbox'> <form action="ScoreInsert.jsp" method="post" onsubmit="return formCheck()"> <table class="inputTbl"> <tr> <td>이름(*)</td> <td> <input type='text' class='txt' id='uName' name='uName'> <span class="errMsg" id="nameMsg">이름은 필수 입력사항입니다.</span> </td> </tr> <tr> <td>국어점수</td> <td> <input type='text' class='txt' id='uKor' name='uKor' placeholder='0~100'> </td> </tr> <tr> <td>영어점수</td> <td> <input type='text' class='txt' id='uEng' name='uEng' placeholder='0~100'> </td> </tr> <tr> <td>수학점수</td> <td> <input type='text' class='txt' id='uMat' name='uMat' placeholder='0~100'> </td> </tr> <tr> <td colspan=2> <span style="text-align: center; color: blue; font-size:small;">※ 값을 입력하지 않으면 0 점 처리 됩니다</span> </td> </tr> <tr> <td colspan=2> <button type="submit" class="btn">성적 입력</button> </td> </tr> </table> </form> <br><br> <hr> </div> <div> <!-- 데이터 입력 --> <!-- 전체 성적 데이터 수 --> <br><br> <%=count %> <br><br> <!-- 번호 이름 국어점수 영어점수 수학점수 총점 평균 --> <%=str.toString() %> </div> </body> </html>
- ScoreInsert
<%@page import="com.test.ScoreDTO"%> <%@page import="com.test.ScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // ScoreInsert.jsp -- 클라이언트와 만날 필요성이 X // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); // 이전 페이지(ScoreList.jsp) 데이터 수신 //-- uName, uKor, uEng, uMat String name = request.getParameter("uName"); String korStr = request.getParameter("uKor"); String engStr = request.getParameter("uEng"); String matStr = request.getParameter("uMat"); int kor, eng, mat; kor = eng = mat = 0; ScoreDAO dao = null; try { kor = Integer.parseInt(korStr); eng = Integer.parseInt(engStr); mat = Integer.parseInt(matStr); // DB 연결 dao = new ScoreDAO(); // insert 메소드에 넣기 위해 dto 객체 구성 ScoreDTO dto = new ScoreDTO(); dto.setName(name); dto.setKor(kor); dto.setEng(eng); dto.setMat(mat); int result = dao.insert(dto); if(result <1) // 데이터가 정상 입력 되지 않았을 경우 나올 페이지 response.sendError(500, "내부 서버 오류"); else // 데이터가 정상 입력 되었을 경우 요청할 페이지 response.sendRedirect("ScoreList.jsp"); } catch (Exception e) { System.out.println(e.toString()); } finally { try { // 액션의 결과와는 관계없이 DB 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } %>
회원 명단 + 성적 관리 페이지
- WebApp12- DBConn
/*========================================== DBConn.java - 데이터베이스 연결 전용 객체(Singleton) - 예외 처리 : throws ============================================*/ package com.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConn { private static Connection dbConn; public static Connection getConnection() throws ClassNotFoundException, SQLException { if (dbConn==null) { String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "scott"; String pwd = "tiger"; Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } return dbConn; } public static Connection getConnection(String url, String user, String pwd) throws ClassNotFoundException, SQLException { if(dbConn==null) { Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } return dbConn; } public static void close() throws SQLException { if(dbConn!=null) { if(!dbConn.isClosed()) { dbConn.close(); } } dbConn=null; } }
회원관리
- MemberDTO
/*================================================= MemberDTO.java - 객체 전용 (데이터 보관 및 전송) → JAVA Bean ===================================================*/ package com.test; public class MemberDTO { // 주요 속성 구성(프로퍼티 구성) private String sid, name, tel; //-- 번호, 이름, 전화번호 // 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 String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
- MemberDAO
/*======================================== MemberDAO.java - 데이터베이스 액션 처리 전용 클래스 (TBL_MEMBER 테이블 전용 DAO) ==========================================*/ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.util.DBConn; public class MemberDAO { // 주요 속성 구성 private Connection conn; // 데이터베이스 연결 담당 메소드 public Connection connection() throws ClassNotFoundException, SQLException { conn = DBConn.getConnection(); return conn; } // 데이터 입력 담당 메소드 public int add(MemberDTO dto) throws SQLException { int result=0; String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, ?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, dto.getName()); pstmt.setString(2, dto.getTel()); result = pstmt.executeUpdate(); pstmt.close(); return result; } // 회원 리스트 전체 출력 담당 메소드 public ArrayList<MemberDTO> list() throws SQLException { ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { MemberDTO dto = new MemberDTO(); dto.setSid(rs.getString("SID")); dto.setName(rs.getString("NAME")); dto.setTel(rs.getString("TEL")); result.add(dto); } rs.close(); pstmt.close(); return result; } // 전체 인원 수 확인 담당 메소드 public int count() throws SQLException { int result = 0; String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); if(rs.next()) { result = rs.getInt("COUNT"); } rs.close(); pstmt.close(); return result; } // 데이터베이스 종료 메소드 정의 public void close() throws SQLException { DBConn.close(); } // 메소드 추가 // 번호 검색 담당 메소드(번호를 통해 회원 데이터 조회) //-- 현재... 번호 sid 는 TBL_MEMBER 테이블에서 식별자의 역할을 수행하고 있으며 // 번호를 통한 검색 결과는 한 명의 회원일 수 밖에 없기 때문에 // 반환 자료형은 MemberDTO 형태로 구성하자 public MemberDTO searchMember(String sid) { MemberDTO result = new MemberDTO(); try { String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER 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.setTel(rs.getString("TEL")); } rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } // 메소드 추가 // 회원 데이터 수정 담당 메소드 public int modify(MemberDTO member) { int result = 0; try { String sql = "UPDATE TBL_MEMBER SET NAME=?, TEL=? WHERE SID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, member.getName()); pstmt.setString(2, member.getTel()); pstmt.setInt(3, Integer.parseInt(member.getSid())); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } // 메소드 추가 // 회원 데이터 삭제 담당 메소드 public int remove(String sid) { int result = 0; try { String sql ="DELETE FROM TBL_MEMBER WHERE SID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(sid)); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } // 메소드 추가 // 자식 테이블의 참조 데이터 레코드 수 확인 // → 성적 처리가 되었는지의 여부 확인 public int refCount(String sid) throws SQLException { int result = 0; String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBERSCORE WHERE SID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(sid)); ResultSet rs = pstmt.executeQuery(); while(rs.next()) // if(rs.next()) result = rs.getInt("COUNT"); rs.close(); pstmt.close(); return result; } }
- MemberSelect (Delete 의 경우 Form 없이 함수로 호출)
<%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% StringBuffer str = new StringBuffer(); MemberDAO dao = new MemberDAO();; try { // DB 연결 dao.connection(); str.append("<table class='table'>"); str.append("<tr>"); str.append("<th>번호</th>"); str.append("<th>이름</th>"); str.append("<th>전화번호</th>"); str.append("<th>회원관리</th>"); str.append("</tr>"); for (MemberDTO member : dao.list()) { str.append("<tr>"); str.append("<td>"+ member.getSid() +"</td>"); str.append("<td>"+ member.getName() +"</td>"); str.append("<td>"+ member.getTel() +"</td>"); str.append("<td><a href='MemberUpdateForm.jsp?sid="+ member.getSid() +"'>"); str.append("<button type='button' class='btn01'>수정</button>"); str.append("</a>"); //sid 를 통해서 refCount() 확인 if(dao.refCount(member.getSid())==1) // 참조결과 있을 경우 버튼 비활성화 { str.append("<a href=''>"); str.append("<button type='button' class='btn02'>삭제</button>"); str.append("</a>"); } else { // memberDelete(1, "고길동") // "memberDelete(1, "고길동")" // "... 'memberDelete(1, "고길동")'" // "... 'memberDelete(1, \"고길동\")'" // ※ 자바스크립트에서 사용할 수 있는 따옴표의 종류 // ①"" ②'' ③ \"\" // 일반적으로 따옴표가 두 번 중첩되어 사용하게 되면 // ①과 ②를 사용하면 된다. // 하지만, 따옴표가 세 번 중첩되어 사용될 경우 // ③ escape 를 사용해야한다. str.append("<a href='javascript:memberDelete("+ member.getSid() + ",\"" + member.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>MemberSelect.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 memberDelete(sid,name) { //확인 //alert("번호:"+sid+" ,이름:"+name); var res = confirm("번호:"+sid+" ,이름:"+name+"\n이 회원의 정보를 정말 삭제하시겠습니까?"); // 확인 //alert(res); //-- confirm() 함수를 통해 호출되는 창은 // 확인 → true / 취소 → false 를 반환하게 된다. // 확인 버튼 클릭 시 → res 가 true 일 때... // MemberDelete.jsp 페이지에 삭제 요청 if(res) window.location.href="MemberDelete.jsp?sid="+ sid; } </script> </head> <body> <div> <h1>회원 <span style="color: red;">명단</span> 관리 및 출력 페이지</h1> <hr> </div> <div> <a href="MemberScoreSelect.jsp"><button type="button">회원 성적 관리</button></a> <a href="MemberInsertForm.jsp"><button type="button">신규 회원 등록</button></a> </div> <br> <div> <!-- 리스트 출력 --> <!-- 정적 --> <!-- <table class="table"> <tr> <th style="width: 50px;">번호</th> <th style="width: 100px;">이름</th> <th style="width: 150px;">전화번호</th> <th style="width: 200px;">회원관리</th> </tr> <tr> <td>1</td> <td>희동이</td> <td>010-1111-1111</td> <td> <a href=""><button type="button" class="btn01">수정</button></a> <a href=""><button type="button" class="btn02">삭제</button></a> </td> </tr> <tr> <td>2</td> <td>도우너</td> <td>010-2222-2222</td> <td> <a href=""><button type="button" class="btn01">수정</button></a> <a href=""><button type="button" class="btn01">삭제</button></a> </td> </tr> <tr> <td>3</td> <td>마이콜</td> <td>010-3333-3333</td> <td> <a href=""><button type="button" class="btn01">수정</button></a> <a href=""><button type="button" class="btn01">삭제</button></a> </td> </tr> </table> --> <!-- 동적 --> <%=str.toString() %> </div> </body> </html>
- MemberInsertForm
<%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MemberInsertForn.jsp</title> <link rel="stylesheet" type="text/CSS" href="css/MemberScore.css"> <script type="text/javascript"> function memberSubmit() { //확인 //alert("함수호출확인") var memberForm = document.getElementById("memberForm"); var uName = document.getElementById("uName"); var nameMsg = document.getElementById("nameMsg"); nameMsg.style.display="none"; if (uName.value=="") { nameMsg.style.display = "inline"; uName.focus(); return; // 해당 함수 종료 } // form 을 직접 지정하여 submit 액션 수행 memberForm.submit(); } function memberReset() { // 확인 //alert("함수 호출 확인") var memberForm = document.getElementById("memberForm"); var uName = document.getElementById("uName"); //-- focus 용도 var nameMsg = document.getElementById("nameMsg"); //-- msg style 지정 용도 //-- form reset 하면 수행하지 않아도 되는 구문 //document.getElementById("uName").value=""; //document.getElementById("uTel").value=""; nameMsg.style.display="none"; uName.focus(); // form 을 직접 지정하여 reset 액션 수행 memberForm.reset(); } </script> </head> <body> <div> <h1>회원 <span style="color: red;">명단</span> 관리 및 <span style="color: red;">입력</span> 페이지</h1> <hr> </div> <div> <a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a> </div> <br> <div> <!-- 회원 데이터 입력 폼 구성 --> <form action="MemberInsert.jsp" method="post" id="memberForm"> <table class="table"> <tr> <th>이름(*)</th> <td> <input type='text' id='uName' name='uName'> </td> <td> <span class='errMsg' id='nameMsg'>이름을 입력해야합니다.</span> </td> </tr> <tr> <th>전화번호</th> <td> <input type='text' id='uTel' name='uTel'> </td> <td> </td> </tr> </table> <br> <a href="javascript:memberSubmit()"><button type="button">입력하기</button></a> <a href="javascript:memberReset()"><button type="button">취소하기</button></a> <a href="MemberSelect.jsp"><button type="button">목록으로</button></a> </form> </div> </body> </html> <!-- 사용자의 논리의 흐름을 돕기 위해서 목록으로 가는 버튼과 회원 명단 관리 버튼의 기능이 동일하지만 구성하게 됨 -->
- MemberInsert
<%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberInsert.jsp //-- 데이터베이스의 테이블(TBL_MEMBER)에 // 회원 데이터 추가 액션 처리 수행 // .. 이후, 다시 리스트 페이지(MemberSelect.jsp)를 요청할 수 있도록 클라이언트에 안내 // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); // 이전 페이지로부터 데이터 수신 (MemberInsertForm.jsp) String uName = request.getParameter("uName"); String uTel = request.getParameter("uTel"); // DB 연결 준비 MemberDAO dao = new MemberDAO(); try { // DB 연결 dao.connection(); // MemberDTO 객체 생성 및 속성 구성 (→add 메소드를 통해 입력할 DTO 구성) MemberDTO member = new MemberDTO(); member.setName(uName); member.setTel(uTel); // insert 쿼리문을 수행하는 메소드 호출 // → dao의 add()메소드 dao.add(member); // 반환 값을 받아서 추가 업무 수행 코드 삽입 가능 } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } // check // 클라이언트가 MemberSelect.jsp 페이지를 다시 요청할 수 있도록 안내 // → 다시 요청하는 과정에서 리스트 갱신 response.sendRedirect("MemberSelect.jsp"); %> <!-- 클라이언트와 만나지 않는 페이지이기 때문에 모두 제거해두었음 -->
- MemberUpdateForm
<%@page import="com.test.MemberDTO"%> <%@page import="java.sql.ResultSet"%> <%@page import="java.sql.Connection"%> <%@page import="java.sql.PreparedStatement"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // 이전 페이지(MemberSelect.jsp)로부터 데이터 수신 String sid = request.getParameter("sid"); // ※ 수신한 sid 를 가지고 회원데이터 조회 // → 조회해서 얻어낸 데이터를 폼에 구성 String name = ""; String tel=""; MemberDAO dao = new MemberDAO(); try { // DB 연결 dao.connection(); // sid 를 가지고 있는 회원데이터를 얻어내는 메소드 호출 // → dao 의 searchMember() 메소드 호출 MemberDTO member = dao.searchMember(sid); // 가져온 값에서 name , tel 넣기 name = member.getName(); tel = member.getTel(); } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MemberUpdateForn.jsp</title> <link rel="stylesheet" type="text/CSS" href="css/MemberScore.css"> <script type="text/javascript"> function memberSubmit() { //확인 //alert("함수호출확인") var memberForm = document.getElementById("memberForm"); var uName = document.getElementById("uName"); var nameMsg = document.getElementById("nameMsg"); nameMsg.style.display="none"; if (uName.value=="") { nameMsg.style.display = "inline"; uName.focus(); return; // 해당 함수 종료 } // form 을 직접 지정하여 submit 액션 수행 memberForm.submit(); } function memberReset() { // 확인 //alert("함수 호출 확인") var memberForm = document.getElementById("memberForm"); var uName = document.getElementById("uName"); //-- focus 용도 var nameMsg = document.getElementById("nameMsg"); //-- msg style 지정 용도 //-- form reset 하면 수행하지 않아도 되는 구문 //document.getElementById("uName").value=""; //document.getElementById("uTel").value=""; nameMsg.style.display="none"; uName.focus(); // form 을 직접 지정하여 reset 액션 수행 memberForm.reset(); } </script> </head> <body> <div> <h1>회원 <span style="color: red;">명단</span> 관리 및 <span style="color: red;">수정</span> 페이지</h1> <hr> </div> <div> <a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a> </div> <br> <div> <!-- 회원 데이터 수정 폼 구성 --> <!-- ※주의 업데이트 시에는 sid 가 필요함 --> <!-- 방법①, 방법②에서 사용 --> <!-- <form action="MemberUpdate.jsp" method="post" id="memberForm"> --> <!-- 방법③ : get방식으로 sid 는 따로 주소로 넘겨주는 방법 --> <form action="MemberUpdate.jsp?sid=<%=sid %>" method="post" id="memberForm"> <table class="table"> <!-- 방법① : 테이블에 보여지는 상태로 수정할 수 없게 만드는 방법 --> <%-- <tr> <th>번호</th> <td> <input type="text" name="sid" value="<%=sid %>" disabled="disabled"> </td> <td> </td> </tr> --%> <tr> <th>이름(*)</th> <td> <input type='text' id='uName' name='uName' value="<%=name%>"> </td> <td> <span class='errMsg' id='nameMsg'>이름을 입력해야합니다.</span> </td> </tr> <tr> <th>전화번호</th> <td> <input type='text' id='uTel' name='uTel' value="<%=tel%>"> </td> <td> </td> </tr> </table> <!-- 방법② : 폼안에서 값을 갖고 있게 하나 사용자가 보지 못하게 숨기는 방법 --> <%-- <input type="hidden" name="sid" value="<%=sid %>"> --%> <br> <a href="javascript:memberSubmit()"><button type="button">수정하기</button></a> <a href="javascript:memberReset()"><button type="button">취소하기</button></a> <a href="MemberSelect.jsp"><button type="button">목록으로</button></a> </form> </div> </body> </html> <!-- 사용자의 논리의 흐름을 돕기 위해서 목록으로 가는 버튼과 회원 명단 관리 버튼의 기능이 동일하지만 구성하게 됨 -->
- MemberUpdate
<%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberUpdate.jsp //-- 데이터베이스의 테이블(TBL_MEMBER)에 // 회원 데이터 수정 액션 처리 수행 // .. 이후, 다시 리스트 페이지(MemberSelect.jsp)를 요청할 수 있도록 클라이언트에 안내 // 한글 깨짐 방지 request.setCharacterEncoding("UTF-8"); // 이전 페이지로부터 데이터 수신 (MemberUpdateForm.jsp) String sid = request.getParameter("sid"); String name = request.getParameter("uName"); String tel = request.getParameter("uTel"); // DB 연결 준비 MemberDAO dao = new MemberDAO(); try { // DB 연결 dao.connection(); // MemberDTO 객체 생성 및 속성 구성 (→modify 메소드를 통해 입력할 DTO 구성) MemberDTO member = new MemberDTO(); member.setSid(sid); member.setName(name); member.setTel(tel); // update 쿼리문을 수행하는 메소드 호출 // → dao의 modify()메소드 dao.modify(member); // 반환 값을 받아서 추가 업무 수행 코드 삽입 가능 } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } // check // 클라이언트가 MemberSelect.jsp 페이지를 다시 요청할 수 있도록 안내 // → 다시 요청하는 과정에서 리스트 갱신 response.sendRedirect("MemberSelect.jsp"); %> <!-- 클라이언트와 만나지 않는 페이지이기 때문에 모두 제거해두었음 -->
- MemberDelete
<%@page import="com.test.MemberDTO"%> <%@page import="com.test.MemberDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberDelete.jsp // 이전 페이지(MemberSelect.jsp)로부터 받아온 데이터 // → sid String sid = request.getParameter("sid"); MemberDAO dao = new MemberDAO(); String strAddr = ""; try { dao.connection(); // 참조하는 레코드 수 확인 int checkCount = dao.refCount(sid); //-- TBL_MEMBER 테이블의 제거하고자 하는 데이터의 // SID 를 참조하는 TBL_MEMBERSCORE 테이블 내의 데이터 갯수 확인 // 그에 따른 분기 if (checkCount==0) //-- 제거 가능 { dao.remove(sid); strAddr = "MemberSelect.jsp"; } else //-- 제거 불가 { //dao.remove(sid); //-- TBL_MEMBERSCORE 테이블의 데이터가 // TBL_MEMBER 테이블의 SID 를 참조하고 있는 경우로 // 삭제가 불가능한 상황 // → 제거하지 못하는 사유를 안내하는 페이지로 이동 // + 리스트 페이지로 돌아가기 버튼 strAddr = "Notice.jsp"; } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } //check!! // 상황에 따라 안내한 페이지로 클라이언트가 다시 요청할 수 있도록 처리 response.sendRedirect(strAddr); %> <%-- 내 풀이 <% // MemberDelete.jsp //-- 데이터베이스의 테이블(TBL_MEMBER)에 // 회원 데이터 추가 액션 처리 수행 // .. 이후, 다시 리스트 페이지(MemberSelect.jsp)를 요청할 수 있도록 클라이언트에 안내 // 이전 페이지로부터 데이터 수신 (MemberSelect.jsp) String sid = request.getParameter("sid"); // DB 연결 준비 MemberDAO dao = new MemberDAO(); try { // DB 연결 dao.connection(); if(dao.refCount(sid)==0) { // delete 쿼리문을 수행하는 메소드 호출 // → dao의 remove()메소드 dao.remove(sid); } // 반환 값을 받아서 추가 업무 수행 코드 삽입 가능 } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } // check // 클라이언트가 MemberSelect.jsp 페이지를 다시 요청할 수 있도록 안내 // → 다시 요청하는 과정에서 리스트 갱신 response.sendRedirect("MemberSelect.jsp"); %> --%> <!-- 클라이언트와 만나지 않는 페이지이기 때문에 모두 제거해두었음 --> <!-- 분기에 따라서 넘겨주지 않는 경우, response 로 페이지 요청을 해주지 않는다면 해당 페이지에 남아있게 되는데, 이를 이용해서 Notice.jsp 의 경우는 해당 페이지 내의 html 영역에서 수행해도 문제 없다. -->
- Notice
<%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Notice.jsp</title> <link rel="stylesheet" type="text/css" href="css/main.css"> </head> <body> <div> <h1>안내</h1> <hr> </div> <div> <p>성적 정보가 등록되어 있으므로 해당 회원 삭제가 불가능합니다</p> <br> <a href="MemberSelect.jsp" style="text-decoration:none;">--돌아가기--</a> </div> </body> </html>
성적관리
- MemberScoreSelect
<%@page import="com.test.MemberScoreDTO"%> <%@page import="java.util.ArrayList"%> <%@page import="com.test.MemberScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // 결과 값 담을 변수 선언 StringBuffer str = new StringBuffer(); // 객체 준비 MemberScoreDAO dao = new MemberScoreDAO(); try { str.append("<table class='table'>"); 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>"); // DB 연결 dao.connection(); // dao 의 list () 메소드 받아오기 for(MemberScoreDTO score : dao.list()) { str.append("<tr>"); str.append("<td>"+ score.getSid() +"</td>"); str.append("<td>"+ score.getName()+"</td>"); str.append("<td class='txtScore'>"+ score.getKor() +"</td>"); str.append("<td class='txtScore'>"+ score.getEng() +"</td>"); str.append("<td class='txtScore'>"+ score.getMat() +"</td>"); str.append("<td class='txtScore'>"+ score.getTot() +"</td>"); str.append("<td class='txtScore'>"+ String.format("%.2f",score.getAvg()) +"</td>"); // 소수점 자리 check str.append("<td class='txtScore'>"+ score.getRank()+"</td>"); /* str.append("<td>"); str.append("<a href=''>"); str.append("<button type='button' class='btn01'>입력</button>"); str.append("</a>"); str.append("<a href=''>"); str.append("<button type='button' class='btn01'>수정</button>"); str.append("</a>"); str.append("<a href=''>"); str.append("<button type='button' class='btn01'>삭제</button>"); str.append("</a>"); str.append("</td>"); */ if (score.getKor()==-1 && score.getEng()==-1 && score.getMat()==-1) { // 성적 처리 안 된 상태 → 입력 가능 수정 및 삭제 불가 str.append("<td>"); str.append("<a href='MemberScoreInsertForm.jsp?sid="+ score.getSid() +"'>"); str.append("<button type='button' class='btn01'>입력</button>"); str.append("</a>"); str.append("<button type='button' class='btn02' disabled='disabled'>수정</button>"); str.append("<button type='button' class='btn02' disabled='disabled'>삭제</button>"); str.append("</td>"); } else { // 성적 처리 완료된 상태 → 입력 불가 수정 및 삭제 가능 str.append("<td>"); str.append("<button type='button' class='btn02' disabled='disabled'>입력</button>"); str.append("<a href='MemberScoreUpdateForm.jsp?sid="+ score.getSid() +"'>"); str.append("<button type='button' class='btn01'>수정</button>"); str.append("</a>"); /* memberScoreDelete(10,"다금바리") 로 넘기는 형식*/ // onclick 으로 a태그 없이도 구성 가능 //str.append("<button type='button' class='btn01' onclick='memberScoreDelete("+ score.getSid()+ ",\"" + score.getName() +"\")'>삭제</button>"); 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>MemberScoreSelect.jsp</title> <link rel="stylesheet" type="text/css" href="css/MemberScore.css"> <script type="text/javascript"> // 삭제는 따로 폼이 필요 없음 -- 삭제 메소드가 돌아갈 페이지는 필요함 function memberScoreDelete(sid, name) { // ※ name 문자열을 넘기는 과정에서 따옴표 구성에 유의할 것!! //확인 //alert("번호:"+sid+" ,이름:"+name); // 이 회원의 성적 데이터를 정말 삭제할 것인지 확인 var res = confirm("번호:"+sid+" ,이름:"+name+"\n이 회원의 점수를 정말 삭제하시겠습니까?"); // 확인 //alert(res); //-- confirm() 함수를 통해 호출되는 창은 // 확인 → true / 취소 → false 를 반환하게 된다. // 확인 버튼 클릭 시 → res 가 true 일 때... // MemberScoreDelete.jsp 페이지에 삭제 요청 if(res) window.location.href="MemberScoreDelete.jsp?sid="+ sid; } </script> </head> <body> <div> <h1>회원 <span style="color: blue;">성적</span> 관리 및 출력 페이지</h1> <hr> </div> <div> <a href="MemberSelect.jsp"><button type="button">회원 명단 관리</button></a> </div> <br> <!-- 번호 이름 국어점수 영어점수 수학점수 총점 평균 석차 성적처리 --> <!-- ... 입력 수정 삭제 --> <!-- ... 입력 수정 삭제 --> <!-- ... 입력 수정 삭제 --> <!-- 정적 테이블 --> <!-- <div> <table class="table"> <tr> <th class="numTh">번호</th> <th class="nameTh">이름</th> <th>국어점수</th><th>영어점수</th><th>수학점수</th> <th>총점</th><th>평균</th><th>석차</th> <th>성적처리</th> </tr> <tr> <td>1</td> <td>고길동</td> <td class="textScore">90</td> <td class="textScore">80</td> <td class="textScore">70</td> <td class="textScore">240</td> <td class="textScore">80.00</td> <td class="textScore">1</td> <td> <button type="button" class="btn01">입력</button> <button type="button" class="btn01">수정</button> <button type="button" class="btn01">삭제</button> </td> </tr> <tr> <td>2</td> <td>도우너</td> <td class="textScore">80</td> <td class="textScore">70</td> <td class="textScore">60</td> <td class="textScore">210</td> <td class="textScore">70.00</td> <td class="textScore">2</td> <td> <button type="button" class="btn01">입력</button> <button type="button" class="btn01">수정</button> <button type="button" class="btn01">삭제</button> </td> </tr> <tr> <td>3</td> <td>마이콜</td> <td class="textScore">-1</td> <td class="textScore">-1</td> <td class="textScore">-1</td> <td class="textScore">-3</td> <td class="textScore">-1</td> <td class="textScore">3</td> <td> <button type="button" class="btn01">입력</button> <button type="button" class="btn01">수정</button> <button type="button" class="btn01">삭제</button> </td> </tr> </table> </div> --> <!-- 동적 테이블 --> <div> <%=str.toString() %> </div> </body> </html>
- MemberScoreDTO
/* ================================================= 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
/* ================================================= MemberScoreDAO.java - 데이터베이스 액션 처리 전용 클래스 (TBL_MEMBERSCORE 테이블 전용 DAO ) =================================================== */ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import com.util.DBConn; public class MemberScoreDAO { // 주요 속성 구성 private Connection conn; // 데이터베이스 연결 담당 메소드 public Connection connection() throws ClassNotFoundException, SQLException { conn = DBConn.getConnection(); return conn; } // 데이터 입력담당 메소드 (성적 데이터 입력) 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; } // 성적 전체 리스트 출력 담당 메소드 public ArrayList<MemberScoreDTO> list() 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"; // 실무에서는 ORDER BY 를 안넣는 것이 일반적 PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { MemberScoreDTO score = new MemberScoreDTO(); score.setSid(rs.getString("SID")); score.setName(rs.getString("NAME")); score.setKor(rs.getInt("KOR")); score.setEng(rs.getInt("ENG")); score.setMat(rs.getInt("MAT")); score.setTot(rs.getInt("TOT")); score.setAvg(rs.getDouble("AVG")); score.setRank(rs.getInt("RANK")); result.add(score); } rs.close(); pstmt.close(); return result; } // 데이터베이스 연결 종료(해제) 담당 메소드 public void close() throws SQLException { DBConn.close(); } // 메소드 추가 // 번호 검색 담당 메소드 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(); if (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")); } return result; } // 메소드 추가 // 성적 데이터 수정 담당 메소드 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; } // 메소드 추가 // 성적 데이터 삭제 담당 메소드 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(); pstmt.close(); return result; } }
- MemberScoreInsertForm
<%@page import="com.test.MemberScoreDTO"%> <%@page import="com.test.MemberScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // 이전페이지(MemberScoreSelect)로부터 데이터 수신 // -- sid String sid = request.getParameter("sid"); String name =""; //name을 조회하기 위한 dao 인스턴스 생성 MemberScoreDAO dao = new MemberScoreDAO(); try { // DB 연결 dao.connection(); // 수신한 sid 활용하여 name 얻어내기 MemberScoreDTO score = dao.search(sid); name = score.getName(); } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MemberScoreInsertForm.jsp</title> <link rel="stylesheet" type="text/css" href="css/MemberScore.css"> <script type="text/javascript"> function memberScoreSubmit() { // 확인 //alert("함수호출확인"); var memberScoreForm = document.getElementById("memberScoreForm"); 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점 초과일 때 if (kor.value=="" || isNaN(kor.value) || Number(kor.value)<0 || Number(kor.value)>100) { korMsg.style.display="inline"; kor.focus(); return; } if (eng.value=="" || isNaN(eng.value) || Number(eng.value)<0 || Number(eng.value)>100) { engMsg.style.display="inline"; eng.focus(); return; } if (mat.value=="" || isNaN(mat.value) || Number(mat.value)<0 || Number(mat.value)>100) { matMsg.style.display="inline"; mat.focus(); return; } memberScoreForm.submit(); } function memberScoreReset() { // 확인 //alert("리셋 버튼 클릭"); var memberScoreForm = document.getElementById("memberScoreForm"); var korMsg = document.getElementById("korMsg"); var engMsg = document.getElementById("engMsg"); var matMsg = document.getElementById("matMsg"); var kor = document.getElementById("kor"); korMsg = ""; engMsg = ""; matMsg = ""; memberScoreForm.reset(); kor.focus(); } </script> </head> <body> <div> <h1>회원 <span style="color: blue;">성적</span> 관리 및 <span style='color: red;'>입력</span> 페이지</h1> <hr> </div> <div> <a href="MemberScoreSelect.jsp"><button type="button">회원 성적 관리</button></a> </div> <br> <div> <!-- 회원 성적 데이터 입력 폼 구성 --> <form action="MemberScoreInsert.jsp?" method="post" id="memberScoreForm"> <%-- <form action="MemberScoreInsert.jsp?sid=<%=sid %>" method="post" id="memberScoreForm"> --%> <table class="table"> <tr> <th>번호</th> <!-- <td>5</td> --> <td><%=sid %></td> <td></td> </tr> <tr> <th>이름</th> <!-- <td>고길동</td> --> <td><%=name %></td> <td></td> </tr> <tr> <th>국어점수</th> <td> <input type='text' id='kor' name='kor' class='txtScore'> </td> <td> <span class='errMsg' id='korMsg'>0~100 사이의 국어점수를 입력하세요.</span> </td> </tr> <tr> <th>영어점수</th> <td> <input type='text' id='eng' name='eng' class='txtScore'> </td> <td> <span class='errMsg' id='engMsg'>0~100 사이의 영어점수를 입력하세요.</span> </td> </tr> <tr> <th>수학점수</th> <td> <input type='text' id='mat' name='mat' class='txtScore'> </td> <td> <span class='errMsg' id='matMsg'>0~100 사이의 수학점수를 입력하세요.</span> </td> </tr> </table> <br> <input type="hidden" name='sid' value='<%=sid %>'> <a href="javascript:memberScoreSubmit()"><button type="button">입력하기</button></a> <a href="javascript:memberScoreReset()"><button type="button">취소하기</button></a> <a href="MemberScoreSelect.jsp"><button type="button">목록으로</button></a> </form> </div> </body> </html>
- MemberScoreInsert
<%@page import="com.test.MemberScoreDTO"%> <%@page import="com.test.MemberScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberScoreInsert.jsp //-- 데이터베이스의 테이블(TBL_MEMBER)에 // 회원 데이터 추가 액션 처리 수행 // .. 이후, 다시 리스트 페이지(MemberScoreSelect.jsp)를 요청할 수 있도록 클라이언트에 안내 // 이전 페이지(MemberScoreInsertForm.jsp)로 부터 수신한 데이터 // → sid + kor, eng, mat String sid = request.getParameter("sid"); String kor = request.getParameter("kor"); String eng = request.getParameter("eng"); String mat = request.getParameter("mat"); // MemberScoreDAO 인스턴스 생성 MemberScoreDAO dao = new MemberScoreDAO(); // 주소를 담을 변수 선언 및 초기화 String strAddr = "MemberScoreSelect.jsp"; try { // DB 연결 dao.connection(); // 수신된 데이터로 MemberScoreDTO 구성 → dao의 add() 메소드의 매개변수 MemberScoreDTO score = new MemberScoreDTO(); score.setSid(sid); score.setKor(Integer.parseInt(kor)); score.setEng(Integer.parseInt(eng)); score.setMat(Integer.parseInt(mat)); // 데이터 입력(insert 쿼리문 수행) int result =dao.add(score); // 위의 메소드 호출 결과 반환하는 값에 따른 분기 수행 가능 if(result < 1) // 제대로 insert 되지 못하면 에러페이지로 가도록 strAddr="NoticeMemberInsert.jsp"; } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } // 클라이언트에 새로운 페이지를 다시 요청할 수 있도록 안내 // MemberScoreSelect.jsp 로 클라이언트 안내 response.sendRedirect(strAddr); /* 보여주는 코드 제거 */ %>
- MemberScoreUpdateForm
<%@page import="com.test.MemberScoreDTO"%> <%@page import="com.test.MemberScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // 이전페이지(MemberScoreSelect)로부터 데이터 수신 // -- sid String sid = request.getParameter("sid"); String name =""; int kor, eng, mat; kor=eng=mat=0; //name, kor, eng, mat 을 조회하기 위한 dao 인스턴스 생성 MemberScoreDAO dao = new MemberScoreDAO(); try { // DB 연결 dao.connection(); // 수신한 sid 활용하여 데이터 얻어내기 MemberScoreDTO score = dao.search(sid); name = score.getName(); kor = score.getKor(); eng = score.getEng(); mat = score.getMat(); } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MemberScoreUpdateForm.jsp</title> <link rel="stylesheet" type="text/css" href="css/MemberScore.css"> <script type="text/javascript"> function memberScoreSubmit() { // 확인 //alert("함수호출확인"); var memberScoreForm = document.getElementById("memberScoreForm"); 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점 초과일 때 if (kor.value=="" || isNaN(kor.value) || Number(kor.value)<0 || Number(kor.value)>100) { korMsg.style.display="inline"; kor.focus(); return; } if (eng.value=="" || isNaN(eng.value) || Number(eng.value)<0 || Number(eng.value)>100) { engMsg.style.display="inline"; eng.focus(); return; } if (mat.value=="" || isNaN(mat.value) || Number(mat.value)<0 || Number(mat.value)>100) { matMsg.style.display="inline"; mat.focus(); return; } memberScoreForm.submit(); } function memberScoreReset() { // 확인 //alert("리셋 버튼 클릭"); var memberScoreForm = document.getElementById("memberScoreForm"); var korMsg = document.getElementById("korMsg"); var engMsg = document.getElementById("engMsg"); var matMsg = document.getElementById("matMsg"); var kor = document.getElementById("kor"); korMsg = ""; engMsg = ""; matMsg = ""; memberScoreForm.reset(); kor.focus(); } </script> </head> <body> <div> <h1>회원 <span style="color: blue;">성적</span> 관리 및 <span style='color: red;'>수정</span> 페이지</h1> <hr> </div> <div> <a href="MemberScoreSelect.jsp"><button type="button">회원 성적 관리</button></a> </div> <br> <div> <!-- 회원 성적 데이터 수정 폼 구성 --> <form action="MemberScoreUpdate.jsp" method="post" id="memberScoreForm"> <%-- <form action="MemberScoreInsert.jsp?sid=<%=sid %>" method="post" id="memberScoreForm"> --%> <table class="table"> <tr> <th>번호</th> <!-- <td>5</td> --> <td><%=sid %></td> <td></td> </tr> <tr> <th>이름</th> <!-- <td>고길동</td> --> <td><%=name %></td> <td></td> </tr> <tr> <th>국어점수</th> <td> <input type='text' id='kor' name='kor' class='txtScore' value='<%=kor %>'> </td> <td> <span class='errMsg' id='korMsg'>0~100 사이의 국어점수를 입력하세요.</span> </td> </tr> <tr> <th>영어점수</th> <td> <input type='text' id='eng' name='eng' class='txtScore' value='<%=eng %>'> </td> <td> <span class='errMsg' id='engMsg'>0~100 사이의 영어점수를 입력하세요.</span> </td> </tr> <tr> <th>수학점수</th> <td> <input type='text' id='mat' name='mat' class='txtScore' value='<%=mat %>'> </td> <td> <span class='errMsg' id='matMsg'>0~100 사이의 수학점수를 입력하세요.</span> </td> </tr> </table> <br> <input type="hidden" name='sid' value='<%=sid %>'> <a href="javascript:memberScoreSubmit()"><button type="button">수정하기</button></a> <a href="javascript:memberScoreReset()"><button type="button">되돌리기</button></a> <a href="MemberScoreSelect.jsp"><button type="button">목록으로</button></a> </form> </div> </body> </html>
- MemberScoreUpdate
<%@page import="com.test.MemberScoreDTO"%> <%@page import="com.test.MemberScoreDAO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberScoreUpdate.jsp // 이전 페이지(MemberScoreInsertForm.jsp)로 부터 수신한 데이터 // → sid + kor, eng, mat String sid = request.getParameter("sid"); String kor = request.getParameter("kor"); String eng = request.getParameter("eng"); String mat = request.getParameter("mat"); // MemberScoreDAO 인스턴스 생성 MemberScoreDAO dao = new MemberScoreDAO(); // 주소를 담을 변수 선언 및 초기화 String strAddr = "MemberScoreSelect.jsp"; try { // DB 연결 dao.connection(); // 수신된 데이터로 MemberScoreDTO 구성 → dao의 add() 메소드의 매개변수 MemberScoreDTO score = new MemberScoreDTO(); score.setSid(sid); score.setKor(Integer.parseInt(kor)); score.setEng(Integer.parseInt(eng)); score.setMat(Integer.parseInt(mat)); // 데이터 입력(insert 쿼리문 수행) int result =dao.modify(score); // 위의 메소드 호출 결과 반환하는 값에 따른 분기 수행 가능 if(result < 1) // 제대로 insert 되지 못하면 에러페이지로 가도록 strAddr="NoticeMemberUpdate.jsp"; } catch (Exception e) { System.out.println(e.toString()); } finally { try { // DB 연결 종료 dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } // 클라이언트에 변경된 URL로 다시 요청할 수 있도록 안내 // MemberScoreSelect.jsp 로 클라이언트 안내 response.sendRedirect(strAddr); /* 보여주는 코드 제거 */ %>
- MemberScoreDelete
<%@page import="com.test.MemberScoreDAO"%> <%@page import="com.test.MemberScoreDTO"%> <%@ page contentType="text/html; charset=UTF-8"%> <% // MemberScoreDelete.jsp // 이전 페이지(MemberScoreSelect.jsp)로부터 받아온 데이터 // → sid String sid = request.getParameter("sid"); MemberScoreDAO dao = new MemberScoreDAO(); String strAddr = "MemberScoreSelect.jsp"; try { dao.connection(); int result = dao.remove(sid); if(result <1) strAddr = "NoticeScoreDelete.jsp"; } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } //check!! // 상황에 따라 안내한 페이지로 클라이언트가 다시 요청할 수 있도록 처리 response.sendRedirect(strAddr); %>
728x90'SsY > Class' 카테고리의 다른 글
[JSP] 007. 쿠키(Cookie)와 세션(Session) (2) (0) 2023.05.26 [JSP] 007. 쿠키(Cookie)와 세션(Session) (0) 2023.05.25 [JSP] 005. Emmet(에밋) , 데이터베이스 연결 및 데이터 처리 (0) 2023.05.22 [JSP] 004. 포워딩과 리다이렉트 (0) 2023.05.22 [JSP] 004. JSP / Servlet 관찰(3) (0) 2023.05.18