JSP Project 사전작업 및 설명

DTO(Data Transfer Object)

특정테이블의 정보를 단위별로 정의한 클래스
특정변수와 setter,getter로만 이루어짐

DAO(Data Access Object)

데이타베이스에 접속,명령전송전담 클래스(메서드)
DB CRUD

1.db생성
2.dto
3.dao
4.form.jsp 입력폼
5.action.jsp : 데이타를 읽어서 db에 저장한후 목록으로 이동
6.list.jsp

JspProject 추가

  1. JspProject -> WEB-INF -> lib -> ojdbc11.jar 추가
  2. src/main/java -> oracle.db 패키지 생성 -> DBConnect.java 추가
    패키지에 . 찍는 이유는 처음부터 끝으로 통해서 가겠다라는 표시

다른 친구 정리(CRUD)

  • 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/eclipse 연동해서 eclipse로 CRUD하기

oracle에서는 table 생성만 한다

sql 문

--int 사용x int로 받아오면 String으로 매번 캐스팅해줘야하기 때문
create table sinsang(num number(5) primary key,
name varchar2(20),
addr varchar2(30),
sdate date);

select * from sinsang;

DBConnect

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();
		}
	}

}

Project Explorer 형태

DTO - SinsangDto.java

멤버(private)만 만드는곳 / setter getter로 받으면 돼서 private 사용

변수는 sqltable과 선언한 이름은 다르게 해도 되지만 같게하면 알아보기 쉬어서 같게 함/Spring에서는 무관

date

주의 - Timestamp 무조건 sql로 security하면 에러 나옴

//Timestamp 무조건 sql로 security하면 에러 나옴
private Timestamp sdate;

DTO - SinsangDto.java

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;
	}
}

DAO - SinsangDao.java

CRUD를 만드는 곳
db에 저장하고 전송하는 역할

전역변수로 db 호출

insert

db서버에 전체를 넘겨야함(전송)

메서드에 void를 준 이유는 출력문이 아니라서 void

인자값으로 dto를 준 이유는 모든 데이터를 dto에 넣어서 줌

  • 시온이 정리 : insert에 해당하는 sql문을 작성해 prepareStatement를 통해 넘겨준다

바인딩

?준 곳에 값을 넣어줘야함
dto.get~~()는 미리 만들어준 메서드이고 값을 넣는건 action탭에서 넣어줌

// 값 담아주고 바인딩
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//실행
pstmt.executeUpdate();
  • insert 메서드
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

컬렉션(vector,list)

  • 주의list<> **=new list<>(); 안됨

방대한 양의 db를 넣기 위해서 컬렉션 생성

Vector<SinsangDto> list=new Vector<SinsangDto>();

while

여러 개의 데이터를 얻을 경우 사용
(즉, 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);
}

while문 안 dto 선언

set(값을 넣어줌,수정해줌)해준 후 list에 추가해줘야하기 때문

//while문 안에서 dto 선언 / set해준 후 list에 추가해줘야하기 때문
SinsangDto dto=new SinsangDto();

getString("컬럼명")

db에 있는 컬러명 사용

// getString("컬럼명") - db에 있는 컬럼명
dto.setNum(rs.getString("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
dto.setSdate(rs.getTimestamp("sdate"));

set한 값들을 벡터에 추가

// set한 값들 벡터에 추가
	list.add(dto);
  • select 메서드
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;
	}

delete

db(sql)에서 삭제하기 위해서는 sequence번호가 필요하다
그 sequence 번호를 num으로 지정해줬기 때문에 인자 값으로 String num을 준다

->sequence(num)만 필요하기 때문에 굳이 dto가 필요없음 / 효율적으로 하기 위해서 num만 넣음

sql문 num

// 여기 있는 num은 deleteSinsang의 파라메터로 넘어온것
String sql="delete from sinsang where num=?";

-> delete.jsp 가보면 값을 넘겨줌

  • delete 메서드
//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);
		}
	}

update

수정...이름 주소 수정

수정할때는 시퀀스 번호 1개만 필요하기 때문에 getData라는 메서드 하나를 추가한다

update폼에 입력한 데이터를 dto 통해서 값을 받아오기 때문에 dto.get~~()

  • update 메서드
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);
		}
	}

getdata

수정하기 위해 시퀀스(sequence) 단 하나만 필요하기 때문에 data라는 메서드 생성

if

하나의 데이터만을 조회시 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"));
}
  • getData 메서드
	//하나의 데이터 조회
	//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;
	}

DAO - SinsangDao.java

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);
		}
	}
}

Form - insertForm.jsp

출력과 조건을 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>

Form - insertForm.jsp

<%@ 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>

Form - updateForm.jsp

