오늘이라도
[Web] 6. NCS 평가 프로젝트 : 작성 조건, 도서 정보 입력, 조회, 삭제 구현 본문
반응형
https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
▼프로젝트 작성 조건
○ Book 테이블 생성 : DB Connection → com.hanul.study 패키지 → 우클릭 → New → SQL : book.sql
- 도서명 : title varchar2(30)
- 저자 : auth varchar2(20)
- ISBN : isbn varchar2(20) primary key not null
- 출판사 : comp varchar2(20)
- 단가 : cost number
- 수량 : su number
- 가격 : price number
○ BookMain.html
도서 정보 입력
도서명 [ ]
저자 [ ]
ISBN [xxx-xx-xxxx-xxx-x ]
출판사 [ ]
단가 [ ]
수량 [ ]
[도서 정보 입력][입력 정보 취소][도서 목록 조회]
- 모든 항목은 반드시 입력되어야 한다.
- ISBN은 유효성 검사를 수행 : 3개-2개-4개-3개-1개, 숫자만
- 단가와 수량은 숫자만 입력되어야 한다.
- 입력정보취소 버튼 클릭 시 확인 창(confirm) 발생 : 정말 취소하시겠습니까?
- 도서정보입력 버튼 클릭 시 확인 창(confirm) 발생 : 정말 취소하시겠습니까?
- 위의 작성 조건을 만족하면 서버로 전송(is.do)
○ Servlet 정의 : default package ▶ web.xml : Servlet Mapping 수동 설정
- InsertServlet.java(is.do) : 도서 정보 입력
- GetAllListServlet.java(gals.do) : 전체 도서 목록 보기
- DeleteServlet.java(ds.do) : 도서 정보 삭제
○ BookDTO.java : com.hanul.study package ▶ 직렬화
- 멤버 변수(필드) 선언 : title, auth, isbn, comp, cost, su, price
- 디폴트 생성자 메서드
- 생성자 메서드 초기화 : 메서드 오버 로딩(필요하면 사용)
- Getters & Setters 메서드
○ BookDAO.java : com.hanul.study package
- getConn() : DB 접속 ▶ ojdbc6.jar 등록
- insert() : 도서 정보 등록
- getAllList() : 전체 도서 목록 조회
- delete() : 도서 정보 삭제
- dbClose() : DB 접속 해제
- 가점부분 : CSS 적용, javaScript/jQuery 적용, JAVA 주석
▼BookMain.html : 도서 정보 입력 화면
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>도서 정보 입력 화면</title>
<style type="text/css">
* {
margin: 0 auto;
text-align: center;
}
fieldset {
width: 400px;
}
legend {
font-size: 1.5em;
font-weight: bold;
}
td {
padding: 5px;
}
.attribute {
font-weight: bold;
}
.inputData {
text-align: left;
}
</style>
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script src="jquery-3.4.1.js"></script>
<script type="text/javascript">
$(document).ready(function() {
//정규 표현식
var regIsbn = /^\d{3}[\-]\d{2}[\-]\d{4}[\-]\d{3}[\-]\d{1}$/ // 숫자 3글자 - 2글자 - 4글자 - 3글자 - 1글자
//ISBN의 정규 표현식은 국립중앙도서관에서 소개하는 ISBN 구조와 ISBN 영문 위키를 참조하여 10진수 숫자로만 구성되게끔 정하였다.
//※ 국립중앙도서관 ISBN 구조 : http://seoji.nl.go.kr/front/service/isbn_info09.jsp
//※ ISBN 영문 위키 : https://en.wikipedia.org/wiki/International_Standard_Book_Number
//확인 버튼
var isbnCheck = 0;
var isbn_val = document.getElementById("isbn");
$("#submit").click(function() {
//ISBN 유효성 검사
if(!regIsbn.test(isbn_val.value)) {
alert("ISBN 형식이 잘못되었습니다." + "\nISBN은 숫자로 구성되어 있으며 XXX-XX-XXXX-XXX-X 형식으로 입력해주세요.");
$("#isbn").val("");
$("#isbn").focus();
return false;
}
var submitConfirm = confirm("정말 입력하시겠습니까?");
if(submitConfirm) {
return true;
} else {
return false;
}
}); // submit click()
//취소 버튼
$("#cancel").click(function() {
var cancelConfirm = confirm("정말 취소하시겠습니까?");
if(cancelConfirm) {
return true;
} else {
return false;
}
}); // cancel click()
}); // ready()
</script>
</head>
<body>
<fieldset>
<legend>도서 정보 입력</legend>
<form action="is.do" method="get">
<table border="1">
<tr>
<td class="attribute">도서명</td>
<td><input type="text" name="title" required="required" class="inputData" /></td>
</tr>
<tr>
<td class="attribute">저 자</td>
<td><input type="text" name="auth" required="required" class="inputData" /></td>
</tr>
<tr>
<td style="letter-spacing: 3px" class="attribute">ISBN</td>
<td><input type="text" name="isbn" required="required" class="inputData" placeholder="xxx-xx-xxxx-xxx-x" id="isbn"/></td>
</tr>
<tr>
<td class="attribute">출판사</td>
<td><input type="text" name="comp" required="required" class="inputData" /></td>
</tr>
<tr>
<td class="attribute">단 가</td>
<td><input type="number" name="cost" required="required" class="inputData" /></td>
</tr>
<tr>
<td class="attribute">수 량</td>
<td><input type="number" name="su" required="required" class="inputData" /></td>
</tr>
<tr >
<td colspan="3">
<input type="submit" value="도서 정보 입력" id="submit" />
<input type="reset" value="입력 정보 취소" id="cancel"/>
<input type="button" value="도서 목록 조회" onclick="location.href='gals.do'"/>
</td>
</tr>
</table>
</form>
</fieldset>
</body>
</html>
▼BookDTO.html : 도서 정보 양식 클래스
package com.hanul.study;
import java.io.Serializable;
public class BookDTO implements Serializable {
private String title;
private String auth;
private String isbn;
private String comp;
private int cost;
private int su;
private int price;
public BookDTO() {}
public BookDTO(String title, String auth, String isbn, String comp, int cost, int su, int price) {
super();
this.title = title;
this.auth = auth;
this.isbn = isbn;
this.comp = comp;
this.cost = cost;
this.su = su;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getComp() {
return comp;
}
public void setComp(String comp) {
this.comp = comp;
}
public int getCost() {
return cost;
}
public void setCost(int cost) {
this.cost = cost;
}
public int getSu() {
return su;
}
public void setSu(int su) {
this.su = su;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
▼BookDAO.html : 기능 클래스
package com.hanul.study;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
public class BookDAO {
/*
- getConn() : DB 접속 ▶ ojdbc6.jar 등록
- insert() : 도서 정보 등록
- getAllList() : 전체 도서 목록 조회
- delete() : 도서 정보 삭제
- dbClose() : DB 접속 해제
*/
//객체 선언
private Connection conn;
private PreparedStatement ps;
private ResultSet rs;
//DB 접속 메서드
public Connection getConn() {
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String user = "hanul";
String password = "0000";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
e.printStackTrace();
System.out.println("getConn() Exception");
}
return conn;
} //getConn()
//도서 정보 등록 메서드
public int insert(BookDTO dto) {
conn = getConn();
String sql ="INSERT INTO book VALUES(?, ?, ?, ?, ?, ?, ?)";
int succ = 0;
try {
ps = conn.prepareStatement(sql);
ps.setString(1, dto.getTitle());
ps.setString(2, dto.getAuth());
ps.setString(3, dto.getIsbn());
ps.setString(4, dto.getComp());
ps.setInt(5, dto.getCost());
ps.setInt(6, dto.getSu());
ps.setInt(7, dto.getPrice());
succ = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println("insert() Exception");
} finally {
dbClose();
}
return succ;
} //insert()
//도서 목록 조회 메서드
public ArrayList<BookDTO> getAllList() {
conn = getConn();
String sql = "SELECT * FROM book";
ArrayList<BookDTO> list = new ArrayList<>();
try {
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
String title = rs.getString("title");
String auth = rs.getString("auth");
String isbn = rs.getString("isbn");
String comp = rs.getString("comp");
int cost = rs.getInt("cost");
int su = rs.getInt("su");
int price = rs.getInt("price");
BookDTO dto = new BookDTO(title, auth, isbn, comp, cost, su, price);
list.add(dto);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("getAllList() Exception");
} finally {
dbClose();
}
return list;
} //getAllList()
//도서 정보 삭제 메서드
public int delete(String isbn) {
conn = getConn();
String sql = "DELETE FROM book WHERE isbn = ?";
int succ = 0;
try {
ps = conn.prepareStatement(sql);
ps.setString(1, isbn);
succ = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
System.out.println("delete() Exception");
} finally {
dbClose();
}
return succ;
} //delete()
//DB 접속 해제 메서드
public void dbClose() {
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("dbClose() Exception");
}
} //dbClose()
} //class
▼InsertServlet : 도서 정보 입력 화면
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.hanul.study.BookDAO;
import com.hanul.study.BookDTO;
@WebServlet("/is.do") //Servlet Mapping 자동 설정
public class InsertServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//클라이언트의 요청 받기
request.setCharacterEncoding("utf-8");
BookDTO dto = new BookDTO();
dto.setTitle(request.getParameter("title"));
dto.setAuth(request.getParameter("auth"));
dto.setIsbn(request.getParameter("isbn"));
dto.setComp(request.getParameter("comp"));
dto.setCost(Integer.parseInt(request.getParameter("cost")));
dto.setSu(Integer.parseInt(request.getParameter("su")));
dto.setPrice(dto.getCost() * dto.getSu());
//비즈니스 로직
BookDAO dao = new BookDAO();
int succ = dao.insert(dto);
//프레젠테이션 로직
response.setContentType("text/html; charset=utf-8"); //MIME Type
PrintWriter out = response.getWriter();
if(succ > 0) {
out.println("<script>alert('도서 정보 입력 성공');</script>");
out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
out.println("<br />");
out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
} else {
out.println("<script>alert('도서 정보 입력 실패');</script>");
out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
out.println("<br />");
out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
} //if else
} //service()
} //class
▼GetAllListServlet.java : 도서 목록 조회 화면
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
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.hanul.study.BookDAO;
import com.hanul.study.BookDTO;
@WebServlet("/gals.do")
public class GetAllListServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//비즈니스 로직
BookDAO dao = new BookDAO();
ArrayList<BookDTO> list = dao.getAllList();
//프레젠테이션 로직
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
//CSS
out.println("<style type=\"text/css\">");
out.println("* {");
out.println("margin: 0 auto;");
out.println("}");
out.println("fieldset {");
out.println("width: 700px;");
out.println("}");
out.println("legend {");
out.println("font-size: 1.5em;");
out.println("font-weight: bold;");
out.println("}");
out.println("td, th {");
out.println("padding: 5px;");
out.println("}");
out.println("</style>");
//HTML
out.println("<fieldset>");
out.println("<legend>도서 목록 조회</legend>");
out.println("<table border='1'>");
out.println("<tr>");
out.println("<th>도서명</th>");
out.println("<th>저 자</th>");
out.println("<th style='letter-spacing: 3px'>ISBN</th>");
out.println("<th>출판사</th>");
out.println("<th>단 가</th>");
out.println("<th>수 량</th>");
out.println("<th>가 격</th>");
out.println("<th>삭 제</th>");
out.println("</tr>");
for (BookDTO dto : list) {
out.println("<tr align='center'>");
out.println("<td>" + dto.getTitle() + "</td>");
out.println("<td>" + dto.getAuth() + "</td>");
out.println("<td>" + dto.getIsbn() + "</td>");
out.println("<td>" + dto.getComp() + "</td>");
out.println("<td>" + dto.getCost() + "</td>");
out.println("<td>" + dto.getSu() + "</td>");
out.println("<td>" + dto.getPrice() + "</td>");
out.println("<td><a href='ds.do?isbn=" + dto.getIsbn() + "' style='text-decoration:none'>삭 제</a></td>");
out.println("</tr>");
}
out.println("<tr>");
out.println("<td colspan='8' align='center'><input type=\"button\" value=\"도서 정보 입력\" onclick=\"location.href='BookMain.html'\"/></td>");
out.println("</tr>");
out.println("</table>");
out.println("</fieldset>");
}
}
▼DeleteServlet.java : 도서 정보 삭제 화면
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.hanul.study.BookDAO;
@WebServlet("/ds.do")
public class DeleteServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//클라이언트의 요청 받기
String isbn = request.getParameter("isbn");
//비즈니스 로직
BookDAO dao = new BookDAO();
int succ = dao.delete(isbn);
//프레젠테이션 로직
response.setContentType("text/html; charset=utf-8"); //MIME Type
PrintWriter out = response.getWriter();
if(succ > 0) {
out.println("<script>alert('도서 정보 삭제 성공');</script>");
out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
out.println("<br />");
out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
} else {
out.println("<script>alert('도서 정보 삭제 실패');</script>");
out.println("<a href='BookMain.html'>도서 정보 입력 하기</a>");
out.println("<br />");
out.println("<a href='gals.do'>도서 목록 조회 하기</a>");
} //if else
}
}
반응형
'취업성공패키지 SW 개발자 교육 > Web' 카테고리의 다른 글
[Web] 8. JSP ② : jsp03.jsp ~ jsp05.jsp (0) | 2020.05.18 |
---|---|
[Web] 7. JSP (0) | 2020.05.15 |
[Web] 5. 회원 목록 삭제 추가, 정적 페이지 전환, 동적 페이지 전환 : forward(), sendRedirect() (0) | 2020.05.12 |
[Web] 4. SQL 테이블과 연동하여 HTML, Servlet, DTO, DAO 만들기 (1) | 2020.05.11 |
[Web] 3. Servlet 생성하는 방법, HelloServlet, 누적합 계산 ①, ② (0) | 2020.05.08 |