20220728_Thu
프로젝트명: DBTest
servlet 4개
클래스 1개
jsp 2개
*데이터베이스 함께 열어서 진행하기
MYEB 접속 표시는 콘센트 모양 확인하기!
어제 만들어놓은 데이터가 입력된 테이블 조회하기
DB에서
SELECT * FROM TEST_STUDENT;
//
2022 김자바 20 울산시
2 이자바 30 서울시
5 임꺽정 10 울산시
6 김김자바 10 동울산시
7 김중자바 50 서울산시
8 김대자바 80 남울산시
9 김아자바 55 북울산시
4 김인천 77 인천광역시
105 이순신 20 울산시
11 11 11 11
101 유관순 20 울산시
[실습] 이름,나이,학번을 가지고있는 update.jsp에서 가져온 학번으로 학생의 이름과 나이의 값을 변경하라.
DBTest 프로젝트 > update.jsp 과 UpdateServlet 만들기
1.update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request. setCharacterEncoding("UTF-8");
response.setContentType("text.html;charset=UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="update" method="post">
학번 : <input type="text" name="stuNum"><br><!-- 컬럼이름대로 맞춰준다(카멜표기법이용) -->
이름 : <input type="text" name="stuName"><br>
나이 : <input type="text" name="stuAge"><br>
<input type="submit" value="등록"><br>
</form>
</body>
</html>
출력창
<주의!!>
_jsp에서 f11눌러서 출력 후
이미 디비 테이블에 있었던 학번값으로 입력해야 변경가능하다!
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/update")
public class UpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UpdateServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int stuNum = Integer.parseInt(request.getParameter("stuNum"));
int stuAge = Integer.parseInt(request.getParameter("stuAge"));
String stuName = request.getParameter("stuName");
//--------------------데이터 받은 후 디비 작업 시작-------------------------------//
//주의!! 모두 자동완성으로 만들어야함
//자바와 디비 연결할 객체
Connection conn = null;
//쿼리를 실행할 객체
PreparedStatement stmt = null;
//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
ResultSet rs = null;
//쿼리문(내가 직접 작성할)
//실제 디비에서 작성하는 것과 같이 작성한다.
//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!!
//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
String sql ="UPDATE TEST_STUDENT SET STU_NAME = ?,STU_AGE = ? WHERE STU_NUM = ?";
try {//오류발생여지가 있는 코드입력하면
//디비 연결 정보를 받아옴.(자동완성해야함)
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
//실제로 디비와 자바를 연결
conn = ds.getConnection();
//쿼리(내가 위에서 만든) 실행 준비
stmt = conn.prepareStatement(sql);
//?값 세팅하기(쿼리실행전!)
//물음표의 순서가 앞 매개변수의 숫자 의미.
//뒷 매개변수는 들어갈 값
//각 물음표의 자료형맞추기.
stmt.setString(1, stuName);//두번째 물음표의 넣을 값
stmt.setInt(2, stuAge);//세번째 물음표읜 넣을 값
stmt.setInt(3, stuNum);//첫번째 물음표의 넣을 값
//쿼리실행(실제)
//두 개중에 무엇을 실행할지 선택한다.
//stmt.executeQuery();//조회할때
stmt.executeUpdate();//삽입,삭제,수정할 때(int 리턴값)
} catch (Exception e) {//오류발생하면 실행, 안나면 x
e.printStackTrace();//오류위치이유 간략히 설명
System.out.println("오류났어요");//오류나면 콘솔창 출력
}finally {//오류발생 상관없이 반드시 실행된다.
//디비와 연결해제(순서중요!!)
try {
if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}catch (Exception e) {
}
}
//----------------디비 작업 끝 ---------------------------------------//
}
}
[실습2]
-selectServlet02.java
학번이 20번 이하인 학생들의 학번,일음,나이,주소를 조회하라
-select02.jsp
조회한 데이터 전체를 화면에 출력하라
selectServlet02.java
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/selectServlet02")
public class selectServlet02 extends HttpServlet {
private static final long serialVersionUID = 1L;
private String stuAddr;
public selectServlet02() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//--------------------데이터 받은 후 디비 작업 시작-------------------------------//
//주의!! 모두 자동완성으로 만들어야함
//자바와 디비 연결할 객체
Connection conn = null;
//쿼리를 실행할 객체
PreparedStatement stmt = null;
//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
ResultSet rs = null;
//쿼리문(내가 직접 작성할)
//실제 디비에서 작성하는 것과 같이 작성한다.
//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!!
//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
String sql ="SELECT "
+ "STU_NUM"
+ ",STU_NAME"
+ ",STU_AGE"
+ ",STU_ADDR "
+ "FROM TEST_STUDENT "
+ "WHERE STU_NUM <= 20;";
try {//오류발생여지가 있는 코드입력하면
//디비 연결 정보를 받아옴.(자동완성해야함)
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
//실제로 디비와 자바를 연결
conn = ds.getConnection();
//쿼리(내가 위에서 만든) 실행 준비
stmt = conn.prepareStatement(sql);
//?값 세팅하기(쿼리실행전!)
//물음표의 순서가 앞 매개변수의 숫자 의미.
//뒷 매개변수는 들어갈 값
//각 물음표의 자료형맞추기.
//쿼리실행(실제)
//두 개중에 무엇을 실행할지 선택한다.
rs = stmt.executeQuery();//조회할때
//stmt.executeUpdate();//삽입,삭제,수정할 때(int 리턴값)
List<StudentDTO> list = new ArrayList<>();
//다음데이터있니?
//while문 한번 돌때 한줄(행) 씩 돈다.
while(rs.next()) {//전체 데이터가 들어간 테이블의 첫줄부터 시작하여 가리킨다. 만약 데이터가 있다면 다음데이터로 넘어간다.
// //rs는 현재 모든 데이터를 가지고있음.
// rs.getInt("STU_NUM");//정수값 데이터를 가져오겠다.
// rs.getString("STU_NAME");
//
//데이터 어떻게 가져오는지 눈으로 확인(콘솔)
// System.out.print(rs.getInt("STU_AGE"));
// System.out.print(rs.getString("STU_NAME"));
// System.out.print(rs.getInt("STU_NUM"));
// System.out.println();//콘솔에 출력
//이렇게 while문 안에 있는게 한번 모두 돌면 한 행이 완성된다.
//페이지 이동하려면 데이터가져갈수있는>>클래스가 필요함. 사용자지정 자료형이 필요하기 때문에
//미리 만들어놓은 studentDTO 클래스 이용한다.
int stuAGe = rs.getInt("STU_AGE");
String stuName = rs.getString("STU_NAME");
int stuNum = rs.getInt("STU_NUM");
String sutAddr = rs.getString("STU_ADDR");
StudentDTO student = new StudentDTO();
student.setStuAge(stuAGe);
student.setStuName(stuName);
student.setStuNum(stuNum);
student.setStuAddr(stuAddr);
//학생한명의데이터가 여러개담긴 리스트를 만들어야함 위에 미리 만들어놓음.while문 밖에
list.add(student);//반복문 돌면서 하나하나 데이터를 넣어준다.
}
//jsp에 위 값들을 던져준다.
request.setAttribute("list", list);
///페이지이동 jsp 화면 보여주기위해서 콘솔x
RequestDispatcher dispatcher = request.getRequestDispatcher("select02.jsp");
dispatcher.forward(request, response);
} catch (Exception e) {//오류발생하면 실행, 안나면 x
e.printStackTrace();//오류위치이유 간략히 설명
System.out.println("오류났어요");//오류나면 콘솔창 출력
}finally {//오류발생 상관없이 반드시 실행된다.
//디비와 연결해제(순서중요!!)
try {
if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}catch (Exception e) {
}
}
//----------------디비 작업 끝 ---------------------------------------//
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
-select02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri= "http://java.sun.com/jsp/jstl/core" %>
<%
request. setCharacterEncoding("UTF-8");
response.setContentType("text.html;charset=UTF-8");
%>
[실습3]
select_num.jsp
-학번을입력받을 수있다. input 태그만들기
SelectSdervlet03.java
-입력받은 학번을 가진 학생의 학번 , 이름을 조회
select03.jsp
-조회한 학생의 정보를 출력
-select_num.jsp
<%@ 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>
<form action="selectNum" method="post">
학번 : <input type="text" name="stuNum"><br>
<input type="submit" value="조회">
</form>
</body>
</html>
SelectSdervlet03.java
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
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 javax.sql.DataSource;
@WebServlet("/selectNum")
public class selectServlet03 extends HttpServlet {
private static final long serialVersionUID = 1L;
public selectServlet03() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//변수받아오기.
int stuNum = Integer.parseInt(request.getParameter("stuNum"));
//자바와 디비 연결할 객체
Connection conn = null;
//쿼리를 실행할 객체
PreparedStatement stmt = null;
//조회 결과 데이터를 저장할 객체(SELECT에서만 사용)
ResultSet rs = null;
//쿼리문(내가 직접 작성할)
//실제 디비에서 작성하는 것과 같이 작성한다.
//바로 넣지말고 디비에서 실행되는지 확인 후 복사 붙어넣기!!
//[문제] 받아온 학번의 학생의 이름과 나이 값을 변경하라.
String sql ="SELECT STU_NUM,STU_NAME FROM TEST_STUDENT WHERE STU_NUM = ? ";
try {//오류발생여지가 있는 코드입력하면
//디비 연결 정보를 받아옴.(자동완성해야함)
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
//실제로 디비와 자바를 연결
conn = ds.getConnection();
//쿼리(내가 위에서 만든) 실행 준비
stmt = conn.prepareStatement(sql);
//?값 세팅하기(쿼리실행전!)
stmt.setInt(1, stuNum);
//쿼리실행(실제)
rs = stmt.executeQuery();//조회할때
//한 줄만 필요하기때문에 리스트 필요 없음.!!!
//하나 담을 통만들기
StudentDTO student = new StudentDTO();
while(rs.next()) {
student.setStuNum(rs.getInt("STU_NUM"));
student.setStuName(rs.getString("STU_NAME"));
}
//페이지 넘기기 전에 자료를 먼저 넘기기
request.setAttribute("student", student);
///페이지이동 jsp 화면 보여주기위해서 콘솔x
RequestDispatcher dispatcher = request.getRequestDispatcher("select03.jsp");
dispatcher.forward(request, response);
}
catch (Exception e) {//오류발생하면 실행, 안나면 x
e.printStackTrace();//오류위치이유 간략히 설명
System.out.println("오류났어요");//오류나면 콘솔창 출력
}finally {//오류발생 상관없이 반드시 실행된다.
//디비와 연결해제(순서중요!!)
try {
if (rs != null) {//rs가 null이 아닐때는 (실행이 됐을 때)만 닫겠다.
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}catch (Exception e) {
}
}
}
}
select03.jsp
<%@ 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>
이름 : ${student.stuName}<br>
학번 : ${student.stuNum }<br>
<br>
</body>
</html>
결과
이미있는 학번을 입력한 뒤 조회하면
해당 학번을 가진 학생의 학번과 이름이 조회된다.
20 김자바 2022
45 룰루 598
31 ë°ë°ìë° 2
10 임꺽정 5
10 김김자바 6
50 김중자바 7
80 김대자바 8
55 김아자바 9
77 김인천 4
20 이순신 105
11 11 11
20 유관순 101
데이터베이스
--회원 정보 테이블
--회원 아이디,회원 비밀번호,이름,나이,이메일,연락처,성별
CREATE TABLE MEMBER(
ID VARCHAR2(50) PRIMARY KEY
--기본키(PK)로 설정하면 문자열크기(바이트기준) 50으로 제한하면 NULL값도 안된다.
, PW VARCHAR2(50) NOT NULL --NULL 들어오면 오류(필수입력)
, NAME VARCHAR2(50) NOT NULL
, AGE NUMBER
, EMAIL VARCHAR2(100) UNIQUE --중복은 안되지만 NULL은 가능하다.(선택사항)
--UNIQUE NOT NULL --중복은 X NULL은 불가능하다. 기본키와 같다.
, TELL VARCHAR2(100) -- 010-1111-1111
, GENDER VARCHAR2(10) --남,여 (한글 한글자: 3바이트)
);
SELECT * FROM MEMBER;
0.셋팅하기
-자바 프로젝트 만들기 (체크하기!!)
-파일복사 붙여넣기
<%@ 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>
<jsp:forward page="memberList.me"></jsp:forward>
</body>
</html>
package controller;
import java.io.IOException;
import java.util.ArrayList;
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;
@WebServlet("*.me")
public class MemberController extends HttpServlet {
private static final long serialVersionUID = 1L;
//학생목록페이지를 저장할 수 있는 리스트 객체 생성
//StudentDTO(학생 한명)을 여러 명 저장할 수 있는 리스트(studentList) 공간을 만든다.
public MemberController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//한글 인코딩 처리
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String command = requestURI.substring(contextPath.length());
System.out.println("command = " + command);
String page = "";
boolean isRediect = false;
//회원목록페이지
if(command.equals("/memberList.me")) {
page = "member_list.jsp";
}
//페이지이동에 사용되는 if문
if(isRediect) {
response.sendRedirect(page);
}
else {
RequestDispatcher dispatcher = request.getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
}
package dto;
public class MemberDTO {
private String id;
private String pw;
private String name;
private int age;
private String email;
private String tell;
private String gender;
//생성자
public String getId() {
return id;
}
public MemberDTO
(String id, String pw, String name, int age, String email, String tell, String gender) {
super();
this.id = id;
this.pw = pw;
this.name = name;
this.age = age;
this.email = email;
this.tell = tell;
this.gender = gender;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTell() {
return tell;
}
public void setTell(String tell) {
this.tell = tell;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
<%@ 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>
회원목록페이지
</body>
</html>
DAO: Data Access Object
5.1) 패키지 dao 로 JDBCUtil 클래스 만들기
-MVC패턴 : 유지보수를 용이하게 하기위해서 역할분담하여 작업하는 방식
컨트롤러 Controller? 요청에 따라 응답 페이지를 보여준다.
뷰 View? 화면(jsp)을 보여준다.
모델 Model? 비지니스 로직(실제기능)이 들어가있는 내용 -> DAO
->DB에 데이터를 미리 복사하여 받는다.
-> 실행시켜 모든 삽입 후 커밋(저장)
![](https://velog.velcdn.com/images/ub997/post/e0355015-fbdb-4f5f-a1a9-9128cc58c1d4/image.png)
->이클립스들어가서 프로젝트로 run 하기.
**결과**
![](https://velog.velcdn.com/images/ub997/post/0b8656b2-5199-446a-adbe-6142c765d4ab/image.png)