JSP_3강_4_★★★DAO(Data Access Object)_사원 수정, 삭제★★★

열라뽕따히·2024년 3월 18일

JSP

목록 보기
17/43

사원의 이름을 클릭했을 때 전체조회가 될 수 있도록 코드를 작성해보자!

참고로 content 서블릿 지정은 emp_list에서 미리 정의해줬었음!



content가 별칭인 서블릿을 만들어보자!


=============================코드=============================

package com.emp.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.EmpDAO;
import com.emp.model.EmpDTO;


@WebServlet("/content")
public class ContentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public ContentServlet() {
        super();
       
    }

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get 방식으로 넘어온 사원번호에 해당하는 사원의 정보를 view 페이지로 넘겨주는 비지니스 로직
		int emp_no = Integer.parseInt(request.getParameter("no").trim());
		
		EmpDAO dao = new EmpDAO();  // 오라클 드라이버 로딩 완료/DB와 연결 성공
		
		dao.contentEmp();



EmpDAO 클래스에서
사원번호에 해당하는 사원의 상세 정보를 조회하는
contentEmp() 메서드를 만들어보자!


=============================코드=============================

// 사원번호에 해당하는 사원의 상세 정보를 조회하는 메서드
	public EmpDTO contentEmp(int no) {  // 한 줄만 나오니까! 두 개면 ArrayList로 처리!
		EmpDTO dto = null;   // 사원에 해당하는 정보가 없을 수 있으니까 null로 처리

		try {
			// 3단계 : 데이터베이스에 전송할 SQL문 작성
			sql = "select * from emp where empno = ?";  // no가 ?에 들어감
			
			// 4단계 : SQL문을 데이터베이스 전송객체에 저장
			pstmt = con.prepareStatement(sql);
			
			// 4-1단계 : ?(플레이스 홀더)에 데이터를 저장
			pstmt.setInt(1, no);  // no가 위의 sql의 ?로 배정!
			
			// 5단계 : SQL문을 DB에 전송 및 실행
			rs = pstmt.executeQuery(); // select 쿼리이기 때문!
			
			if(rs.next()) {   // 반환타입이 List가 아닌 경우 if로 쓰는 것이 적절!
				dto = new EmpDTO();
				
				dto.setEmpno(rs.getInt("empno"));
				dto.setEname(rs.getString("ename"));
				dto.setJob(rs.getString("job"));
				dto.setMgr(rs.getInt("mgr"));
				dto.setHiredate(rs.getString("hiredate"));
				dto.setSal(rs.getInt("sal"));
				dto.setComm(rs.getInt("comm"));
				dto.setDeptno(rs.getInt("deptno"));
			}
			
			// 6단계 : DB와 연결되어 있던 자원 종료
			rs.close();   pstmt.close();   con.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return dto;
	} // contentEmp() 메서드 end



다시 ContentServlet으로 가보자!


=============================코드=============================

package com.emp.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.EmpDAO;
import com.emp.model.EmpDTO;


@WebServlet("/content")
public class ContentServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public ContentServlet() {
        super();
       
    }

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get 방식으로 넘어온 사원번호에 해당하는 사원의 정보를 view 페이지로 넘겨주는 비지니스 로직
		int emp_no = Integer.parseInt(request.getParameter("no").trim());
		
		EmpDAO dao = new EmpDAO();  // 오라클 드라이버 로딩 완료/DB와 연결 성공

// ------------------여기서부터 작성------------------
		EmpDTO cont = dao.contentEmp(emp_no); // 사번이 있어야 하기 때문에 emp_no 넘겨줌
		
		request.setAttribute("Content", cont);
		
		RequestDispatcher rd = request.getRequestDispatcher("view/emp_content.jsp");
		
		rd.forward(request, response);  // 페이지 이동
	}

}



view 폴더 -> emp_content.jsp를 생성하자


emp_content.jsp 생성 및 작성


