2022. 10. 7. 17:15ㆍDev.Program/JSP & Javascript
deleteForm.jsp / deletePro.jsp 만들기
Class.forName("com.mysql.jdbc.Driver"); String dbUrl="jdbc:mysql://localhost:3306/jspdb1"; String dbUser="root"; String dbPass="1234"; Connection con=DriverManager.getConnection(dbUrl, dbUser, dbPass); String sql="select * from board where num = ?"; PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setInt(1, num); ResultSet rs=pstmt.executeQuery(); |
이런 반복되는 코드들을 줄이고 싶다!
- JSP는 함수를 만들 수 없기 때문에 계속 반복됨.
- 반복되는 코드들을 자바단으로 분리되게끔
(계속 반복되지 않고, 필요할 때마다 함수를 불러다 쓰게끔)
< 자바단으로 분리 >
1단계 : DB 작업만 분리(insert 기능 묶어서 따로, update 기능 묶어서 따로… )
최종 : DB 와 처리작업들도 분리
request로 값을 들고 올 때 문제가 됨! insert 기능 묶어놓은 함수에 전달을 시켜줄 때, 값이 여러개 있으면 코드가 길어서 힘들다. 값을 하나로 묶어서 한꺼번에 전달시켜줌(바구니로 묶어서 바구니만 전달해주는 것) → 이 값(데이터)도 자바로 묶어줌!
**함수는 리턴값이 1개 밖에 안되기 때문에 값을 리턴할 때도 묶어서 보내줘야함
⇒ DB 작업하는 파일 하나 : class
⇒ 값을 넘겨주는 파일 하나(데이터를 받아서 전달시켜주는 역할) : 자바빈(바구니역할)
- jsp6 폴더 만들어주기
- beanForm1.jsp / beanPro1.jsp 새 문서 만들기
- beanForm1.jsp
- 일단 아이디 값 하나만 입력!
디비 연결 insert id, pass, name, reg_date ... => 자바파일 insert 메서드()
- beanPro1.jsp
// id, pass, name, reg_date => 자바파일 insert 메서드(id, pass, name, reg_date) 데이터 전달
// id, pass, name, reg_date 내용을 한 군데 담아서 -> 자바파일 insert 메서드(한군데담은것)
⇒ id, pass… 점점 많이 지면 복잡해지니까 한군데에 담아서 이렇게 간단하게 해줄 거!
// 파라미터 한군데 담는 것을 자바파일로 준비
// 디비 연결 insert id, pass, name, reg_date ... => 자바파일 insert 메서드()
- 자바 파일들 담는 곳
- JSP 파일 (이미지 등등 전부) 담는 곳
- 자바는 java resource 안에 src 안에 만들거.
- JavaResource 안에 src 안에 폴더 패키지 jsp6 파일이름 BeanTest1
- 만들면 이렇게 나옴!
- class에는 멤버변수와 메서드() 등등이 들어갈 수 있다!
private String id; ⇒ 데이터 은닉화! private
id 를 접근할 수 있는 메서드() 를 만들어줘야함. (set() get() 메서드)
- 아무나 접근할 수 없기 때문.
데이터를 하나의 묶음으로 만들어서 은닉을 시켜놓고 set, get 이라는 통로를 만들어서 데이터가 오고가도록!
// 메서드() set() 값을 저장하는거 get() 값을 가져오는거
// 자동완성 : Alt + Shift + S -> R
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
class 는 컴퓨터 내에 기억장소가 확보되어있지 않다! ⇒ class 가 수십개가 있을텐데 처음부터 기억장소가 확보되면, 기억장소 부하가 많이 걸리기 때문.
처음에는 정의만 되어있고, 쓸 때 하나씩 불러서 사용. ⇒ 기억장소 할당!
BeanPro1.jsp 화면으로 돌아가서
BeanTest1 => 기억장소 할당(=객체생성)
- setId() 메서드를 호출해서 id변수 내용을 BeanTest1의 멤버변수 id에 값 저장
자바파일 만들고, get() set()을 통해 jsp 화면에서 객체생성해서 호출할 수 있도록
- 객체생성 동작? 원리 이해하기!
< BeanTest1.java >
javabean = javaDTO
class 는 컴퓨터 내에 기억장소가 확보되어있지 않다! ⇒ class 가 수십 개가 있을텐데 처음부터 기억장소가 확보되면, 기억장소 부하가 많이 걸리기 때문.
처음에는 정의만 되어있고, 쓸 때 하나씩 불러서 사용. ⇒ 기억장소 할당!
< BeanPro1.jsp >
내가 만든 클래스형(=BeanTest1) 선언
BeanTest1 bt1 = new BeanTest1(); |
⇒ bt1이라는 생성자를 호출해서 기억장소할당(=객체 생성)
⇒ 왼쪽의 기억장소(=bt1)에는 하나의 값만 저장할 수 있기 때문에 Heap이라는 공간의 데이터 내용들을 주소값으로 들고와서 왼쪽의 기억장소에 전달(주소값을 전달!)
- private로 막아놔서 이렇게 바로 못 불러옴.(오류!)
- set() 메서드를 통해 id 값을 불러옴. (처음에는 null 값이 들어가있다.)
out.println("자바빈에 저장된 id값 : " + bt1.getId()); |
- id 값 호출해서 실행시켜봄.
- 실행창
# 혹시나 에러가 뜬다면 인식을 못해서 그럼
- Clean을 한 번 해주거나 서버를 닫고 다시 켜보기!
DB → 디비도 똑같이 자바 파일로 만들거! 패키지 JSP6 에 DAOTest1.java
- Data Access(데이터에 접근해서 디비 작업만 하는.. DAO)
- insert() 메서드()
- 패키지 JSP6 에 DAOTest1.java 만들기
insert() 메서드()
< 기본 문법 >
접근지정자 리턴할형 메서드이름(전달받을 변수) {
처리할 내용
return 리턴할 값;
}
- insert 구문은 리턴할 형이 없고 리턴할 값이 없음.
< DAOTest1.java >
public void insert(String id, String pass, String name, Timestamp reg_date) { [return;] } |
- 하나씩 따로 받는다면 이렇게 하면 됨.
- 근데 전달받을 변수가 email, num 등등 점점 많아진다면 계속 추가해줘야됨(비효율적)
public void insert(BeanTest1 bt1) { [return;] } |
- BeanTest1 형의 bt1에 담아서 전달받을 변수들을 한 번에 가져올 거
< beanPro1.jsp > 로 가서 호출하기
- 그냥 호출하면 오류남!
- ctrl + space 해서 import 해주기
- 임포트하면 오류 없어짐
기억장소에 접근할 수 있는 주소값을 알려주는게 효율적! 주소값을 통해 기억장소를 찾아가서 찾고싶은 값(ex) id)을 가져오도록 하는거.
dt1.insert(bt1); ← 주소값 전달(call by reference)
# 값을 전달하는 건 call by value
<h1>beanPro1.jsp</h1> <%@page import="jsp6.beanTest1"%><% request.setCharacterEncoding("utf-8"); String id = request.getParameter("id"); // beanTest1 ⇒ 기억장소 할당, 객체 생성 beanTest1 bt1 = new beanTest1(); //import! //private String →set메서드로 접근 //setId() 메서드 호출 id변수 내용을 BeanTest1 멤버변수 id에 값 저장 bt1.setId(id); out.println("자바빈에 저장된 id값: "+bt1.getId()); // 디비연결 insert id, pass, name, reg_date,,,, -> 자바파일 insert메서드() // 자바 패키지 jsp6 DAOTest1 : data acess 데이터 접근 파일 -> insert()메서드 // DAOTest1 기억장소 할당--> 객체 생성 --> insert()호출 DAOTest1 dt1 = new DAOTest1(); dt1.insert(bt1); %> </body> |
< DAOTest1.java >
package jsp6; public class DAOTest1 { public void insert(BeanTest1 bt1) { ⇒ 여기에 BeanTest1 bt1 라는 주소값 전달 System.out.println("DAOTest1 insert()메서드에서 받아온 id : " + bt1.getId()); return; } } |
- beanForm1.jsp 부터 실행해서 확인해보기!
- beanForm1.jsp 실행창
- beanPro1.jsp 실행창
- 콘솔창에도 이렇게 뜨는 걸 확인할 수 있다.(2번 실행해서 2번 뜬거)
- jsp6 파일에 beanForm2.jsp / beanPro2.jsp 만들기
<form action="beanPro2.jsp" method="post"> 아이디 : <input type="text" name="id"><br> 나이 : <input type="text" name="age"><br> <input type="submit" value="회원가입"> |
- 앞과 똑같이 연습해보기(이번엔 id 와 age 가져오기)
jsp6 패키지에 BeanTest2.java랑 DAOTest2.java 만들기.
< beanPro2.jsp >
<h1>WebContent/jsp6/beanPro2.jsp</h1> <% request.setCharacterEncoding("utf-8"); String id = request.getParameter("id"); int age = Integer.parseInt(request.getParameter("age")); BeanTest2 bt2 = new BeanTest2(); bt2.setId(id); bt2.setAge(age); out.println("자바빈에 저장된 id값 : " + bt2.getId()); out.println("자바빈에 저장된 age값 : " + bt2.getAge()); DAOTest2 dt2 = new DAOTest2(); dt2.insert(bt2); %> |
< BeanTest2 >
package jsp6; public class BeanTest2 { private String id; private int age; public String getId() { return id; } public void setId(String id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } |
< beanPro2.jsp >
<h1>WebContent/jsp6/beanPro2.jsp</h1> <% request.setCharacterEncoding("utf-8"); String id = request.getParameter("id"); int age = Integer.parseInt(request.getParameter("age")); BeanTest2 bt2 = new BeanTest2(); bt2.setId(id); bt2.setAge(age); out.println("자바빈에 저장된 id값 : " + bt2.getId()); out.println("자바빈에 저장된 age값 : " + bt2.getAge()); DAOTest2 dt2 = new DAOTest2(); dt2.insert(bt2); %> |
- beanForm2.jsp 실행창
- beanPro2.jsp 실행창
- 콘솔창
< JSP 자체 태그 > - JAVA 이용하지 않고, JSP 자체로
p.245 - 자바빈
p.249 - 자바빈 객체를 생성하는 액션태그
- 자바빈을 이용하면 request, new 객체생성, set메서드 한번에 할 수 있다.
- request. 로 하는 코드가 10개 20개가 있어도 한번에 할 수 있다!
- set메서드()도 한 번에 할 수 있다! ⇒ 코드가 2줄이면 끝나버림~~
- 그럼 코드가 줄어듬!
- JSP 일 때만 사용가능(JAVA로 넘어가면 못 쓴다) : JSP 단에서 쓸수있다.
<jsp:setProperty property="*" name="bt22"/> |
⇒ 위에 두 줄을 이렇게 한 줄로 코드를 줄일 수 있다!
⇒ 형 변환도 자동으로 해줌
- 파라미터 이름이 동일 할 경우 * 로 줄일 수 있다
- 30개 40개 등등 여러 값을 들고오더라도 이렇게 코드 한 두줄로 줄일 수 있음
- 단점은 JSP 단에서만 사용할 수 있음(JAVA에선 사용불가)
dt2.insert(bt22); |
- 액션 태그로 객체 생성한 bt22
Webcontent 에 member 라는 새 폴더 만들기
jsp4 폴더에 있는 .jsp 파일 전체 복사해서 붙여넣기
< insertPro.jsp > 이 부분 주석처리하기
- insertPro.jsp 실행창
- 콘솔창
< DB 연결 : 1~4 단계 똑같이 하면 됨 ⇒ 근데 밑에 화면처럼 오류 뜰 거! >
- 외부에 있는 DB를 가져오는 것 : 예기치 못한 에러가 발생할 수 있음!
- 또 문법적 오류는 없는데, 논리적 오류가 발생할 수 있음. 등등 에러 발생 가능
- 에러가 발생할 것 같은 걸 처리해줘야함 ⇒ 예외처리.
이 부분 전부 다시 주석처리 후
System.out.println("메서드 시작"); int a = 10; int b = 0; System.out.println("나누기 : " + a/b); System.out.println("메서드 종료"); |
추가해보기 ⇒ 실행시켜보기
⇒ 에러창 확인 ( 0 으로 나눠서 에러가 뜸 )
- 콘솔창 보면 에러 확인 가능(클릭하면 자동으로 에러난 곳 이동)
System.out.println("메서드 시작"); int a = 10; int b = 0; if(b!=0) { System.out.println("나누기 : " + a/b); } else { System.out.println("0으로 나눔"); } System.out.println("메서드 종료"); |
- 수동으로 비교해보기 ( 0일때와 0이 아닐때 )
- 다시 실행해보기( insertForm.jsp 부터 시작 )
- 다시 실행했을 땐 가입 잘 되는 것을 확인 가능
- 프로그램도 정상적으로 동작(콘솔창)
근데 이렇게 하나하나 수작업으로 하면 너무 힘들다!
⇒ 이것을 자바단의 예외처리로 처리해 줄 거!
< MemberDAO.java >
- 자바에서 제공하는 예외처리 구문
< try ~ catch 구문 기본 문법 >
// 자바에서 제공하는 예외처리 구문 try { // 예외가 발생할 것 같은 구문 넣어주기 } catch (Exception e) { // 예외가 발생하면 처리하는 구문 } [finally { // 예외 상관없이 마무리작업 구문 }] |
- finally 구문은 생략가능
try { System.out.println("나누기 : " + a/b); } catch (Exception e) { System.out.println("0으로 나눔"); } finally { System.out.println("예외 상관없이 마무리작업 구문"); } |
- 다시 실행해보기
- 콘솔창
⇒ 이 try ~ catch 를 이용해서 DB 연결 해 줄 거!
< MemberDAO.java >
- try 안에 넣어주면 오류 없어짐.
- e.printStackTrace(); ⇒ 어떤 에러가 발생했는지 추적 가능
< MemberDAO.java >
try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql="insert into member(id, pass, name, reg_date) values(?,?,?,?)"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, mb.getId()); pstmt.setString(2, mb.getPass()); pstmt.setString(3, mb.getName()); pstmt.setTimestamp(4, mb.getReg_date()); pstmt.executeUpdate(); } catch (Exception e) { // 예외가 발생하면 처리하는 구문 e.printStackTrace(); // 어떤 에러가 발생했는지 추적 } finally { // 예외 상관없이 마무리작업 구문 } |
- 회원가입
- 회원가입 완료
- mysql 에서도 확인 ( 입력된 것을 확인할 수 있다! )
====== member 폴더에 loginForm.jsp / loginPro.jsp 디비작업
< loginPro.jsp >
> 디비 작업으로 넘긴다! (자바단으로)
- jsp 단에서 쓸 거! 자바로 들고가면 문제됨.
- jsp 단에서 쓸 거! 자바로 들고가면 문제됨.
⇒ 둘 다 자바단에서 쓸 수는 있지만, 지금은 안할거….
⇒ 값이 1이 들어오면 아이디/비번 일치 ⇒ 0이 들어오면 비밀번호가 틀리다. -1이 들어오면 아이디가 없다. (임의로 이렇게 약속을 하고 우리가 프로그램을 짜는거!)
< loginPro.jsp >
> % % 안에 있는 디비 구문들(java) 전부 주석 처리 ⇒ 자바단으로 따로 만들거!
>
< MemberDAO.java >
패키지 member 파일이름 MemberDAO
리턴할형int userCheck(아이디, 비밀번호) 메서드 만들기
< loginPro.jsp >
memberDAO 객체생성
int check = userCheck(아이디, 비밀번호) 호출
// check == 1 세션값 생성, main.jsp 이동
// check == 0 비밀번호 틀림, 뒤로이동
// check == -1 아이디없음, 뒤로이동
⇒ 패키지선언, 변수선언 등은 어렵지 않은데 이렇게 함수 만드는게 어렵다!
⇒ 함수를 얼마나 적재적소하게 만들 수 있는지가 가장 중요(실무작업에서도!) : 연습하기!!
< memberDAO.java >
public class MemberDAO {} 안에 userCheck() 메서드 만들기
public int userCheck(String id, String pass) { int check = 0; try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql = "select * from member where id = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, id); pstmt.executeQuery(); ResultSet rs = pstmt.executeQuery(); if(rs.next()) { if(rs.getString("pass").equals(pass)) { check = 1; } else { check = 0; } } else { check = -1; } } catch (Exception e) { e.printStackTrace(); } return check; } |
- int check = 0; 으로 초기화 시켜도 상관이 없는게
값이 1일 때에만 넘어가기 때문에, 오류가 나서 try 문이 돌아가지 않고 catch 문이 돌아가더라도 check 값이 0으로 리턴되서 페이지가 넘어가지 않음!
(= 초기값이 1만 아니면 된다!)
< loginPro.jsp >
MemberDAO md = new MemberDAO(); int check = md.userCheck(id, pass); if(check == 1) { session.setAttribute("id", id); response.sendRedirect("main.jsp"); } else if(check == 0) { %> <script type="text/javascript"> alert("비밀번호가 틀립니다!"); history.back(); </script> <% } else { %><script type="text/javascript"> alert("아이디가 틀립니다!"); history.back(); </script> <% } %> |
- int check = ~~ 리턴 된 값을 check 변수에 저장해줘야 loginPro에서 쓸 수 있다.
> info.jsp 디비작업
패키지 member 파일이름 memberDAO
리턴할형 MemberBean getMember(아이디) 메서드 만들기
MemberDAO 객체생성
MemberBean mb = getMember(아이디) 호출
< MemberDAO.java >
public MemberBean getMember(String id) { MemberBean mb = new MemberBean(); try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql = "select * from member"; PreparedStatement pstmt = con.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { if(rs.getString("id").equals(id)){ mb.setId(rs.getString("id")); mb.setName(rs.getString("name")); mb.setReg_date(rs.getTimestamp("reg_date")); } } } catch (Exception e) { e.printStackTrace(); } return mb; } |
- MemberBean : 리턴할 형
MemberBean mb = new MemberBean(); : 기억장소 생성!
- < MemberBean.java > 에서 만든 class 만으로는 기억장소 생성이 안됨.
> getMember() 수정
String sql = "select * from member where id = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt.setString(1, id); |
⇒ 일치하는 아이디 값만 받아옴.
< info.jsp >
<% String id = (String)session.getAttribute("id"); MemberDAO md = new MemberDAO(); MemberBean mb = md.getMember(id); %> <table border="1"> <tr><td>회원정보</td><td>조회</td></tr> <tr><td>회원아이디</td><td><%=mb.getId() %></td></tr> <tr><td>회원비밀번호</td><td><%=mb.getPass() %></td></tr> <tr><td>회원이름</td><td><%=mb.getName() %></td></tr> <tr><td>가입한날짜</td><td><%=mb.getReg_date() %></td></tr> </table> <a href="main.jsp">메인화면으로 돌아가기</a> |
MemberBean mb = md.getMember(id);
⇒ 이 부분은
- MemberBean mb = new MemberBean();
mb = md.getMember(id);
이 두 줄을 한줄로 선언한 것! (바로 초기화 시킴)
- 이미 MemberDAO()에서 MemberBean mb = new MemberBean(); 라고 인스턴스 객체를 생성했기 때문에 info.jsp 에서는 MemberBean을 바로 불러올 수 있다.
- Stack 영역과 Heap 영역 생각 잘 해보기
> updateForm.jsp / updatePro.jsp 디비작업
< updatePro.jsp >
String id = request.getParameter("id"); String pass = request.getParameter("pass"); String name = request.getParameter("name"); |
MemberBean mb = new MemberBean(); mb.setName(name); mb.setId(id); int check = md.userCheck(id, pass); |
- mb에 setName(name), setId(id) 로 값 저장시켜주기.
- 내가 이 부분을 안해서……….. 수정 하는 값을 입력해도 계속 DB에 저장되어있는 값으로 넘겨주니까 계속 DB 저장 값을 불러온 거!
if(check == 1) { md.updateMember(mb); %> <script type="text/javascript"> alert("회원정보 수정완료!"); </script> <% response.sendRedirect("main.jsp"); } |
- updatePro.jsp 넘길 때 이렇게 했더니 경고창이 뜨지 않음.
- 이유가 <% %> 안의 내용들을 먼저 처리 한 뒤(우선순위가 높음!) 나머지를 처리하는데 스크립트 문을 처리 하기도 전에 response.sendRedirect("main.jsp"); 가 있기 때문에 경고창이 뜰 새도 없이 <%response~%> 를 실행해서 main.jsp로 바로 넘어가는 것
- 스크립트 안에 location.href 로 넘겨주거나, response 를 쓰거나 하나만 선택 가능.
- 경고문 출력하고 넘어갈 거면 스크립트 안에 location.href = "main.jsp"; 추가.
if(check == 1) { md.updateMember(mb); %> <script type="text/javascript"> alert("회원정보 수정완료!"); location.href = "main.jsp"; </script> <% } |
< memberDAO.java > - updateMember() 메서드 추가
public void updateMember(MemberBean mb) { try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql="update member set name = ? where id = ?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt = con.prepareStatement(sql); pstmt.setString(1, mb.getName()); pstmt.setString(2, mb.getId()); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { // 예외 상관없이 마무리 작업 구문 ==> 기억장소 해제 } } |
< updatePro.jsp >
MemberBean mb = new MemberBean(); mb.setName(name); mb.setId(id); MemberDAO md = new MemberDAO(); int check = md.userCheck(id, pass); if(check == 1) { md.updateMember(mb); %> <script type="text/javascript"> alert("회원정보 수정완료!"); location.href = "main.jsp"; </script> <% // response.sendRedirect("main.jsp"); } else if(check == 0) { %> <script type="text/javascript"> alert("비밀번호가 틀립니다!"); history.back(); </script> <% } |
- 선생님은 ‘아이디없음’ 도 넣어줬는데, 어차피 로그인 해서 수정하는거기 때문에 난 안넣어줌.
⇒ 이제 삭제 작업
======== deleteForm.jsp / deletePro.jsp
< deleteForm.jsp > - 그대로
<h1>WebContent/member/deleteForm.jsp</h1> <% String id = (String)session.getAttribute("id"); %> <form action="deletePro.jsp" method="get"> 아이디: <input type="text" name="id" value="<%=id %>" readonly><br> 비밀번호: <input type="password" name="pass"><br> <input type="submit" value="회원정보삭제"> </form> |
< deletePro.jsp >
- 자바빈에 담아도 되고 안담아도 됨(2개만 쓸거니까)
문제 )
< deletePro.jsp >
MemberDAO 객체생성
int check = userCheck(아이디,비밀번호) 호출
check == 1 삭제하는메서드호출 deleteMember(아이디,비밀번호)
⇒ 세션초기화 후 main.jsp 이동
check == 0 비밀번호틀림 뒤로이동
check == -1 아이디없음 뒤로이동
<% request.setCharacterEncoding("utf-8"); String id=request.getParameter("id"); String pass=request.getParameter("pass"); MemberDAO md = new MemberDAO(); int check = md.userCheck(id, pass); if(check == 1){ md.deleteMember(id, pass); session.invalidate(); response.sendRedirect("main.jsp"); }else if(check == 0){ %> <script type="text/javascript"> alert("비밀번호 틀림"); history.back(); </script> <% } else { %> <script type="text/javascript"> alert("아이디 없음"); history.back(); </script> <% } %> |
- 푼 답 ( 여기도 로그인해서 삭제하는거기 때문에 아이디없음은 굳이 안넣어도 됨.. )
- 나는 회원정보가 삭제되면 회원정보가 삭제됐다고 띄우고 싶어서 script 사용
- response.sendRedirect("main.jsp"); 대신 아래 script 문 추가. (<%%> 바깥에 사용)
%> <script type="text/javascript"> alert("회원정보 삭제완료!"); location.href = "main.jsp"; </script> <% |
< memberDAO.java > - deleteMember() 메서드 추가
public void deleteMember(String id, String pass) { try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql="delete from member where id=?"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt=con.prepareStatement(sql); pstmt.setString(1, id); pstmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } } |
→ < info.jsp > 를 보면 이렇게 하나씩 리턴하는 걸 볼 수 있다.
→ 리턴 값은 하나만 설정할 수 있으니까 mb라는걸 다시 하나의 공간에 담아서 첫번째mb 두번째mb… 이렇게 리턴을 시켜줄 거 ( mb 를 배열에 담아줄 거! )
⇒ 여러명의 사람을 mb 배열에 담을 거(mb list)
⇒ 위에 처럼 각각 리턴시키는 게 아니라 한 번만 리턴할 수 있도록 (하나만 만들어지게)
< list.jsp >
memberBean을 배열로 설정해서 한 번에 담아서 들고올 거.
- sql 문은 간단하다. 그냥 다 들고 오면 됨!
그냥 담아오는 건
MemberBean mb = getMemberList() ⇒ 이렇게 담아오면 되지만 우린 배열에 담아올 거!
문제 )
API : 자바에서 제공하는 배열
memberDAO 객체생성
배열 자바 API List 인터페이스 => 상속 ArrayList 클래스
여러 개 기억 장소에 모든 형을 저장
⇒ 처음 10개 기억장소가 만들어지는데, 값이 추가가 되면 기억장소가 10개씩 추가
List memberList = getMemberList() 호출
↑ 배열
< memberDAO.java > ⇒ getMemberList() 만들기
→ 리턴 값 List
유용하게 사용하는 툴이다. 라고 해서 java.util 꺼로 받아옴
⇒ E는 없애기
⇒ 일단 이렇게 틀 만들고 안에 try~catch 문으로 똑같이 해주면 됩니닷.
문제 ) getMemberList() 안에서
3단계 sql member 전체 조회
4단계 rs <= 실행결과 저장
5단계 while 첫행으로 이동, 데이터 있으면
한사람의 데이터 저장 MemberBean mb 객체생성
mb 멤버변수 <= rs에 저장된 열내용
배열 한 칸에 한사람의 데이터 주소저장 memberList.add(mb)
⇒ getMember() 랑 비슷 (info.jsp 랑 비슷합니다)
< memberDAO.java >
public List getMemberList() { // 여러 명의 데이터를 저장하는 기억장소, 자바에서 제공하는 배열 API List memberList = new ArrayList(); try { Class.forName("com.mysql.jdbc.Driver"); String dburl = "jdbc:mysql://localhost:3306/jspdb1"; String dbuser = "jspid"; String dbpass = "jsppass"; Connection con = DriverManager.getConnection(dburl, dbuser, dbpass); String sql="select * from member"; PreparedStatement pstmt = con.prepareStatement(sql); pstmt = con.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); // 5단계 while 첫행으로 이동, 데이터 있으면 // 한사람의 데이터 저장 MemberBean mb 객체생성 // mb 멤버변수 <= rs에 저장된 열내용 // 배열 한 칸에 한사람의 데이터 주소저장 memberList.add(mb) while(rs.next()) { MemberBean mb = new MemberBean(); mb.setId(rs.getString("id")); mb.setPass(rs.getString("pass")); mb.setName(rs.getString("name")); mb.setReg_date(rs.getTimestamp("reg_date")); // 배열 한 칸에 한사람의 데이터 주소 저장 memberList.add(mb); } } catch (Exception e) { e.printStackTrace(); } return memberList; } |
< list.jsp >
- 여기서도 java.util 호출
- 배열이니까 while 문 대신 for 문을 씀!
- 여기선 배열의 크기. length 아니고 .size() 로 적음!
- .length 적으면 이렇게 오류 뜨는 것을 확인할 수 있다.
<% request.setCharacterEncoding("utf-8"); String id = (String)session.getAttribute("id"); MemberDAO md = new MemberDAO(); List memberList = md.getMemberList(); %> <table border="1"> <tr><td>아이디</td><td>비밀번호</td><td>이름</td><td>가입날짜</td></tr> <% for(int i = 0; i < memberList.size(); i++) { MemberBean mb = (MemberBean)memberList.get(i); %><tr><td><%=mb.getId()%></td><td><%=mb.getPass()%> </td><td><%=mb.getName()%></td><td><%=mb.getReg_date()%></td></tr><% }%> </table> |
- MemberBean mb = (MemberBean)memberList.get(i); ⇒ 형 변환 시켜줌
- 주소값을 전달 (배열)
'Dev.Program > JSP & Javascript' 카테고리의 다른 글
게시판 만들기 - (2) WAR Export / Import (0) | 2022.10.08 |
---|---|
게시판 만들기 - (1) (1) | 2022.10.08 |
게시판(board) (0) | 2022.10.07 |
JSP - DB 연동 (0) | 2022.10.07 |
cookie / session / DB연동 - Mysql (0) | 2022.10.07 |