1. JSP_JDBC&Bean
1) Insert, Delete, Select 하기 위해
=> JDBC + Bean 연결!
Delete 삭제할 ID, Key(프라이머리,유니크,레퍼런스 키)
SQL 데이터 = 가로 한줄로 친다. row

2) DBCP : JDBC API
JDBC 를 편리하게 사용(faster 빨라짐)
결국에는
프로그램 작성을 위한
프로그램을 위한
프로그램을 위한
프로그램들의 집합
프로그램을 만들기 위해 자바와 SQL을 쓰고, 자바를 효율적으로 쓰기위해 API를 쓰고
SQL과 연동하기 위한 API도 설치하고, 연동하는 JDBC를 더욱 효율적으로 쓰기 위해 DAO,DTO(VO)를 쓰다가,
그것도 더욱 간편하게 쓰기 위해 Bean 액션 태그를 쓴다...
꼬리에 꼬리를 무네
[JSP Bean]
1. VO : Value Object
값(데이터) 객체(=개체)
데이터를 보관하고 있는 객체
VO => 데이터 보관 객체
2. DAO : Data Access Object
데이터 접근 객체
DAO => 데이터 접속 객체
중의적 표현이 있음.
=> data 접속은 VO를 의미하기도 하지만
그 외의 데이터를 의미하기도 한다.
보기. DataBase, VO, JSP, Java, JSON, DataWareHouse, ...
3. 처리과정
데이터 생산 ( 입력, 컴퓨터, 센서, 환경, 지도의 위치값 등등으로 생산 가능)
- > VO 또는 DAO 사용 - > 최종 목적지에 데이터 전달 및 처리
JSP에서 DAO를 사용하는 방법 (= 클래스의 객체 생성)
①. page 지시자의 import 속성 사용
②. jsp:useBean Action 태그 사용
① DAO를 사용하여 DB에 전달
[DAO를 사용한DB 접속]
클래스 명 => pack_Bean.DAO
+ 커스텀 메서드가 필요함.
=> JSP에서는 DAO와 해당하는 메서드를 호출함.
모든 공통 index.jsp 페이지.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="/style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/script/script.js"></script>
</head>
<body>
<div id="wrap" class="indexWrap">
<h1>Main</h1>
<hr>
<button type="button" onclick="location.href='/insert/insert.jsp'">
입력
</button>
<button type="button">
조회
</button>
<button type="button">
수정
</button>
</div>
<!-- div#wrap -->
</body>
</html>
Main
form action="경로" 를 통해 insertProc.jsp로 name값을 가진 데이터들을 입력한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="shortcut icon" href="#">
<link rel="stylesheet" href="/style/style.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="/script/script.js"></script>
</head>
<body>
<div id="wrap" class="insertWrap">
<h1>입력페이지</h1>
<hr>
<form action="/insert/insertProc.jsp">
<!-- div*4>p.insertLabel+p>input -->
<div class="dFlex">
<p class="insertLabel">
<span>아이디</span>
</p>
<p><input type="text" name="uid"></p>
</div>
<div class="dFlex">
<p class="insertLabel">
<span>비밀번호</span>
</p>
<p><input type="text" name="upw"></p>
</div>
<div class="dFlex">
<p class="insertLabel">
<span>나이</span>
</p>
<p><input type="text" name="uAge"></p>
</div>
<div class="dFlex">
<p class="insertLabel">
<span>성별</span>
</p>
<p>
남 <input type="radio" name="gender" value="1">
여 <input type="radio" name="gender" value="2">
</p>
</div>
<div class="insertBtnArea">
<button type="submit">전송</button>
</div>
</form>
</div>
<!-- div#wrap -->
</body>
</html>