=============================코드=============================

<%@page import="com.emp.model.EmpDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%

	EmpDTO cont =(EmpDTO)request.getAttribute("Content");
    
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

		<div align = "center">
			<hr width = "30%" color = "marmoon">
				<h3>EMP 테이블 사원 상세 정보 페이지</h3>
			<hr width = "30%" color = "marmoon">
			<br/> <br/>
			
			<table border = "1" width = "400">
				<%
					if(cont != null) {  // 데이터가 있다면 
				%>
					<tr>
						<th>사원 No.</th>
						<td><%=cont.getEmpno() %></td>
					</tr>	
					
					<tr>
						<th>사원 이름</th>
						<td><%=cont.getEname() %></td>
					</tr>	
					
					<tr>
						<th>담당 업무</th>
						<td><%=cont.getJob() %></td>
					</tr>	
					
					<tr>
						<th>관리자 No.</th>
						<td><%=cont.getMgr() %></td>
					</tr>	
					
					<tr>
						<th>사원 급여</th>
						<td><%=cont.getSal() %></td>
					</tr>	
					
					<tr>
						<th>사원 보너스</th>
						<td><%=cont.getComm() %></td>
					</tr>	
					
					<tr>
						<th>부서 No.</th>
						<td><%=cont.getDeptno() %></td>
					</tr>	
					
					<tr>
						<th>사원 입사일</th>
						<td><%=cont.getHiredate() %></td>
					</tr>	
					
					<% }else {   // 사원 정보가 없으면
						 
					%>	
					<tr>
						<td colspan = "2" align = "center">
							<h3>해당 사원의 정보가 없습니다...</h3>
						</td>
					</tr>
					
					<% } %>
				
			</table>
			
			<br/>
			
			<input type = "button" value = "사원수정" onclick = "location.href='update?no=<%=cont.getEmpno() %>'">&nbsp;&nbsp;
			<input type = "button" value = "사원삭제" onclick = "if(confirm('정말로 사원을 삭제하시겠습니까?')) {
																								location.href='delete?no=<%=cont.getEmpno() %>'
																							}else { return; }">&nbsp;&nbsp;
			<input type = "button" value = "사원목록" onclick = "location.href='select'">
			
		</div>

</body>
</html>



main에서 실행해보자


=============================실행=============================

사원명의 '홍길동'을 클릭해보자



이제 상세정보 페이지에 사원 수정, 삭제가 이루어질 수 있도록 서블릿을 만들어보자!



update 서블릿을 만들자!


=============================코드=============================

package com.emp.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.DeptDTO;
import com.emp.model.EmpDAO;
import com.emp.model.EmpDTO;


@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public UpdateServlet() {
        super();
        
    }

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get 방식으로 넘어온 사원번호에 해당하는 사원의 정보를 DB에서 조회하여 수정 폼페이지로 이동시키는 비지니스 로직
		int emp_no = Integer.parseInt( request.getParameter("no").trim());
		
		EmpDAO dao = new EmpDAO(); // DB와 연동 작업
		
		// EMP 테이블에서 담당업무 리스트를 조회해 보자.
		List<String> jobList = dao.getJobList();
		
		// EMP 테이블에서 관리자 사원 리스트를 조회해 보자.
		List<String> mgrList = dao.getMgrList();
		
		// DEPT 테이블에서 부서 전체 리스트를 조회해 보자.
		List<DeptDTO> deptList = dao.getDeptList();
				
		// 사원번호에 해당하는 사원의 상세정보도 받아오자
		EmpDTO modify = dao.contentEmp(emp_no);
		
		// 모든 정보를 view page(수정 폼 페이지)로 이동을 시키자
		request.setAttribute("jList", jobList);
		request.setAttribute("mList", mgrList);
		request.setAttribute("dList", deptList);
		request.setAttribute("Modify", modify);
		
		// view page 이동경로를 만들고 페이지 이동까지 같이 진행
		 request.getRequestDispatcher("view/emp_modify.jsp").forward(request, response);
		
		
	}

}



