<14:30 5교시>
3교시에 하던거 이어 하기
web.xml 오류난거는 preference에서 xml (wild web devleoper) 에서 체크하고 apply
에러가 해결되지 않으면 project에서 clean
DbcpBean.java
package test.util;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DbcpBean {
//bean : 자바의 객체를 콩이라고도 함
//Connection 객체를 리턴해주는 메소드
public Connection getConn() {
Connection conn=null;
try {
//Tomcat 서버가 관리하는 Connection 객체를 하나 얻어와서 필드에 저장하는 작업하기
Context initContext = new InitialContext();
//Servers/context.xml 문서에 설정된 jdbc/myoracle 이라는 이름의 datasource를 얻어온다
Context envContext = (Context)initContext.lookup("java:/comp/env");
//얻어온 datasource 객체를 이용해서 Connection 객체의 참조값을 얻어와서 지역변수에 저장
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
conn = ds.getConnection();
//예외가 발생하지 않고 여기까지 실행의 흐름이 넘어온다면 성공
System.out.println("Connection 얻어오기 성공");
}catch(Exception e) {
e.printStackTrace();
}
return conn;
}
}
서버에서 DB에 빈번하게 왔다갔다 하게 될텐데, Connection을 빠르게 가져다 쓰고 반납하기 위한 구조가 위와 같음.
Connection을 가져왔다가 반납
톰캣 서버가 xml 문서에 명시된 설정을 읽어들여서 자신의 동작에 반영한다.
위에 있는 코딩들을 바꾸면 설정들이 바뀔 수 있음.
이미 완성된 있는 앱 설정의 내용을 바꾸는 것을 이클립스는 xml 로 바꿈.
xml 이나 json 문서로 바꾸게 됨.
텍스트 문서를 읽어들여서 동작을 반영.
DbcpBean 을 테스트 하는 test.jsp
<%@page import="test.util.DbcpBean"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% //dbcpbean 객체 이용해서 conneciton 객체 얻어오기
Connection conn = new DbcpBean().getConn();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>webapp/connection/test.jsp</title>
</head>
<body>
<div class="container">
<h1>connection test</h1> <!--이 앞의 문자열은 무조건 출력-->
<% if(conn!=null){ //conn이 null 이 아니면 여기에 있는 문자열이 클라이언트에게 출력%>
<p>Connection 객체를 성공적으로 얻어왔습니다</p>
<%}else{ //conn이 null이면 여기에 있는 문자열이 출력%>
<p>Connection 객체를 얻어오지 못했습니다</p>
<%} %>
</div>
</body>
</html>
<%
if(conn!=null)conn.close(); // close를 호출하면 Connection이 Pool에 반환됨
%>
MemberDto.java
package test.member.dto;
public class MemberDto {
private int num;
private String name;
private String addr;
public MemberDto() {}
public MemberDto(int num, String name, String addr) {
super();
this.num = num;
this.name = name;
this.addr = addr;
}
public int getNum() {
return num;
}
public void setNum(int 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;
}
}
Dao의 기본 틀이될 부분 만들기(window preference 등록)
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//Connection Pool 로 부터 Connection 객체 하나 가져오기
conn=new DbcpBean().getConn();
//실행할 sql 문 작성
String sql="""
""";
pstmt=conn.prepareStatement(sql);
// ? 에 값 바인딩할게 있으면 여기서 하기
//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
rs=pstmt.executeQuery();
while(rs.next()) {
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)rs.close();
if (pstmt != null)pstmt.close();
if (conn != null)conn.close();
} catch (Exception e) {}
}
<15:30 6교시>
MemberDao.java
package test.member.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import test.member.dto.MemberDto;
import test.util.DbcpBean;
public class MemberDao {
//회원 목록을 리턴하는 메소드
public List<MemberDto> getList(){
List<MemberDto> list=new ArrayList<>();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//Connection Pool 로 부터 Connection 객체 하나 가져오기
conn=new DbcpBean().getConn();
//실행할 sql 문 작성
String sql="""
SELECT num, name, addr
FROM member
ORDER BY num ASC
""";
pstmt=conn.prepareStatement(sql);
// ? 에 값 바인딩할게 있으면 여기서 하기
//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
rs=pstmt.executeQuery();
while(rs.next()) {
// 커서가 위치한 곳의 칼럼 내용을 읽어와서 dto 에 저장
MemberDto dto=new MemberDto();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
//회원 한명의 정보가 담긴 dto 를 List 객체에 누적 시키기
list.add(dto);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)rs.close();
if (pstmt != null)pstmt.close();
if (conn != null)conn.close();
} catch (Exception e) {}
}
//List 객체 리턴하기
return list;
}// getList()
}// class
list.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//memberdao 객체를 이용해서 회원 목록 얻어오기
MemberDao dao=new MemberDao();
List<MemberDto> list = dao.getList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<a href="insertform.jsp">회원추가</a>
<!-- href="/Step02DataBase/member/insertform.jsp"라고 해도 되고 -->
<!-- href="${pageContext.request.contextPath}/member/insertform.jsp" 라고 해도 됨, 그리고 나중에 실제 개발을 하게 되면 이걸 쓰게 됨-->
<h1>회원 목록</h1>
<table>
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>주소</th>
</tr>
</thead>
<tbody>
<%
for (MemberDto tmp:list){ %>
<tr>
<td><%=tmp.getNum() %></td>
<td><%=tmp.getName() %></td>
<td><%=tmp.getAddr() %></td>
</tr>
<% }%>
</tbody>
</table>
</div>
</body>
</html>
cpath + tab을 누르면 자동완성되게 만들기
insertform.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>
<div class="container">
<h1>회원추가폼</h1>
<form action="${pageContext.request.contextPath}/member/insert.jsp" method="post">
<div>
<label for="name">이름</label>
<input type="text" name = "name" id="name" placeholder="이름 입력..."/>
</div>
<div>
<label for="addr">주소</label>
<input type="text" name="addr" id="addr" placeholder="주소 입력..."/>
</div>
<button type = "submit">저장</button>
</form>
</div>
</body>
</html>
<16:30 7교시>
memberdao 편집
package test.member.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import test.member.dto.MemberDto;
import test.util.DbcpBean;
public class MemberDao {
//회원 한명의 정보를 추가하고 성공 여부를 리턴하는 메소드
public boolean insert(MemberDto dto) {
Connection conn=null;
PreparedStatement pstmt=null;
int rowCount=0;
try {
conn=new DbcpBean().getConn();
//실행할 미완성의 sql문
String sql = """
insert into member
(num,name,addr)
Values(member_seq.Nextval, ?,?)
""";
pstmt=conn.prepareStatement(sql);
//?에 값 바인딩하는 곳 여기
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//sql문 실행하고 변화된 row 갯수 리턴받기
rowCount=pstmt.executeUpdate();
}catch(Exception e) {e.printStackTrace();}
finally {
try {
if(conn!=null)conn.close();
if(pstmt!=null)pstmt.close();
}catch(Exception e) {}
if(rowCount>0) {return true;}else {return false;}
}
}
//회원 목록을 리턴하는 메소드
public List<MemberDto> getList(){
List<MemberDto> list=new ArrayList<>();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//Connection Pool 로 부터 Connection 객체 하나 가져오기
conn=new DbcpBean().getConn();
//실행할 sql 문 작성
String sql="""
SELECT num, name, addr
FROM member
ORDER BY num ASC
""";
pstmt=conn.prepareStatement(sql);
// ? 에 값 바인딩할게 있으면 여기서 하기
//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
rs=pstmt.executeQuery();
while(rs.next()) {
// 커서가 위치한 곳의 칼럼 내용을 읽어와서 dto 에 저장
MemberDto dto=new MemberDto();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
//회원 한명의 정보가 담긴 dto 를 List 객체에 누적 시키기
list.add(dto);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)rs.close();
if (pstmt != null)pstmt.close();
if (conn != null)conn.close();
} catch (Exception e) {}
}
//List 객체 리턴하기
return list;
}// getList()
}// class
insert.jsp
<%@page import="test.member.dao.MemberDao"%>
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 폼으로 전송되는 이름과 주소를 추출
String name=request.getParameter("name");
String addr=request.getParameter("addr");
//2. MemberDto 객체에 담기
MemberDto dto = new MemberDto();
dto.setName(name);
dto.setAddr(addr);
//3. DB에 저장하기
MemberDao dao=new MemberDao();
boolean isSuccess=dao.insert(dto);
//4. 응답하기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<%if(isSuccess){%>
<p><strong><%=name %></strong>님의 정보를 저장했습니다.</p>
<a href="list.jsp">목록보기</a>
<%}else{%>
<p>데이터 저장 실패</p>
<a href="insertform.jsp">다시 작성</a>
<%}%>
</div>
</body>
</html>
이름머해 ㅋㅋㅋㅋ 이름 입력해서 저장
삭제기능 추가 직전 list.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//memberdao 객체를 이용해서 회원 목록 얻어오기
MemberDao dao=new MemberDao();
List<MemberDto> list = dao.getList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<a href="insertform.jsp">회원추가</a>
<!-- href="/Step02DataBase/member/insertform.jsp"라고 해도 되고 -->
<!-- href="${pageContext.request.contextPath}/member/insertform.jsp" 라고 해도 됨, 그리고 나중에 실제 개발을 하게 되면 이걸 쓰게 됨-->
<h1>회원 목록</h1>
<table>
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>주소</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<%
for (MemberDto tmp:list){ %>
<tr>
<td><%=tmp.getNum() %></td>
<td><%=tmp.getName() %></td>
<td><%=tmp.getAddr() %></td>
<td><a href="delete.jsp?num=<%=tmp.getNum()%>">삭제</a></td>
</tr>
<% }%>
</tbody>
</table>
</div>
</body>
</html>
삭제기능 추가한 MemberDao
package test.member.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import test.member.dto.MemberDto;
import test.util.DbcpBean;
public class MemberDao {
//회원 한명의 정보를 삭제하고 성공 영부를 리턴하는 메소드
public boolean delete(int num) {
Connection conn = null;
PreparedStatement pstmt = null;
int rowCount = 0;
try {
conn = new DbcpBean().getConn();
//실행할 미완성의 sql 문
String sql = """
delete from member
where num=?
""";
pstmt = conn.prepareStatement(sql);
// ? 에 값을 여기서 바인딩한다.
pstmt.setInt(1, num);
// sql 문 실행하고 변화된 row 의 갯수 리턴받기
rowCount = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
if (pstmt != null)
pstmt.close();
} catch (Exception e) {
}
}
if (rowCount > 0) {
return true;
} else {
return false;
}
}
//회원 한명의 정보를 추가하고 성공 여부를 리턴하는 메소드
public boolean insert(MemberDto dto) {
Connection conn=null;
PreparedStatement pstmt=null;
int rowCount=0;
try {
conn=new DbcpBean().getConn();
//실행할 미완성의 sql문
String sql = """
insert into member
(num,name,addr)
Values(member_seq.Nextval, ?,?)
""";
pstmt=conn.prepareStatement(sql);
//?에 값 바인딩하는 곳 여기
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
//sql문 실행하고 변화된 row 갯수 리턴받기
rowCount=pstmt.executeUpdate();
}catch(Exception e) {e.printStackTrace();}
finally {
try {
if(conn!=null)conn.close();
if(pstmt!=null)pstmt.close();
}catch(Exception e) {}
if(rowCount>0) {return true;}else {return false;}
}
}
//회원 목록을 리턴하는 메소드
public List<MemberDto> getList(){
List<MemberDto> list=new ArrayList<>();
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
try {
//Connection Pool 로 부터 Connection 객체 하나 가져오기
conn=new DbcpBean().getConn();
//실행할 sql 문 작성
String sql="""
SELECT num, name, addr
FROM member
ORDER BY num ASC
""";
pstmt=conn.prepareStatement(sql);
// ? 에 값 바인딩할게 있으면 여기서 하기
//sql 문 실행하고 결과를 ResultSet 객체로 리턴받기
rs=pstmt.executeQuery();
while(rs.next()) {
// 커서가 위치한 곳의 칼럼 내용을 읽어와서 dto 에 저장
MemberDto dto=new MemberDto();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setAddr(rs.getString("addr"));
//회원 한명의 정보가 담긴 dto 를 List 객체에 누적 시키기
list.add(dto);
}
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null)rs.close();
if (pstmt != null)pstmt.close();
if (conn != null)conn.close();
} catch (Exception e) {}
}
//List 객체 리턴하기
return list;
}// getList()
}// class
삭제기능 추가된 list.jsp
<%@page import="test.member.dto.MemberDto"%>
<%@page import="java.util.List"%>
<%@page import="test.member.dao.MemberDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//memberdao 객체를 이용해서 회원 목록 얻어오기
MemberDao dao=new MemberDao();
List<MemberDto> list = dao.getList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<a href="insertform.jsp">회원추가</a>
<!-- href="/Step02DataBase/member/insertform.jsp"라고 해도 되고 -->
<!-- href="${pageContext.request.contextPath}/member/insertform.jsp" 라고 해도 됨, 그리고 나중에 실제 개발을 하게 되면 이걸 쓰게 됨-->
<h1>회원 목록</h1>
<table>
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>주소</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<%
for (MemberDto tmp:list){ %>
<tr>
<td><%=tmp.getNum() %></td>
<td><%=tmp.getName() %></td>
<td><%=tmp.getAddr() %></td>
<td><a href="delete.jsp?num=<%=tmp.getNum()%>">삭제</a></td>
</tr>
<% }%>
</tbody>
</table>
</div>
</body>
</html>
<17:30 8교시>
수정기능 만들기
삽질의 시작
계획을 세워봤다.
1. 수정한 내용을 입력할 폼만들기
2. 수정할 내용이 입력된 row에 update 하기.
3. 입력된 수정 내용을 데이터베이스에 저장하기
1. updateform.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>
<div class="container">
<h1>회원추가폼</h1>
<form action="${pageContext.request.contextPath}/member/update.jsp" method="post">
<div>
<label for="name">이름</label>
<input type="text" name = "name" id="name" placeholder="이름 입력..."/>
</div>
<div>
<label for="addr">주소</label>
<input type="text" name="addr" id="addr" placeholder="주소 입력..."/>
</div>
<button type = "submit">수정</button>
</form>
</body>
</html>
2. 어쨋든 높은 확률로 MemberDao의 부분 삽질코드 1차
//회원 한명의 정보를 수정하고 성공여부를 리턴하는 메소드
public boolean update(MemberDto dto) {
Connection conn=null;
PreparedStatement pstmt=null;
int rowCount=0;
try {
conn =new DbcpBean().getConn();
String sql="""
update member
set name=?, addr=?
where num=?
""";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setInt(3, dto.getNum());
}catch(Exception e) {
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {
}
if(rowCount>0) {
return true;
}else {return false;}
}
}
3. 높은 확률로 삽질인 update.jsp의 코드 1차
<%@page import="test.member.dao.MemberDao"%>
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 폼으로 전송되는 이름과 주소를 추출
String name=request.getParameter("name");
String addr=request.getParameter("addr");
//2. MemberDto 객체에 담기
MemberDto dto = new MemberDto();
dto.setName(name);
dto.setAddr(addr);
//3. DB에 수정하기
MemberDao dao=new MemberDao();
boolean isSuccess=dao.update(dto);
//4. 응답하기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<%if(isSuccess){%>
<p>정보를 수정했습니다.</p>
<a href="list.jsp">목록보기</a>
<%}else{%>
<p>데이터 수정 실패</p>
<a href="updateform.jsp">다시 작성</a>
<%}%>
</div>
</body>
</html>
수정 기능을 실행해보니까 입력할 수 있는 폼은 만들었는데, 몇 번째 라인의 번호인지를 읽어들이지 않아서 수정 실패했음.
그래서 아까 delete 기능에 있던 int num = Integer.parseInt(request.getParameter("num")); 이 코드를 가져와 봄.
결국 삽질 모음 아래 모아놓고 가자...
<%@page import="test.member.dao.MemberDao"%>
<%@page import="test.member.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//수정할 정보의 번호 가져오기
int num = Integer.parseInt(request.getParameter("num"));
//1. 폼으로 전송되는 이름과 주소, 선택된 row 번호를 추출
String name=request.getParameter("name");
String addr=request.getParameter("addr");
//2. MemberDto 객체에 담기
MemberDto dto = new MemberDto();
dto.setNum(num);
dto.setName(name);
dto.setAddr(addr);
//3. DB에 수정하기
MemberDao dao=new MemberDao();
boolean isSuccess=dao.update(dto);
//4. 응답하기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<%if(isSuccess){%>
<p>정보를 수정했습니다.</p>
<a href="list.jsp">목록보기</a>
<%}else{%>
<p>데이터 수정 실패</p>
<a href="updateform.jsp">다시 작성</a>
<%}%>
</div>
</body>
</html>
<%@ 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>
<div class="container">
<h1>회원추가폼</h1>
<div>
<label for="num" id="num"></label>
</div>
<form action="${pageContext.request.contextPath}/member/update.jsp" method="post">
<div>
<label for="name">이름</label>
<input type="text" name = "name" id="name" placeholder="이름 입력..."/>
</div>
<div>
<label for="addr">주소</label>
<input type="text" name="addr" id="addr" placeholder="주소 입력..."/>
</div>
<button type = "submit">수정</button>
</form>
</body>
</html>
//수정할 정보를 일시 저장할 dto 만들기
public MemberDto tmpsave(MemberDto dto){
}
//회원 한명의 정보를 수정하고 성공여부를 리턴하는 메소드
public boolean update(MemberDto dto) {
Connection conn=null;
PreparedStatement pstmt=null;
int rowCount=0;
try {
conn =new DbcpBean().getConn();
String sql="""
update member
set name=?, addr=?
where num=?
""";
pstmt= conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getAddr());
pstmt.setInt(3, dto.getNum());
}catch(Exception e) {
}finally {
try {
if(pstmt!=null)pstmt.close();
if(conn!=null)conn.close();
}catch(Exception e) {
}
if(rowCount>0) {
return true;
}else {return false;}
}
}
'공부의 기록 > 자바 풀 스택 : 수업내용정리' 카테고리의 다른 글
자바 풀 스택 1/7 오후 기록 032-2 (0) | 2025.01.07 |
---|---|
자바 풀 스택 1/7 오전 기록 032-1 (0) | 2025.01.07 |
자바 풀 스택 1/6 오전 기록 031-1 (0) | 2025.01.06 |
자바 풀 스택 1/3 오전 기록 030-1 (1) | 2025.01.03 |
자바 풀 스택 1/2 오후 기록 029-2 (1) | 2025.01.02 |