자바빈(JavaBean)

2022. 10. 7. 17:15Dev.Program/JSP & Javascript

728x90

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); ⇒ 형 변환 시켜줌

  • 주소값을 전달 (배열)

 

728x90

'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