emp_modify.jsp를 생성


=============================코드=============================

<%@page import="com.emp.model.DeptDTO"%>
<%@page import="com.emp.model.EmpDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	List<String> jList = (List<String>)request.getAttribute("jList");
	List<EmpDTO> mList = (List<EmpDTO>)request.getAttribute("mList");
	List<DeptDTO> dList = (List<DeptDTO>)request.getAttribute("dList");
	EmpDTO content = (EmpDTO)request.getAttribute("Modify");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<div align="center">
	   <hr width="30%" color="gray">
	      <h3>EMP 테이블 사원 정보 수정 폼 페이지</h3>
	   <hr width="30%" color="gray">
	   <br> <br>
	   
	   <form method="post"
	      action="<%=request.getContextPath() %>/update_ok">
	   
	      <table border="1" width="350">
	         <%
	           if(content != null) {
	         %>
	         	  <tr>
	         	     <th>사원 No.</th>
	         	     <td>
	         	        <input type="text" name="num" readonly
	         	        	value="<%=content.getEmpno() %>">
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>사원 이름</th>
	         	     <td>
	         	        <input type="text" name="name" readonly
	         	        	value="<%=content.getEname() %>">
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>담당 업무</th>
	         	     <td>
	         	        <select name="job">
	         	           <%
	         	              if(jList.size() == 0) {
	         	           %>
	         	           	  <option value="">:::담당업무 없음:::</option>
	         	            	  
	         	           <% }else {  // 담당업무 전체 리스트가 있는 경우
	         	        	   
	         	        	   for(int i=0; i<jList.size(); i++) {
	         	        			String strJob = jList.get(i);
	         	        			
	         	        			if(strJob.equals(content.getJob())) {
	         	           %>
		         	           			<option value="<%=strJob %>" selected>
		         	           				<%=strJob %> </option>
	         	           <%		}else {  %>
	         	        	   			<option value="<%=strJob %>">
		         	           				<%=strJob %> </option>
	         	          <% }
	         	        	   }
	         	           }
	         	           
	         	           %>
	         	        </select>
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>관리자 No.</th>
	         	     <td>
	         	        <select name="mgrNo">
	         	           <%
	         	             if(mList.size() == 0) {
	         	           %> 
	         	                <option value="">:::담당 관리자 없음:::</option>	
	         	           <%}else {  // 담당 관리자 리스트가 있는 경우
	         	        	   
	         	        	   for(int i=0; i<mList.size(); i++) {
	         	        		   
				         	       EmpDTO mgrCont = mList.get(i);
				         	       
				         	       if(mgrCont.getEmpno() == content.getMgr()) {
				           %>
				           			<option value="<%=mgrCont.getEmpno() %>" selected>
				           				<%=mgrCont.getEmpno() %>&nbsp; [<%=mgrCont.getEname() %>] </option> 	   
				           <%      }else {  %>
				        	        <option value="<%=mgrCont.getEmpno() %>">
				           				<%=mgrCont.getEmpno() %>&nbsp; [<%=mgrCont.getEname() %>] </option> 	   
				           <%}
	         	        	   }
	         	           } %>
	         
	         	        </select>
	         	  
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>사원 급여</th>
	         	     <td>
	         	        <input type="text" name="sal"
	         	        	value="<%=content.getSal() %>">
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>사원 보너스</th>
	         	     <td>
	         	        <input type="text" name="comm"
	         	        	value="<%=content.getComm() %>">
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <th>부서 No.</th>
	         	     <td>
	         	        <select name="deptNo">
	         	           <%
	         	              if(dList.size() == 0) {
	         	           %>
	         	           		<option value="">:::부서번호 없음:::</option>
	         	           
	         	           <% }else {
	         	        	   
	         	        	    for(int i=0; i<dList.size(); i++) {
	         	        	    	
	         	        	    	DeptDTO dCont = dList.get(i);
	         	        	    	
	         	        	    	if(dCont.getDeptno() == content.getDeptno()) {
	         	           %>
	         	           				<option value="<%=dCont.getDeptno() %>" selected>
	         	           					<%=dCont.getDeptno() %>&nbsp;[<%=dCont.getDname() %>]</option>
	         	           <%	   	}else {  %>
	         	        	   			<option value="<%=dCont.getDeptno() %>">
	         	           					<%=dCont.getDeptno() %>&nbsp;[<%=dCont.getDname() %>]</option>
	         	           <%}
	         	           
	         	        	    }
	         	           }
	         	           %>
	         	        </select>
	
	         	     </td>
	         	  </tr>
	         	  
	         	  <tr>
	         	     <td colspan="2" align="center">
	         	        <input type="submit" value="사원수정">&nbsp;&nbsp;&nbsp;
	         	        <input type="reset" value="다시작성">
	         	     </td>
	         	  </tr>
	         <%  }
	         %>
	          
	      </table>
	   
	   </form>
	   
	</div>

