결과물부터 보자.
1.
전체 부서 목록을 누르면 DB에 있는 DEPT 테이블을 불러다가 전체 출력해준 페이지를 출력할 것임.
2.
전체 부서 출력이 되고 부서추가를 누르면 부서추가 페이지에 가서 추가할 부서 내용을 입력하면 DB에 추가 됨.
각 행의 부서삭제를 누르면 그 행이 삭제됨. 물론 DB에서도 삭제됨.
3.
각 항목의 내용을 채운 뒤 부서추가 버튼을 누르면 DB에 데이터가 추가된 후 부서목록 전체출력 화면으로 돌아감.
이렇게 만들기 위해서 필요한 것들.
1. index.jsp
- 맨 첫 페이지
- 여기서 전체 부서 목록을 클릭하면 select.jsp로 넘어감.
2. select.jsp
- 부서 목록 출력 페이지
- 부서추가, 부서삭제 버튼이 있어야 함.
- DB에서 가져온 내용을 테이블로 작성해야 함.
- 부서추가 버튼을 누르면 insert.jsp로 넘어가야 함.
- 부서삭제 버튼은 DeleteServlet.java로 데이터가 넘어감.
3. insert.jsp
- 부서 목록 추가 페이지
- 부서 내용 추가 테이블 작성.
- 부서추가 버튼을 누르면 InsertServlet.java로 입력한 데이터가 넘어감.
4. DeptDTO.java
- Dept 테이블의 컬럼을 private 멤버변수로 지정.
- getter(), setter() 메서드를 이용해 멤버변수에 접근하도록 설정.
5. DeptDAO.java
- DAO(Data Access Object) ==> DB에 접속(연동)하는 객체.
- DAO란 데이터베이스에 접속해서 데이터 추가, 수정, 삭제, 조회 등의 작업을 하는 클래스이다.
- 일반적으로 JSP 또는 Servlet에서 위 작업을 할 수 있지만, 유지보수, 코드의 모듈화를 위해 DAO 클래스를 따로 만들어 사용함.
- Connection 객체, PreparedStatement 객체, ResultSet 객체 생성.
- 기본생성자에 driver, url, user, password 변수 선언. + 오라클 드라이버 로딩.
- SelectServlet에서 사용할 DB 조회 메서드 작성
- InsertServlet에서 사용할 DB 추가 메서드 작성.
- DeleteServlet에서 사용할 DB 삭제 메서드 작성.
6. SelectServlet.java
- index.jsp 에서 요청한 전체부서목록에 대해서 응답.
- DeptDAO 객체 생성.
- dept 테이블 전체 목록 조회
- forward() 메서드를 통해 select.jsp로 페이지 이동.
7. InsertServlet.java
- request, response 한글 인코딩 처리
- insert.jsp페이지에서 넘어 온 데이터 변수로 받기
- 변수 이용해서 DeptDTO 객체 생성후 setter메서드로 값 저장.
- DeptDAO 객체 생성 후 insertDept() 메서드 호출
- PrintWriter 객체와 getWriter() 메서드를 이용해 알림창 생성.
- 부서추가 성공 시 알림창 확인 후 select 페이지로 이동
- 부서추가 실패시 이전페이지로 복원.
8. DeleteServlet.java
- request, response 한글 인코딩 처리
- select.jsp페이지에서 버튼 눌렀을 때 getParameter()메서드를 이용하여 deptno를 가지고 DB데이터 삭제처리
- DeptDAO 객체 생성 후 deleteDept() 메서드를 이용하기.
- PrintWriter 객체와 getWriter() 메서드를 이용해 알림창 생성.
- 삭제 성공 메세지 확인 후 select페이지로 이동. 실패하면 이전 페이지로 복원.
**프로젝트 폴더 구조도
1. index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<hr width="50%" color="blue">
<h3>DEPT 테이블 메인 페이지</h3>
<hr width="50%" color="blue">
<br><br>
<%-- request.getContextPath(): 현재 프로젝트명을 문자열로 반환해 부는 메서드 --%>
<a href="<%=request.getContextPath()%>/select">[전체 부서 목록]</a>
</div>
</body>
</html>
|
cs |
<a> 태그를 이용하여 /select를 urlmapping
2. DeptDTO.java
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
|
package com.sist.model;
public class DeptDTO {
private int deptno;
private String dname;
private String loc;
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
}
|
cs |
3. DeptDAO.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
package com.sist.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/*
* DAO(Data Access Object): 데이터 접근 객체 ==> DB에 접속(연동)하는 객체.
* -DAO란 데이터베이스에 접속해서 데이터 추가, 수정, 삭제, 조회, 등의 작업을 하는 클래스.
* -일반적으로 JSP 또는 Servlet에서 위의 작업들을 같이 사용할 수 있지만, 유지보수, 코드의 모듈화를
* 위해서 DAO 클래스를 따로 만들어서 사용함.
*/
public class DeptDAO {
Connection con = null; //DB와 연동
PreparedStatement pstmt = null; //DB에 Sql문을 전송
ResultSet rs = null; //sql문을 실행 후 결과 값을 가지고 있는 객체
String sql = null; //쿼리문을 저장할 객체.
public DeptDAO() { //기본 생성자
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "web";
String password = "1234";
//1단계: 오라클 드라이버 로딩
try {
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
if(con != null) {
System.out.println("데이터베이스 연결 성공!!!");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //기본 생성자 end
// selectList() 메서드 만들기
// DEPT 테이블에서 전체 리스트를 조회하여
public List<DeptDTO> selectList() {
List<DeptDTO> list = new ArrayList<DeptDTO>(); //다형성
try {
//3. 쿼리문 작성
sql = "select * from dept order by deptno";
//4. 쿼리문을 데이터베이스 전송 객체에 저장.
pstmt = con.prepareStatement(sql);
//5. 쿼리문을 DB에 전송 및 실행
rs = pstmt.executeQuery();
//6. 데이터를 DTO 객체에 저장
while(rs.next()) {
DeptDTO dto = new DeptDTO();
dto.setDeptno(rs.getInt("deptno"));
dto.setDname(rs.getString("dname"));
dto.setLoc(rs.getString("loc"));
list.add(dto); //객체 배열 같은 느낌.
}
//7. open 되어 있던 객체 모두 닫기. 연 순서의 거꾸로.
rs.close(); pstmt.close(); con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
} //selectList() 의 끝
public int insertDept(DeptDTO dto) {
int result = 0;
try {
//1. SQL문 작성
sql = "insert into dept values(?, ?, ?)";
//2. SQL문을 DB 전송 객체에 전달.
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, dto.getDeptno());
pstmt.setString(2, dto.getDname());
pstmt.setString(3, dto.getLoc());
//3. SQL문을 DB에 전송 및 실행.
result = pstmt.executeUpdate();
//4. open 되어 있던 객체 닫기.
pstmt.close(); con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result; //성공하면 1 반환
}
public int deleteDept(int deptno) {
int result = 0;
try {
sql = "delete from dept where deptno = ?";
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, deptno);
result = pstmt.executeUpdate();
pstmt.close(); con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
};
}
|
cs |
4. select.jsp
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<%@page import="com.sist.model.DeptDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
List<DeptDTO> dept = (List<DeptDTO>)request.getAttribute("List");
//getAttribute()는 object형을 반환 => 형변환 필요 %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<hr width="50%" color="red">
<h3>DEPT 테이블 전체 리스트</h3>
<hr width="50%" color="red">
<br><br>
<table border="1" cellspacing="0" width="350">
<tr>
<th>부서번호</th> <th>부서명</th> <th>부서위치</th> <th>부서삭제</th>
</tr>
<%
if(dept.size() != 0) { //dept에 데이터가 들어있다면
//List<DeptDTO> dept의 각각의 주소를 //데이터 수만큼 반복해서 출력.
for(int i=0; i<dept.size(); i++) {
DeptDTO dto = dept.get(i);
//System.out.println("받은 dto >>> " + dto);
%>
<tr>
<td> <%=dto.getDeptno() %> </td>
<td> <%=dto.getDname() %> </td>
<td> <%=dto.getLoc() %> </td>
<td>
<input type="button" value="부서삭제"
onclick="location.href='delete?deptno=<%=dto.getDeptno()%>'">
</td>
//<% System.out.println("보낸 dto >>> " + dto); %>
</tr>
<% } //for문 end
<% }else { //데이터가 없는 경우 처리
<tr>
<td colspan="4" align="center">
<h3>검색된 레코드가 없습니다.</h3>
</td>
</tr>
<% } %>
<tr>
<td colspan="4" align="center">
<input type="button" value="부서추가"
onclick="location.href='insert.jsp'">
</td>
</tr>
</table>
</div>
</body>
</html>
|
cs |
5. SelectServlet.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
package com.sist.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.sist.model.DeptDAO;
import com.sist.model.DeptDTO;
/**
* Servlet implementation class SelectServlet
*/
@WebServlet("/select")
public class SelectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public SelectServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// index.jsp 페이지에서 요청 ==> 전체부서목록 화면에 보여달라고 WAS에 요청.
// 해당 요청에 대해서 응답.
// 1단계: DeptDAO 객체 생성
DeptDAO dao = new DeptDAO();
// 2단계: DB에서 dept 테이블의 전체 목록 조회.
List<DeptDTO> deptList = dao.selectList(); //deptList는 ArrayList이므로 이 안에 DeptDTO가 여러개 들어있음.
// 3단계: 페이지 이동 작업 진행. 데이터를 같이 이동시켜 주어야 함.
request.setAttribute("List", deptList); //"List"라는 key의 value는 deptList로 넘김.
// 4단계: 실제로 페이지 이동을 진행하자.
RequestDispatcher rd = request.getRequestDispatcher("select.jsp");
rd.forward(request, response); //실제 페이지 이동
}
}
|
cs |
6. Insert.jsp
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
31
32
33
34
35
36
37
38
39
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div align="center">
<hr width="50%" color="gray">
<h3>DEPT 테이블 부서 추가 화면</h3>
<hr width="50%" color="gray">
<br><br>
<form method="post" action="insertOk">
<table border="1" cellspacing="0">
<tr>
<th>부서번호</th>
<td> <input type="text" name="deptno"> </td>
</tr>
<tr>
<th>부서명</th>
<td> <input type="text" name="deptname"> </td>
</tr>
<tr>
<th>부서위치</th>
<td> <input type="text" name="location"> </td>
</tr>
<tr>
<td colspan = "2" align="center">
<input type="submit" value="부서추가">
<input type="reset" value="다시작성">
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
|
cs |
7. InsertServlet.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package com.sist.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.sist.model.DeptDAO;
import com.sist.model.DeptDTO;
/**
* Servlet implementation class InsertServlet
*/
@WebServlet("/insertOk")
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InsertServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//insert.jsp 페이지에서 넘어온 데이터들을 dept 테이블에 저장하는 작업.
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
//1단계 : 부서등록 폼 페이지에서 넘어온 데이터들을 받아 주어야 한다.
int deptno = Integer.parseInt(request.getParameter("deptno").trim());
String deptName = request.getParameter("deptname").trim();
String location = request.getParameter("location").trim();
DeptDTO dto = new DeptDTO();
dto.setDeptno(deptno);
dto.setDname(deptName);
dto.setLoc(location);
DeptDAO dao = new DeptDAO();
int res = dao.insertDept(dto);
PrintWriter out = response.getWriter();
if(res > 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>");
}
}
}
|
cs |
8. DeleteServlet.java
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
package com.sist.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.sist.model.DeptDAO;
/**
* Servlet implementation class DeleteServlet
*/
@WebServlet("/delete")
public class DeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DeleteServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
// 삭제 버튼을 누르면 get 방식으로 넘어온 부서번호를 DB에서 삭제하는 작업
// 삭제 버튼을 눌렀을 때 get 방식으로 넘어온 부서번호를 받아야 한다.
int deptno = Integer.parseInt(request.getParameter("deptno").trim());
DeptDAO dao = new DeptDAO();
int res = dao.deleteDept(deptno);
PrintWriter out = response.getWriter();
if(res > 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>");
}
}
}
|
cs |
이거는 DB삭제만 하는거라 dto 객체가 필요하지 않았음.
'국기훈련과정 > JSP' 카테고리의 다른 글
06. JSP와 DB 연동하기 2 (0) | 2021.10.22 |
---|---|
04. 쿠키와 세션 (0) | 2021.10.18 |
03. JSP_02 (0) | 2021.10.15 |
02. JSP_01 (0) | 2021.10.15 |
01. 웹 프로그래밍 (0) | 2021.10.14 |