특정테이블의 정보를 단위별로 정의한 클래스
특정변수와 setter,getter로만 이루어짐
데이타베이스에 접속,명령전송전담 클래스(메서드)
DB CRUD
1.db생성
2.dto
3.dao
4.form.jsp 입력폼
5.action.jsp : 데이타를 읽어서 db에 저장한후 목록으로 이동
6.list.jsp
SinsangDto.java - 데이터베이스에서 받아올 각각의 데이터의 대한 변수와 set, get 메소드를 갖고 있는 클래스
SinsangDao.java - insert, select, update, delete 메소드를 갖고 있는 실질적인 기능을 담당하는 클래스
미리 만들어놓은 DBConnect클래스를 객체로 가져와 DB와 연결할 수 있도록 한다
기본적으로 여기서 만들 모든 메소드는 Connection과 PreparedStatement(Statement)를 사용해서
DB와 연결하고 sql문 실행할 수 있도록 한다, select 메소드만 출력하기 위해 ResultSet 까지 사용한다
insert메소드 : insert에 해당하는 sql문을 작성해 prepareStatement를 통해 넘겨준다
select메소드 : select 메소드는 데이터를 출력하기 위해 리턴 값이 존재한다,
데이터가 유기적으로 추가되고 삭제되기 때문에 가변형인 벡터를 리턴형으로 쓴다 /
리턴을 할 벡터(list)를 만든다 /
select에 해당하는 sql문을 작성해 prepareStatement를 통해 넘겨준다 /
반복문 안에서 ResultSet 객체를 통해 얻어온 각각의 데이터 값을 SinsangDto클래스의
set메소드를 활용하여 넘겨준다 /
그리고 벡터(list)에 추가해준다 / 반복이 종료되면 벡터(list)를 리턴한다
delete메소드 : 시퀀스 값을 전달받을 매개변수를 하나 받는다
delete에 해당하는 sql문을 작성해 prepareStatement를 통해 넘겨준다
insertForm.jsp - 사용자로부터 이름과 주소를 입력받기 위한 폼 구성,
전송버튼을 누르면 insertAction.jsp로 입력한 데이터를 넘겨준다,
목록버튼을 누르면 list.jsp로 이동한다
insertAction.jsp - insertForm에서 넘겨받은 값을 SinsangDto클래스를 활용하여 전달해주고 insert를 하기위해
SinsangDao클래스의 insert메소드를 호출한다 / 그 이후에 url을 list.jsp로 이동한다
list.jsp - 데이터를 select하여 화면에 나타내주기 위해 SinsangDao클래스의 select메소드를 호출하여
리턴 값을 벡터로 받는다 /
데이터를 출력하기 위한 테이블과 데이터 추가 버튼을 만든다
데이터 추가 버튼은 현재있는 list.jsp에서 insert를 수행하던 insertForm.jsp화면으로 이동하는 역할을 한다 /
위에서 데이터를 받은 벡터를 반복문을 사용하여 SinsanDto클래스 객체에 대입해주고 각각의 get메소드를
사용해 출력한다 /
데이터 출력 이후에는 수정버튼 삭제버튼을 만든다
삭제 버튼 클릭 시 delete.jsp에 시퀀스에 해당하는 값을 get메소드를 사용해 전달?해준다
delete.jsp - list.jsp의 삭제 버튼을 통해서 넘겨받은 시퀀스값을 SinsangDao클래스의 delete메소드를 호출하여
매개변수로 넘겨준다 / 그 이후에 url을 list.jsp로 이동한다
oracle에서는 table 생성만 한다
--int 사용x int로 받아오면 String으로 매번 캐스팅해줘야하기 때문
create table sinsang(num number(5) primary key,
name varchar2(20),
addr varchar2(30),
sdate date);
select * from sinsang;
package oracle.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConnect {
static final String ORACLE_URL="jdbc:oracle:thin:@localhost:1521:XE";
//driver
String driver="oracle.jdbc.driver.OracleDriver";
public DBConnect() {
try {
Class.forName(driver);
System.out.println("오라클 드라이버 성공!!!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("오라클 드라이버 실패!!!");
}
}
//Connection
public Connection getConnection()
{
Connection conn=null;
try {
conn=DriverManager.getConnection(ORACLE_URL, "tjdgus", "1234");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("오라클 연결 실패: url,계정,비밀번호 확인 요함! "+e.getMessage());
}
return conn;
}
//close메서드..총 4개
//완성구문 2개
public void dbClose(ResultSet rs,Statement stmt,Connection conn)
{
try {
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void dbClose(Statement stmt,Connection conn)
{
try {
if(stmt!=null) stmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//미완구문 2개 //preparedstatement 나중에 정의해줌
public void dbClose(ResultSet rs,PreparedStatement pstmt,Connection conn)
{
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void dbClose(PreparedStatement pstmt,Connection conn)
{
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
멤버(private)만 만드는곳 / setter getter로 받으면 돼서 private 사용
변수는 sqltable과 선언한 이름은 다르게 해도 되지만 같게하면 알아보기 쉬어서 같게 함/Spring에서는 무관
주의 - Timestamp 무조건 sql로 security하면 에러 나옴
//Timestamp 무조건 sql로 security하면 에러 나옴
private Timestamp sdate;
package model.sinsang;
import java.sql.Timestamp;
public class SinsangDto {
//멤버(private)만 만드는곳 / setter getter로 받으면 돼서
// sqltable과 선언한 이름은 다르게 해도 되지만 같게하면 알아보기 쉬어서 같게 함/Spring에서는 무관
private String num;
private String name;
private String addr;
// Timestamp 무조건 sql로 security하면 에러 나옴
private Timestamp sdate;
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Timestamp getSdate() {
return sdate;
}
public void setSdate(Timestamp sdate) {
this.sdate = sdate;
}
}
CRUD를 만드는 곳
db에 저장하고 전송하는 역할
전역변수로 db 호출
db서버에 전체를 넘겨야함(전송)
메서드에 void를 준 이유는 출력문이 아니라서 void
인자값으로 dto를 준 이유는 모든 데이터를 dto에 넣어서 줌
?준 곳에 값을 넣어줘야함
dto.get~~()는 미리 만들어준 메서드이고 값을 넣는건 action탭에서 넣어줌
// 값 담아주고 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//실행
pstmt.executeUpdate();
public void insertSinsang(SinsangDto dto)
{
Connection conn=null;
//나중에 바인딩해주는게 안정성을 더 높혀줌
PreparedStatement pstmt=null;
String sql="insert into sinsang values(seq_1.nextval,?,?,sysdate)";
conn=db.getConnection();
try {
pstmt=conn.prepareStatement(sql);
// 값 담아주고 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//실행
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
방대한 양의 db를 넣기 위해서 컬렉션 생성
Vector<SinsangDto> list=new Vector<SinsangDto>();
여러 개의 데이터를 얻을 경우 사용
(즉, list는 대용량의 데이터이기 때문에 여기 안에 있는 모든 데이터를 사용하기 위해서 사용)
while(rs.next())
{
//while문 안에서 dto 선언 / set해준 후 list에 추가해줘야하기 때문
SinsangDto dto=new SinsangDto();
// getString("컬럼명") - db에 있는 컬럼명
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
// set한 값들 벡터에 추가
list.add(dto);
}
set(값을 넣어줌,수정해줌)해준 후 list에 추가해줘야하기 때문
//while문 안에서 dto 선언 / set해준 후 list에 추가해줘야하기 때문
SinsangDto dto=new SinsangDto();
db에 있는 컬러명 사용
// getString("컬럼명") - db에 있는 컬럼명
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
// set한 값들 벡터에 추가
list.add(dto);
public Vector<SinsangDto> getAllDates()
{
//list<> **=new list<>(); 안됨
Vector<SinsangDto> list=new Vector<SinsangDto>();
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select * from sinsang order by num";
try {
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
//여러개 데이터 얻을 경우/list이기 때문에 모든 데이터가 나와야하기 때문
while(rs.next())
{
//while문 안에서 dto 선언 / set해준 후 list에 추가해줘야하기 때문
SinsangDto dto=new SinsangDto();
// getString("컬럼명") - db에 있는 컬럼명
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
// set한 값들 벡터에 추가
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.dbClose(rs, pstmt, conn);
}
return list;
}
db(sql)에서 삭제하기 위해서는 sequence번호가 필요하다
그 sequence 번호를 num으로 지정해줬기 때문에 인자 값으로 String num을 준다
->sequence(num)만 필요하기 때문에 굳이 dto가 필요없음 / 효율적으로 하기 위해서 num만 넣음
// 여기 있는 num은 deleteSinsang의 파라메터로 넘어온것
String sql="delete from sinsang where num=?";
-> delete.jsp 가보면 값을 넘겨줌
//num이 sequence
//sequence(num)만 필요하기 때문에 굳이 dto가 필요없음 / 효율적으로 하기 위해서 num만 넣음
public void deleteSinsang(String num)
{
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
// 여기 있는 num은 deleteSinsang의 파라메터로 넘어온것
String sql="delete from sinsang where num=?";
try {
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, num);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
수정...이름 주소 수정
수정할때는 시퀀스 번호 1개만 필요하기 때문에 getData라는 메서드 하나를 추가한다
update폼에 입력한 데이터를 dto 통해서 값을 받아오기 때문에 dto.get~~()
public void updateSinsang(SinsangDto dto)
{
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
String sql="update sinsang set name=?, addr=? where num=?";
try {
pstmt=conn.prepareStatement(sql);
//? 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setString(3, dto.getNum());
//실행
pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
수정하기 위해 시퀀스(sequence) 단 하나만 필요하기 때문에 data라는 메서드 생성
하나의 데이터만을 조회시 if(rs.next()) 사용
while(rs.next())사용 해서 조회해도 되지만 효율성 저하
//하나의 데이터 조회시 if / while써도 조회는 되지만 효율성 저하
if(rs.next())
{
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
}
//하나의 데이터 조회
//Vector<SinsangDto>에서 Vector만 빼면 하나의 데이터만 의미할 수 있음
public SinsangDto getData(String num)
{
SinsangDto dto=new SinsangDto();
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select * from sinsang where num=?";
try {
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, num);
rs=pstmt.executeQuery();
//하나의 데이터 조회시 if / while써도 조회는 되지만 효율성 저하
if(rs.next())
{
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(rs, pstmt, conn);
}
return dto;
}
package model.sinsang;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import oracle.db.DBConnect;
public class SinsangDao {
//db에 저장하고 전송하는 역할
DBConnect db=new DBConnect();
//insert
//db서버에 전체를 넘겨야함(전송)
public void insertSinsang(SinsangDto dto)
{
Connection conn=null;
//나중에 바인딩해주는게 안정성을 더 높혀줌
PreparedStatement pstmt=null;
String sql="insert into sinsang values(seq_1.nextval,?,?,sysdate)";
conn=db.getConnection();
try {
pstmt=conn.prepareStatement(sql);
// 값 담아주고 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//실행
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
//select
//전송해서 sql table에 입력된 값을 list.jsp에 출력해야함
//가변적이고 많은 데이터를 출력해야하기 때문에 컬렉션(vector,list)으로 해야함
public Vector<SinsangDto> getAllDates()
{
//list<> **=new list<>(); 안됨
Vector<SinsangDto> list=new Vector<SinsangDto>();
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select * from sinsang order by num";
try {
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
//여러개 데이터 얻을 경우/list이기 때문에 모든 데이터가 나와야하기 때문
while(rs.next())
{
//while문 안에서 dto 선언 / set해준 후 list에 추가해줘야하기 때문
SinsangDto dto=new SinsangDto();
// getString("컬럼명") - db에 있는 컬럼명
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
// set한 값들 벡터에 추가
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.dbClose(rs, pstmt, conn);
}
return list;
}
//삭제
//num이 sequence
//sequence(num)만 필요하기 때문에 굳이 dto가 필요없음 / 효율적으로 하기 위해서 num만 넣음
public void deleteSinsang(String num)
{
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
// 여기 있는 num은 deleteSinsang의 파라메터로 넘어온것
String sql="delete from sinsang where num=?";
try {
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, num);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
//하나의 데이터 조회
//Vector<SinsangDto>에서 Vector만 빼면 하나의 데이터만 의미할 수 있음
public SinsangDto getData(String num)
{
SinsangDto dto=new SinsangDto();
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
ResultSet rs=null;
String sql="select * from sinsang where num=?";
try {
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, num);
rs=pstmt.executeQuery();
//하나의 데이터 조회시 if / while써도 조회는 되지만 효율성 저하
if(rs.next())
{
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(rs, pstmt, conn);
}
return dto;
}
//수정...이름 주소 수정
public void updateSinsang(SinsangDto dto)
{
Connection conn=db.getConnection();
PreparedStatement pstmt=null;
String sql="update sinsang set name=?, addr=? where num=?";
try {
pstmt=conn.prepareStatement(sql);
//? 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setString(3, dto.getNum());
//실행
pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}finally {
db.dbClose(pstmt, conn);
}
}
}
출력과 조건을 java와 html을 섞어야하기 때문에 전부 jsp파일로
폼을 만드는 곳(db로 전송하는 곳)
-> form에 입력한 값을 action이 dto로 보내주고 그 값을 받아서 dao에 가서 실행
즉 이곳은 모든 CRUD파일의 시작점
sqltable create에서 num은 primary key로 줘서 auto num/date는 sql문에 자동 sysdate 하기 때문에 2가지만 값(name,addr)만 입력하면 됨
onclick="location.href=''" : onclick 기본 구조 / list.jsp로 이동
전송 버튼은 form에 입력된 값들을 dto->dao로 가게 해줌
목록을 누르면 list.jsp로 넘어가서 입력한 값이 제대로 전달 출력됐는지 확인 시켜줌
<tr>
<td colspan="2" align="center">
<input type="submit" value="전송" class="btn btn-info">
<%-- : onclick 기본 구조 / list.jsp로 이동 --%>
<input type="button" value="목록" onclick="location.href='list.jsp'"
class="btn btn-success">
</td>
</tr>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<body>
<%-- 출력과 조건을 java와 html을 섞어야하기 때문에 전부 jsp파일로 --%>
<%-- 폼을 만드는 곳(db로 전송하는 곳) --%>
<form action="insertAction.jsp" method="post">
<table class="table table-bordered" style="width: 400px;">
<%-- sqltable create에서 num은 primary key로 줘서 auto num/date는 sql문에 sysdate 하기 때문에 2가지만 입력하면 됨 --%>
<tr>
<th>이름</th>
<td>
<input type="text" name="name" style="width: 150px;" placeholder="이름입력"
required="required" class="form-control">
</td>
</tr>
<tr>
<th>주소</th>
<td>
<input type="text" name="addr" style="width: 250px;" placeholder="간단주소입력"
required="required" class="form-control">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="전송" class="btn btn-info">
<%-- : onclick 기본 구조 / list.jsp로 이동 --%>
<input type="button" value="목록" onclick="location.href='list.jsp'"
class="btn btn-success">
</td>
</tr>
</table>
</form>
</body>
</html>
updateform은 보통 insertform을 복사해서 만든다
수정할 사람의 조회메서드와 데이터가 필요하다(기존 값을 가져와야 수정이 되기 때문)
form의 시퀀스(sequence)인 num을 받아와서 dao 안에 있는 getData에 num을 넣어준다
<%
String num=request.getParameter("num");
SinsangDao dao=new SinsangDao();
SinsangDto dto=dao.getData(num);
%>
updateAction.jsp로 값들이 전달된다
<form action="updateAction.jsp" method="post">
hidden은 위치상관없다 폼 안에만 있으면 됨
num값은 보이지는 않지만 폼 안에 있어야 수정 가능 (23번이면 시퀀스 23번의 값을 가져와야 수정 가능)
<input type="hidden" name="num" value="<%=num%>">
수정할 사람의 이름과 주소를 가져와야 하기 때문에 value값으로 이름과 주소가 필요
이름
<tr>
<th>이름</th>
<td>
<%-- 수정할 사람의 이름과 주소를 가져와야 하기 때문에 value값으로 이름과 주소가 필요 --%>
<input type="text" name="name" style="width: 150px;"
value="<%=dto.getName()%>">
</td>
</tr>
주소
<tr>
<th>주소</th>
<td>
<input type="text" name="addr" style="width: 250px;"
value="<%=dto.getAddr()%>">
</td>
</tr>
<%@page import="model.sinsang.SinsangDto"%>
<%@page import="model.sinsang.SinsangDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<body>
<%-- updateform은 보통 insertform을 복사해서 만든다
수정할 사람의 조회메서드와 데이터가 필요하다(기존 값을 가져와야 수정이 되기 때문) --%>
<%
String num=request.getParameter("num");
SinsangDao dao=new SinsangDao();
SinsangDto dto=dao.getData(num);
%>
<%-- action도 updateAction으로 바꿔줘야함 --%>
<form action="updateAction.jsp" method="post">
<%-- hidden은 위치상관없다 폼 안에만 있으면 됨
num값은 보이지는 않지만 폼 안에 있어야 수정 가능 (23번이면 시퀀스 23번의 값을 가져와야 수정 가능) --%>
<input type="hidden" name="num" value="<%=num%>">
<table class="table table-bordered" style="width: 400px;">
<tr>
<th>이름</th>
<td>
<%-- 수정할 사람의 이름과 주소를 가져와야 하기 때문에 value값으로 이름과 주소가 필요 --%>
<input type="text" name="name" style="width: 150px;"
value="<%=dto.getName()%>">
</td>
</tr>
<tr>
<th>주소</th>
<td>
<input type="text" name="addr" style="width: 250px;"
value="<%=dto.getAddr()%>">
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="수정" class="btn btn-warning">
<input type="button" value="목록" onclick="location.href='list.jsp'"
class="btn btn-success">
</td>
</tr>
</table>
</form>
</body>
</html>
form을 처리하는 곳(값을 넘겨줄 곳)
//폼에 있는 name,addr
String name=request.getParameter("name");
String addr=request.getParameter("addr");
form에서 입력한 데이터를 dto로 묶어서 set 해줌
// 입력데이터를 dto로 묶어서
SinsangDto dto=new SinsangDto();
// 이름,주소 입력
dto.setName(name);
dto.setAddr(addr);
insert 메서드 호출
insert 메서드의 인자값인 dto를 호출하기 위해 생성
-> dao 생성해서 insert메소드 생성 그 메소드에 dto값을 넣어줌
-입력한 값을 dao(메서드 파일)에 있는 insert메서드에 값을 넣어서 사용
// dao 생성해서 insert메소드 생성 그 메소드에 dto값을 넣어줌 / 인자값인 dto를 호출하기 위해 생성
SinsangDao dao=new SinsangDao();
// 입력한 값을 dao에 넣어줌
dao.insertSinsang(dto);
출력 jsp로 이동(redirect)...url이 바뀜
request한 값을 response 하겠다 > url로 sendRedirect 해주겠다
redirect는 url을 바꿔줌
(값 입력해주고 전송 누르면 sqldeveloper 확인하면 값 입력됨)
이걸 안해주면 action파일에 남아있어서 오류
response.sendRedirect("list.jsp");
<%@page import="model.sinsang.SinsangDao"%>
<%@page import="model.sinsang.SinsangDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<body>
<%-- 폼을 처리하는 곳(값을 넘겨줄 곳) --%>
<%
//폼에 있는 name,addr
String name=request.getParameter("name");
String addr=request.getParameter("addr");
// 입력데이터를 dto로 묶어서
SinsangDto dto=new SinsangDto();
// 이름,주소 입력
dto.setName(name);
dto.setAddr(addr);
// insert메소드 호출 / 인자값인 dto를 호출하기 위해 생성
SinsangDao dao=new SinsangDao();
// 입력한 값을 dao에 넣어줌
dao.insertSinsang(dto);
//출력 jsp로 이동(redirect)...url이 바뀜
//request한 값을 response 하겠다 > url로 sendRedirect 해주겠다 / redirect는 url을 바꿔줌
//(값 입력해주고 전송 누르면 sqldeveloper 확인하면 값 입력됨)
//이걸 안해주면 action파일에 남아있어서 오류
response.sendRedirect("list.jsp");
%>
</body>
</html>
String num=request.getParameter("num");
String name=request.getParameter("name");
String addr=request.getParameter("addr");
SinsangDto dto=new SinsangDto();
SinsangDao dao=new SinsangDao();
dto의 set으로 폼에서 받아온 값은 수정
dto.setNum(num);
dto.setName(name);
dto.setAddr(addr);
dao.updateSinsang(dto);
값을 넣고 이동할 수 있어서 list.jsp로 고정해준다
response.sendRedirect("list.jsp");
<%@page import="model.sinsang.SinsangDao"%>
<%@page import="model.sinsang.SinsangDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<body>
<%
//데이터를 읽어서 dto에 넣기
String num=request.getParameter("num");
String name=request.getParameter("name");
String addr=request.getParameter("addr");
SinsangDto dto=new SinsangDto();
SinsangDao dao=new SinsangDao();
dto.setNum(num);
dto.setName(name);
dto.setAddr(addr);
dao.updateSinsang(dto);
response.sendRedirect("list.jsp");
%>
</body>
</html>
전송해서 sql table에 입력된 값을 여기에 출력해야함
dao를 생성해야 vector 생성 가능
-> Vector에 넣은 값들을 출력하기 때문에 vector 생성
<%
// dao를 생성해야 vector 생성 가능
SinsangDao dao=new SinsangDao();
// Vector에 넣은 값들을 출력해야하기 때문에 vector 생성
Vector<SinsangDto> list=dao.getAllDates();
%>
버튼으로 데이터 추가하기 위해 insertForm.jsp로 이동
<button type="button" class="btn btn-info"
onclick="location.href='insertForm.jsp'">데이터 추가</button>
번호는 갯수가 몇 개인지 띄운거지 sequence번호가 아님
나중에 데이터 추가 삭제할 곳
<table class="table table-bordered" style="width: 700px;">
<tr class="table-success" style="text-align: center;">
<%-- 번호는 갯수가 몇 개인지 띄운거지 sequence번호가 아님 --%>
<th width="60">번호</th>
<th width="100">이름</th>
<th width="250">주소</th>
<th width="250">날짜</th>
<%-- 나중에 데이터 추가 삭제할 곳 --%>
<th width="250">편집</th>
</tr>
모든 데이터들의 데이터 값마다 tr 반복되어야해서 for문 사용/컬렉션은 length아니고 size
<%
// 모든 데이터들의 데이터 값마다 tr 반복되어야해서 for문 사용/컬렉션은 length아니고 size
for(int i=0;i<list.size();i++)
{
//리스트에서 인덱스 값을 얻어서 dto(db에 담긴 값들)로 불러와야함
//list는 우리가 만든 컬렉션(Vector)
SinsangDto dto=list.get(i);
%>
출력문은 html을 사용해서 JAVA인 for문을 닫고 입력
%>
<%-- 출력 --%>
<tr>
<%-- 번호 / 보통은 시퀀스를 넣음 --%>
<td><%=i+1 %></td>
<%-- dto에 값이 모두 있기 때문에 get으로 얻어와야함 --%>
<td><%=dto.getName() %></td>
<td><%=dto.getAddr() %></td>
<td><%=dto.getSdate() %></td>
<td>
<button type="button" class="btn btn-info btn-sm"
onclick="location.href='updateForm.jsp?num=<%=dto.getNum() %>'">수정</button>
시퀀스 번호가 있어야하는데 location.href에 delete가 심어져야 삭제됨
delete.jsp? ?(멤버값을 이어주기 위해 사용) / ?는 이어진다는 뜻 그곳에 num(시퀀스)값을 dto에서 얻어와 삭제
<button type="button" class="btn btn-danger btn-sm"
onclick="location.href='delete.jsp?num=<%=dto.getNum() %>'">삭제</button>
</td>
</tr>
<%@page import="model.sinsang.SinsangDto"%>
<%@page import="java.util.Vector"%>
<%@page import="model.sinsang.SinsangDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<%
// dao를 생성해야 vector 생성 가능
SinsangDao dao=new SinsangDao();
// Vector에 넣은 값들을 출력해야하기 때문에 vector 생성
Vector<SinsangDto> list=dao.getAllDates();
%>
<body>
<%-- (전송해서 sql table에 입력된 값을 여기에 출력해야함) --%>
<button type="button" class="btn btn-info"
onclick="location.href='insertForm.jsp'">데이터 추가</button>
<br><br>
<table class="table table-bordered" style="width: 700px;">
<tr class="table-success" style="text-align: center;">
<%-- 번호는 갯수가 몇 개인지 띄운거지 sequence번호가 아님 --%>
<th width="60">번호</th>
<th width="100">이름</th>
<th width="250">주소</th>
<th width="250">날짜</th>
<%-- 나중에 데이터 추가 삭제할 곳 --%>
<th width="250">편집</th>
</tr>
<%
// 모든 데이터들의 데이터 값마다 tr 반복되어야해서 for문 사용/컬렉션은 length아니고 size
for(int i=0;i<list.size();i++)
{
//리스트에서 인덱스 값을 얻어서 dto(db에 담긴 값들)로 불러와야함
//list는 우리가 만든 컬렉션(Vector)
SinsangDto dto=list.get(i);
%>
<%-- 출력 --%>
<tr>
<%-- 번호 / 보통은 시퀀스를 넣음 --%>
<td><%=i+1 %></td>
<%-- dto에 값이 모두 있기 때문에 get으로 얻어와야함 --%>
<td><%=dto.getName() %></td>
<td><%=dto.getAddr() %></td>
<td><%=dto.getSdate() %></td>
<%-- 편집 / 수정 삭제 버튼 --%>
<td>
<button type="button" class="btn btn-info btn-sm"
onclick="location.href='updateForm.jsp?num=<%=dto.getNum() %>'">수정</button>
<%-- 시퀀스 번호가 있어야하는데 location.href에 delete가 심어져야 삭제됨
delete.jsp? ?(멤버값을 이어주기 위해 사용) / ?는 이어진다는 뜻 그곳에 num(시퀀스)값을 dto에서 얻어와 삭제--%>
<button type="button" class="btn btn-danger btn-sm"
onclick="location.href='delete.jsp?num=<%=dto.getNum() %>'">삭제</button>
</td>
</tr>
<%}
%>
</table>
</body>
</html>
getParameter로 얻어온 num은 list.jsp의 삭제 버튼에 있는 onclick에 ?옆에 있는 num
String num=request.getParameter("num");
SinsangDao dao=new SinsangDao();
dao.deleteSinsang(num);
삭제해도 그대로 list url에 남기 위해 사용
-> 이것을 사용 안하면 다른 곳으로 이동하기 때문에 막아준 것
response.sendRedirect("list.jsp");
<%@page import="model.sinsang.SinsangDto"%>
<%@page import="model.sinsang.SinsangDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Cute+Font&family=Diphylleia&family=Dokdo&family=Nanum+Brush+Script&family=Nanum+Gothic+Coding&family=Noto+Sans+KR&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<title>Insert title here</title>
</head>
<body>
<%
//삭제메서드 호출
//getParameter로 얻어온 num은 list.jsp의 삭제 버튼에 있는 onclick에 ?옆에 있는 num
String num=request.getParameter("num");
SinsangDao dao=new SinsangDao();
dao.deleteSinsang(num);
//리스트로 이동
response.sendRedirect("list.jsp");
%>
</body>
</html>