</body>
</html>



update_ok 서블릿을 만들어보자!


=============================코드=============================

package com.emp.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.EmpDAO;
import com.emp.model.EmpDTO;


@WebServlet("/update_ok")
public class UpdateOkServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public UpdateOkServlet() {
        super();
       
    }

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 사원 수정 폼 페이지에서 넘어온 데이터들을 DB에 수정하여 저장시키는 비지니스 로직
		
		// 요청과 응답 시 한글 깨짐 방지 설정 작업
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset = UTF-8");
		
		// 1단계 : emp_modify.jsp 페이지에서 넘어온 데이터들을 받아 주어야 함
		int emp_no = Integer.parseInt(request.getParameter("num").trim());
		String emp_name = request.getParameter("name").trim();
		String emp_job = request.getParameter("job").trim();	
		int emp_mgr = Integer.parseInt(request.getParameter("mgrNo"));
		int emp_sal = Integer.parseInt(request.getParameter("sal"));
		int emp_comm = Integer.parseInt(request.getParameter("comm"));
		int emp_deptNo = Integer.parseInt(request.getParameter("deptNo"));
		
		// 2단계 : 넘어온 데이터들을 DB에 전송해주어야 함
		// 			전송 시에 DTO 객체를 이용하여 전송을 함
		EmpDTO dto = new EmpDTO();
		
		dto.setEmpno(emp_no);	
		dto.setEname(emp_name);		
		dto.setJob(emp_job);
		dto.setMgr(emp_mgr);
		dto.setSal(emp_sal);
		dto.setComm(emp_comm);
		dto.setDeptno(emp_deptNo);
		
		// 3단계 : DAO 객체를 생성하여 수정작업 진행
		EmpDAO dao = new EmpDAO();
		
		int check = dao.updateEmp(dto);
		
		PrintWriter out = response.getWriter();
		
		if(check > 0) {
			out.println("<script>");
			out.println("alert('사원 정보 수정 성공!!')");
			out.println("location.href='content?no=" + dto.getEmpno() + "'");
			out.println("</script>");
		}else {
			out.println("<script>");
			out.println("alert('사원 정보 수정 실패...')");
			out.println("history.back()");
			out.println("</script>");
		}
	}

}



EmpDAO 에서
사원번호에 해당하는 사원의 정보를 수정하는

updateEmp() 메서드를 만들자


=============================코드=============================