자 먼저 utf-8의 인코딩을 설정해준다음,
각각의 변수에 입력 받은 값들을 저장해주도록 한다.
DAO obj = new DAO(); 객체를 생성하여
obj의 메서드에서 uid,upw,uAge,gender를 받는다. (메서드는 DAO.java 파일에서 생성한다)
객체 obj는 바로 서버에 입력되는 값!!
rtnCnt ==1 (데이터가 있다면 1, 없다면 0..) 이라면,
response.sendRedirect("경로") 페이지로 이동한다.
insertProc.jsp
<%@page import="pack_Bean.DAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<%
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String upw = request.getParameter("upw");
int uAge = Integer.parseInt(request.getParameter("uAge"));
int gender = Integer.parseInt(request.getParameter("gender"));
DAO obj = new DAO();
int rtnCnt = obj.mtd_Insert(uid, upw, uAge, gender);
/* 서버측에서 페이지 이동 시작 */
if (rtnCnt == 1) {
response.sendRedirect("/index.jsp");
}
/* 서버측에서 페이지 이동 끝 */
%>
DAO 는 데이터 접근 객체, 서버에 접속 하는 곳이다.
그래서 접속 시에는 연결,준비된 정보가 필요하고,
데이터를 가지고 올 때에는 연결, 정보, 결과가 필요하다.
이것들이 바로 Connection,PreparedStatement, Statement, ResultSet 이다.
DAO 클래스에서 DB서버에 넣을 데이터를 전송하기위해 메서드를 생성한 후,
각각의 자료형에 맞게 데이터를 전송!
package pack_Bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DAO {
public int mtd_Insert(
String uid,
String upw,
int uAge,
int gender
) {
Connection objConn = null;
PreparedStatement objPstmt = null;
int rtnCnt = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Dwp_Ch12_JDBC_Bean?";
url += "useSSL=false&";
url += "useUnicode=true&";
url += "characterEncoding=UTF8&";
url += "serverTimezone=UTC";
String user = "root";
String password = "1234";
objConn = DriverManager.getConnection(url, user, password);
//out.print("DB 접속 OK!!!");
/* 매개변수가 있는 SQL 시작 */
String sql1 = "insert into member (uid, upw, uAge, gender, joinTM)";
sql1 += " values (?, ?, ?, ?, now())";
objPstmt = objConn.prepareStatement(sql1);
objPstmt.setString(1, uid); // 문자자료형 C/N1
objPstmt.setString(2, upw); // 문자자료형 C/N1
objPstmt.setInt(3, uAge); // 문자자료형 C/N1
objPstmt.setInt(4, gender); // 정수자료형 C/N2
rtnCnt = objPstmt.executeUpdate();
/* 매개변수가 있는 SQL 끝 */
objPstmt.close();
objConn.close(); // GC, Garbage Collector, 가비지 컬렉터,
// 메모리 자료 정리기
} catch (ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
}
return rtnCnt;
}
}
첫번째로 DAO를 사용하여 데이터를 입력 해보았다.
② VO와 DAO를 사용하여 DB에 전달
[VO와 DAO를 사용하여 DB에 전달]
VO = > 필드 + Setter Getter 로 구성된 클래스
클래스명 => pack_Bean.VO
JSP 에서 VO를 사용하는 방법1
1. DAO에서 클래스의 객체 생성하는 방법이 필요
1) page 지시자의 import 속성 사용
2) jsp:useBean 액션 태그 사용 + jsp:setProperty 액션 태그 사용
2. 1에서 생성된 객체를 커스텀 메서드의
인수로 전달한다.
먼저 페이지 지시자에 import로 pack_Bean.*을 넣어
pack_Bean에 있는 모든 java 파일을 사용할 수 있도록 해주었다.
(DAO, VO 둘다 사용해야하니까)
이번에도 마찬 가지로 객체와 필드를 생성하는데
VO 클래스가 있으니 VO도 객체를 만들어준다.
DAO의 달라진 점, VO의 새로운 필드 생성을 알아보자
insertProc.jsp
<%@page import="pack_Bean.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<%
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String upw = request.getParameter("upw");
int uAge = Integer.parseInt(request.getParameter("uAge"));
int gender = Integer.parseInt(request.getParameter("gender"));
VO objVO = new VO();
/* VO 객체를 생성한다 */
objVO.setUid(uid);
objVO.setUpw(upw);
objVO.setuAge(uAge);
objVO.setGender(gender);
/*objVO에 저장된 서버 데이터를 이곳에서 초기화 시켜줘야하니까 set으로 받는다.*/
DAO objDAO = new DAO();
int rtnCnt = objDAO.mtd_Insert(objVO);
/* 서버측에서 페이지 이동 시작 */
if (rtnCnt == 1) {
response.sendRedirect("/index.jsp");
}
/* 서버측에서 페이지 이동 끝 */
%>
DAO 클래스.
VO가 있기 전에는 mtd_Insert 메서드에 자료형을 가진 필드가 전부 있었는데?!
데이터를 저장하고 있는 VO 클래스만 불러오면 되니 사용성이 간편해졌다.
package pack_Bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DAO {
public int mtd_Insert(VO objVO) {
Connection objConn = null;
PreparedStatement objPstmt = null;
int rtnCnt = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Dwp_Ch12_JDBC_Bean?";
url += "useSSL=false&";
url += "useUnicode=true&";
url += "characterEncoding=UTF8&";
url += "serverTimezone=UTC";
String user = "root";
String password = "1234";
objConn = DriverManager.getConnection(url, user, password);
//out.print("DB 접속 OK!!!");
/* 매개변수가 있는 SQL 시작 */
String sql1 = "insert into member (uid, upw, uAge, gender, joinTM)";
sql1 += " values (?, ?, ?, ?, now())";
objPstmt = objConn.prepareStatement(sql1);
objPstmt.setString(1, objVO.getUid()); // 문자자료형 C/N1
objPstmt.setString(2, objVO.getUpw()); // 문자자료형 C/N1
objPstmt.setInt(3, objVO.getuAge()); // 문자자료형 C/N1
objPstmt.setInt(4, objVO.getGender()); // 정수자료형 C/N2
rtnCnt = objPstmt.executeUpdate();
/* 매개변수가 있는 SQL 끝 */
objPstmt.close();
objConn.close(); // GC, Garbage Collector, 가비지 컬렉터,
// 메모리 자료 정리기
} catch (ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
}
return rtnCnt;
}
}
VO 클래스.
private 자료형 ID값으로 필드가 초기화 되어있고,
alt - s r - a r 을 눌러 set - get 필드를 생성한다.
VO 클래스는 서버와 클라이언트의 데이터를 주고 받게 해주는 중간 다리 역할을 하며
택배 회사의 허브역할을 한다.
package pack_Bean;
public class VO {
private String uid = null;
private String upw = null;
private int uAge = 0;
private int gender = 0;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUpw() {
return upw;
}
public void setUpw(String upw) {
this.upw = upw;
}
public int getuAge() {
return uAge;
}
public void setuAge(int uAge) {
this.uAge = uAge;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
}
두번째 DAO 와 VO를 통한 연결을 해보았다.
JSP에서 VO를 사용하는 방법2
1. useBean 액션 태그 사용
=> useBean 액션 태그는 여러기능을
함축하고 있는 XML코드를 의미함.
useBean을 사용하면 매우매우 코드가 짧아지는 경험을 하게되는 것 같다. 사용하기도 좋고
유즈빈, 이름도 맘에 든다.
사용할 때에는
<jsp:useBean id="사용할 이름" class="사용할 이름을 가진 장소" />
<jsp:setProperty name="id" property="속성" /> *은 속성 전체!
setProperty는 useBean 과 짝꿍!
setProperty 사용하면 객체 생성 , 필드 생성 할 필요 없음!
insertProc.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="objVO" class="pack_Bean.VO" />
<jsp:setProperty name="objVO" property="*" />
<jsp:useBean id="objDAO" class="pack_Bean.DAO" />
<%
int rtnCnt = objDAO.mtd_Insert(objVO);
/* 서버측에서 페이지 이동 시작 */
if (rtnCnt == 1) {
response.sendRedirect("/index.jsp");
}
/* 서버측에서 페이지 이동 끝 */
%>
세번째 useBean을 사용한 연결을 해보았다
[JDBC와 Bean을 사용한 출력]
1. JSP + JDBC 출력
2. JSP + Bean (VO+DAO 함께 사용) + JDBC 출력
1) Insert 에서는
JSP에서 DAO 객체 실행하여 메서드 호출
=> useBean Action Tag
JSP에서 VO 객체 실행하여 Setter로 데이터 초기화
=> useBean + setProperty 액션 태그
DAO 메서드에서 인수(Argument)에
VO 객체를 전달
2) select 에서는
JSP에서 DAO 객체 실행하여
관련 메서드 호출(Select를 실행하는 JDBC)
+
이 메서드에서 VO객체를 생성하고
필드에 초기화 후 C.F 자료형으로 반환한다. - 여기서 부터 어려워짐
(즉, JSP에서 DAO 객체를 실행하여 관련 메서드를 호출했을 때의 반환 자료형도
C.F 자료형이 되어야 한다.)
보기. C.F 자료형에는 List, Vector, ArrayList, LinkedList ,...
3. 출력용 VO 클래스
VO=> 필드 +Setter+ Getter로 구성된 클래스
입력용 VO 클래스 명 => pack_Bean.VO 또는 IVO (Insert)
출력용 VO 클래스 명 => pack_Bean.SVO (Select)
삭제용 VO 클래스 명 => pack_Bean.DVO (Delete)
참고. 1개의 VO로 모든 작업을 처리 할 수 있으나,
모든 데이터에 해당하는 필드를 포함하고 있어야한다.
jsp DAO 메서드 실행 (List<SVO> objList = objDAO.mtd_Select();) ->
셀렉트의 데이터 반환 jsp에서 한번에 가져갈 수 있는 방법이 없으므로
메서드에서 SVO를 통해 초기화 하고, 초기화된 SVO 객체를
컬렉션 프레임 워크의 첫번째 배열로 초기화 objList.add(objSVO);
insertProc.jsp
useBean 태그를 두개! 사용해서 각각의 class를 지정해서 다른 id로 사용 하고 있다.
setProperty는 데이터를 가지고 있는 objVO를 지정하여 세팅했다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" autoFlush="true" %>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="objDAO" class="pack_Bean.DAO" />
<jsp:useBean id="objVO" class="pack_Bean.VO" />
<jsp:setProperty name="objVO" property="*" />
<%
int rtnCnt = objDAO.mtd_Insert(objVO);
/* 서버측에서 페이지 이동 시작 */
if (rtnCnt == 1) {
response.sendRedirect("/index.jsp");
}
/* 서버측에서 페이지 이동 끝 */
%>
DAO 클래스...
import 많은 것만 봐도 머리가 어질어질 하다.
메서드를 여러개 만들어서 그렇다.
메서드 마다의 기능이 insert와 select로 나뉘어진다.
하나의 클래스에서 사용되는 건 좋은데.. 코드가 복잡해져서 어렵다
package pack_Bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Vector;
public class DAO {
private List<SVO> objList = null;
public int mtd_Insert(VO objVO) {
Connection objConn = null;
PreparedStatement objPstmt = null;
int rtnCnt = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Dwp_Ch12_JDBC_Bean?";
url += "useSSL=false&";
url += "useUnicode=true&";
url += "characterEncoding=UTF8&";
url += "serverTimezone=UTC";
String user = "root";
String password = "1234";
objConn = DriverManager.getConnection(url, user, password);
//out.print("DB 접속 OK!!!");
/* 매개변수가 있는 SQL 시작 */
String sql1 = "insert into member (uid, upw, uAge, gender, joinTM)";
sql1 += " values (?, ?, ?, ?, now())";
objPstmt = objConn.prepareStatement(sql1);
objPstmt.setString(1, objVO.getUid()); // 문자자료형 C/N1
objPstmt.setString(2, objVO.getUpw()); // 문자자료형 C/N1
objPstmt.setInt(3, objVO.getuAge()); // 문자자료형 C/N1
objPstmt.setInt(4, objVO.getGender()); // 정수자료형 C/N2
rtnCnt = objPstmt.executeUpdate();
/* 매개변수가 있는 SQL 끝 */
objPstmt.close();
objConn.close(); // GC, Garbage Collector, 가비지 컬렉터,
// 메모리 자료 정리기
} catch (ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
} catch (SQLException sqle) {
System.out.println(sqle.getMessage());
}
return rtnCnt;
}
public List<SVO> mtd_Select() {
Connection objConn = null;
Statement objStmt = null;
ResultSet objRS = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/Dwp_Ch12_JDBC_Bean?";
url += "useSSL=false&";
url += "useUnicode=true&";
url += "characterEncoding=UTF8&";
url += "serverTimezone=UTC";
String user = "root";
String password = "1234";
objConn = DriverManager.getConnection(url, user, password);
//out.print("DB 접속 OK!!!");
/* 매개변수가 없는 SQL 시작(주로 Select) */
String sql = "select num, uid, upw, uAge, gender, joinTM ";
sql += " from member order by num desc";
objStmt = objConn.createStatement();
objRS = objStmt.executeQuery(sql);
// JDBC 로 반환된 데이터가
// VO의 필드를 초기화하는 Setter의 인수에 사용됨
// 반환되는 데이터(row)가 2개 이상일 경우
// (next( )메서드 사용법에 주의, if와 while을 함께 사용하면 커서위치가 달라질 수 있음)
//SVO 객체 생성 초기화;
SVO objSVO = null;
objList = new Vector<SVO>();
while (objRS.next()) {
objSVO = new SVO();
// 객체에 새로운 값 초기화;
objSVO.setNum(objRS.getInt("num"));
objSVO.setUid(objRS.getString("uid"));
objSVO.setUpw(objRS.getString("upw"));
objSVO.setuAge(objRS.getInt("uAge"));
objSVO.setGender(objRS.getInt("gender"));
objSVO.setJoinTM(objRS.getString("joinTM"));
objList.add(objSVO);
//objList 객체에 objSVO를 추가;
}
/* 매개변수가 없는 SQL 끝(주로 Select) */
objRS.close();
objStmt.close();
objConn.close(); // GC, Garbage Collector, 가비지 컬렉터,
// 메모리 자료 정리기
} catch (ClassNotFoundException cnfe) {
System.out.print(cnfe.getMessage());
} catch (SQLException sqle) {
System.out.print(sqle.getMessage());
}
return objList;
}
}
'코딩 해보자' 카테고리의 다른 글
| 220921 JDBC를 더 간단하게, DBCP API 사용으로 효율을 높이자 (1) | 2022.09.21 |
|---|---|
| 220920 회원 목록 페이지에서 삭제(선택,전체)와 수정을 해보자 (0) | 2022.09.20 |
| 220916 jsp와 DB서버를 연동하여 입력된 회원 삭제 하기 (2) | 2022.09.16 |
| 220914 JSP - Java - SQL(DB) 연결 (0) | 2022.09.14 |
| 220913 JSP 액션태그 <useBean> 사용하기 (0) | 2022.09.13 |
댓글