updateform은 보통 insertform을 복사해서 만든다
수정할 사람의 조회메서드와 데이터가 필요하다(기존 값을 가져와야 수정이 되기 때문)

자바문 선언

form의 시퀀스(sequence)인 num을 받아와서 dao 안에 있는 getData에 num을 넣어준다

<%
	String num=request.getParameter("num");
	SinsangDao dao=new SinsangDao();
	SinsangDto dto=dao.getData(num);
%>

action 이동

updateAction.jsp로 값들이 전달된다

<form action="updateAction.jsp" method="post">

input num

hidden은 위치상관없다 폼 안에만 있으면 됨
num값은 보이지는 않지만 폼 안에 있어야 수정 가능 (23번이면 시퀀스 23번의 값을 가져와야 수정 가능)

<input type="hidden" name="num" value="<%=num%>">

value

수정할 사람의 이름과 주소를 가져와야 하기 때문에 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>

Form - updateForm.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>
<%-- 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>

Action - insertAction.jsp

form을 처리하는 곳(값을 넘겨줄 곳)

request.getParameter

//폼에 있는 name,addr
String name=request.getParameter("name");
String addr=request.getParameter("addr");

SinsangDto dto=new SinsangDto()

form에서 입력한 데이터를 dto로 묶어서 set 해줌

// 입력데이터를 dto로 묶어서
SinsangDto dto=new SinsangDto();
// 이름,주소 입력
dto.setName(name);
dto.setAddr(addr);

SinsangDao dao=new SinsangDao()

insert 메서드 호출
insert 메서드의 인자값인 dto를 호출하기 위해 생성
-> dao 생성해서 insert메소드 생성 그 메소드에 dto값을 넣어줌

-입력한 값을 dao(메서드 파일)에 있는 insert메서드에 값을 넣어서 사용

// dao 생성해서 insert메소드 생성 그 메소드에 dto값을 넣어줌 / 인자값인 dto를 호출하기 위해 생성
SinsangDao dao=new SinsangDao();
// 입력한 값을 dao에 넣어줌
dao.insertSinsang(dto);

response.sendRedirect("")

출력 jsp로 이동(redirect)...url이 바뀜
request한 값을 response 하겠다 > url로 sendRedirect 해주겠다
redirect는 url을 바꿔줌
(값 입력해주고 전송 누르면 sqldeveloper 확인하면 값 입력됨)
이걸 안해주면 action파일에 남아있어서 오류

response.sendRedirect("list.jsp");

Action - insertAction.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>

Action - updateAction.jsp

update폼값 받아오기

String num=request.getParameter("num");
String name=request.getParameter("name");
String addr=request.getParameter("addr");

Dto,Dao 생성

SinsangDto dto=new SinsangDto();
SinsangDao dao=new SinsangDao();

값 설정

dto의 set으로 폼에서 받아온 값은 수정

dto.setNum(num);
dto.setName(name);
dto.setAddr(addr);

설정한 값 update메소드에 넣기

dao.updateSinsang(dto);

url 고정

값을 넣고 이동할 수 있어서 list.jsp로 고정해준다

response.sendRedirect("list.jsp");

Action - updateAction.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>

브라우저 출력 - list.jsp

전송해서 sql table에 입력된 값을 여기에 출력해야함

SinsangDao dao=new SinsangDao()

dao를 생성해야 vector 생성 가능
-> Vector에 넣은 값들을 출력하기 때문에 vector 생성

<%
	// dao를 생성해야 vector 생성 가능
	SinsangDao dao=new SinsangDao();
	// Vector에 넣은 값들을 출력해야하기 때문에 vector 생성
	Vector<SinsangDto> list=dao.getAllDates();
%>

button

버튼으로 데이터 추가하기 위해 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>

for문

모든 데이터들의 데이터 값마다 tr 반복되어야해서 for문 사용/컬렉션은 length아니고 size

for문 안 dto

<%
	// 모든 데이터들의 데이터 값마다 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>

브라우저 출력 - list.jsp

<%@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>

브라우저 내 삭제 - delete.jsp

삭제메서드 호출

getParameter로 얻어온 num은 list.jsp의 삭제 버튼에 있는 onclick에 ?옆에 있는 num

String num=request.getParameter("num");
SinsangDao dao=new SinsangDao();
dao.deleteSinsang(num);

list.jsp로 이동

삭제해도 그대로 list url에 남기 위해 사용
-> 이것을 사용 안하면 다른 곳으로 이동하기 때문에 막아준 것

response.sendRedirect("list.jsp");

브라우저 내 삭제 - delete.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>
profile
백엔드 개발자로서 성장해 나가는 성현이의 블로그~

0개의 댓글