// 사원번호에 해당하는 사원의 정보를 수정하는 메서드
	public int updateEmp(EmpDTO dto) {
		int result = 0;
		
		try {
			// 3단계 : DB에 전송할 SQL문 작성
			sql = "update emp set job = ?, mgr = ?, sal = ?, comm = ?, deptno = ? where empno = ?";
			
			// 4단계 : SQL문을 데이터베이스 전송객체에 저장
			pstmt = con.prepareStatement(sql);
			
			//4-1단계 : ?(플레이스 홀더)에 데이터를 저장
			pstmt.setString(1, dto.getJob());
			pstmt.setInt(2, dto.getMgr());
			pstmt.setInt(3, dto.getSal());
			pstmt.setInt(4, dto.getComm());
			pstmt.setInt(5, dto.getDeptno());
			pstmt.setInt(6, dto.getEmpno());
			
			// 5단계 : SQL문을 데이터베이스에 전송 및 실행
			result = pstmt.executeUpdate();
			
			// 6단계 : DB와 연결되어 있던 자원 종료
			pstmt.close();   con.close();
						
		} catch (Exception e) {
				e.printStackTrace();
		}
		return result;
	}



main.jsp 으로 실행해보자!


=============================실행=============================

사원 수정 클릭!

사원급여를 수정하고 사원 수정을 클릭!

상세정보 페이지로 넘어가며 수정한 사원 급여가 변경된 것을 확인할 수 있음





이번에는 사원을 삭제할 서블릿을 만들자!

delete 서블릿은 view 폴더에 emp_content.jsp에서 이미 선언해줬음

delete 별칭으로 mapping 할

DeleteServlet 생성


=============================코드=============================

package com.emp.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.EmpDAO;


@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
    public DeleteServlet() {
        super();
        
    }

	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get 방식으로 넘어온 사원번호에 해당하는 사원을 DB에서 삭제하는 비지니스 로직
		response.setContentType("text/html; charset = UTF-8");
		
		int emp_no = Integer.parseInt(request.getParameter("no").trim());  // emp_content에서 86행
		
		EmpDAO dao = new EmpDAO();
		
		dao.deleteEmp();



EmpDAO에서

deleteEmp() 메서드를 만들자


=============================코드=============================

// 사원번호에 해당하는 사원을 DB에서 삭제하는 메서드
	public int deleteEmp(int num) {  // 쿼리문이 int 타입이기 때문
		
		int result = 0;
		
		try {
			// 3단계 : DB에 전송할 SQL문 작성
			sql = "delete from emp where empno = ?";
			
			// 4단계 : SQL문을 데이터베이스 전송객체에 저장
			pstmt = con.prepareStatement(sql);
			
			// 4-1단계 : ?(플레이스 홀더)에 값을 배정
			pstmt.setInt(1, num);
			
			// 5단계 : SQL문을 DB에 전송 및 실행
			result = pstmt.executeUpdate();
			
			// 6단계 : DB에 연결되어 있던 자원 종료
			pstmt.close();  con.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}



다시 DeleteServlet 으로 돌아가서 마저 작성하자


=============================코드=============================

package com.emp.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.emp.model.EmpDAO;


@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
  
    public DeleteServlet() {
        super();
        
    }

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// get 방식으로 넘어온 사원번호에 해당하는 사원을 DB에서 삭제하는 비지니스 로직
		response.setContentType("text/html; charset = UTF-8");
		
		int emp_no = Integer.parseInt(request.getParameter("no").trim());  // emp_content에서 86행
		
		EmpDAO dao = new EmpDAO();
		
		int check = dao.deleteEmp(emp_no);
		
		PrintWriter out = response.getWriter();
		
		if(check > 0) {
			out.println("<script>");
			out.println("alert('사원 삭제 성공!')");
			out.println("location.href = 'select'");
			out.println("</script>");
		}else {
			out.println("<script>");
			out.println("alert('사원 삭제 실패...')");
			out.println("history.back()");
			out.println("</script>");
		}
	}

}



main.jsp로 가서 실행해보자


=============================실행=============================

홍길동 이름 클릭!

사원삭제 클릭!

확인 클릭

삭제 된 것을 확인할 수 있다!

0개의 댓글