[ITWILL : JSP]Javabean 4 : web.xml, 회원정보삭제페이지

ITWILL학원 : 25강 JSP기초 BY 정규태강사

1. web.xml

  • 배포서술자 : 프로젝트 실행시 가장 먼저 실행되는 파일.
  • 프로그램에 필요한 전반적인 설정을 지정함.
  • 에러코드별 데이터 처리필요 : 프로그램배포시 꼭 필요한 페이지.
  • 위치 : WEBCONTENT하위의 WEB-INF폴더안에 위치함.

https://slidesplayer.org/slide/15757128/

1-1. 404에러 예시

  • 만약 404에러가 뜨면 location 아래로 이동해서 처리하겠다는 의미
  • webcontent하위에 error폴더 생성 후 그 안에 404code.jsp생성
  1. web.xml파일에 </web-app>태그 위에 아래 코드를 입력한다.
1
2
3
4
5
6
<error-page>
<error-code>404</error-code>
<location>
/error/404code.jsp
</location>
</error-page>
  1. ‘error’폴더를 따로 생성한 뒤 404code.jsp를 만든다.
1
2
3
4
<h1>404code</h1>
<h2>페이지를 찾을 수 없습니다.</h2>
<h2>관리자에게 문의하세요.</h2>
<input type="button" value="로그인페이지로 이동" onclick="location.href='loginForm.jsp'">

1-2. 500에러 예시

  • 만약 500에러가 뜨면 location 아래로 이동해서 처리하겠다는 의미
  • webcontent하위에 error폴더 생성 후 그 안에 500code.jsp생성
  • 위와 동일한 방법에 코드만 404에서 500으로 변경해주면 된다
1
2
3
4
5
6
<error-page>
<error-code>500</error-code>
<location>
/error/500code.jsp
</location>
</error-page>
1
2
3
4
<h1>500code</h1>
<h2>페이지를 찾을 수 없습니다.</h2>
<h2>관리자에게 문의하세요.</h2>
<input type="button" value="로그인페이지로 이동" onclick="location.href='loginForm.jsp'">

2. 회원정보삭제페이지

2-1. 메인페이지 main.jsp에서 회원정보삭제버튼 추가

메인페이지에 회원정보삭제 버튼을 만든다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object를 string으로 다운캐스팅
String name = request.getParameter("name");
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>
<h2><%=id %>님 환영합니다.</h2>

<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

2-2. 회원정보삭제폼페이지 deleteForm.jsp 생성

사용자로부터 비밀번호 받는 폼페이지 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
//1. 로그인 처리 -> 로그인 x (로그인페이지 이동)
String id = (String) session.getAttribute("id");
if( id == null ){
response.sendRedirect("loginForm.jsp");
}
//2.회원 비밀번호만 입력받아서 deletePro.jsp페이지 이동후 삭제
%>
<fieldset>
<legend>회원탈퇴</legend>
<form action="deletePro.jsp" method="post">
<!-- input타입중 hidden은 화면에 있는 해당 input태그를 숨겨서 정보 전달 -->
아이디 : <input type="hidden" name="id" value="<%=id %>" readonly><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value="탈퇴하기">
<input type="button" value="뒤로가기" onclick="location.href='main.jsp'">
</form>
</fieldset>

2-3. 회원정보삭페이지 deletePro.jsp 생성

순서

  1. 한글처리 & 로그인여부체크 ->로그인페이지이동
  2. 삭제할 비밀번호 가져오기 : 파라미터이용
  3. MeberDAO객체 생성 -> deleteMember()메서드 호출
  4. 데이터처리 : 1-삭제완료, 0-비번오류, -1-아이디없음
    • 삭제 후 session 초기화 까먹으면 안된다! 세션 꼭 없앨 것!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%//1.한글처리 & 로그인확인 
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");
if(id == null){
response.sendRedirect("loginForm.jsp");
}

//2. 삭제할 비밀번호 가져오기
String pw = request.getParameter("pw");
%>

<%
//3.DAO객체생성 -> 결과를 리턴(1=정상처리 2=비번오류 -1=아이디가없음)
MemberDAO mdao = new MemberDAO();
int result = mdao.deleteMember(id, pw); //2-4에서 만든 메서드 호출

//4.데이터처리 -> 삭제후 login페이지로 이동
if(result == 1){
session.invalidate(); //초기화 필수! 까먹지마!
%>
<script type="text/javascript">
alert("회원정보삭제 성공");
location.href="loginForm.jsp";
</script>
<%
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호오류로 회원정보삭제실패");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("존재하지않는 아이디입니다.");
history.back();
</script>
<%
}
%>

2-4. DAO에서 deleteMember()메서드만들기

순서

  1. DB연결메서드 불러오기
  2. SQL & pstmt 생성 : 사용자가 입력한 비밀번호가 DB비번과 일치하는 지 확인
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 비번일치하면 정보삭제 작업, 아닌 경우 에러
    • 4-1. DB에 있는 회원 -> 비번체크 : 비번일치(->수정) 비번불일치(->에러)
      • 비번일치하는 경우 : SQL 구문작성 & pstmt 생성 -> 실행
    • 4-2. DB에 없는 회원 -> 에러
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int deleteMember(String id, String pw){
int result = -1;
try {
//7-1. DB연결메서드 불러오기
con = getCon();

//7-2. SQL & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

//7-3. 실행 -> rs저장
rs = pstmt.executeQuery();

//7-4. 데이터처리 : DB에 있는 회원인 경우 삭제, 아닌 경우 에러
if(rs.next()){
if(pw.equals(rs.getString("pw"))){

//7-4-1. SQL 구문작성 & pstmt 생성
sql = "delete from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.executeUpdate();
result = 1;
System.out.println("회원삭제성공-아디일치,비번일치");
}else{
result = 0;
System.out.println("회원삭제실패-아디일치,비번불일치");
}
}else{
result = -1;
System.out.println("회원삭제실패-아이디불일치");
}
} catch (SQLException e) {
e.printStackTrace();
//7-5. 자원해제
} finally {
closeDB();
}
return result;
}//delete닫힘

[ITWILL : JAVA]기본클래스 이외에 자바 구성요소1 : 추상클래스, 인터페이스

ITWILL학원 : 17강 JAVA BY 윤미영강사

1. 추상클래스(Abstract Class)

  • 슈퍼클래스에서 메서드의 선언부까지는 작성가능하지만 구현부는 어떻게 될지 확정되지 않아 작성하기 어려울때 사용
  • 서브클래스들에서 어차피 재정의해서 사용하기 때문에 슈퍼클래스에서 아직 작성할 수 없는 메서드에 대해 선언부에 abstract를 추가 작성하고 구현부를 세미콜론(;)으로 대체한다.
  • 이를 abstract method design pattern 프로그래밍기법이라고 한다.
1
2
3
4
5
6
abstract class A {
//멤버변수, 메서드, 생상자
public abstract void 메서드이름();
}

//abstract()메서드는 중괄호없이 세미콜론만.
  • 추상클래스도 클래스이기에 클래스 구성요소(멤버변수, 메서드, 생성자)를 다 갖춰야하고 그 중 특이하게 abstract메서드를 가지는 클래스를 말한다.
  • 참조변수로 사용가능
  • 객체생성 불가능 : 구현부가 없어서 호출될 수 없기때문에 즉 abstract메서드때문에 미완성
  • 미완성을 어떻게 완성시킬까?
    • 상속하여 재정의! 상속관계의 @override해줘야한다.
    • 반드시 재정의해줘야한다.
    • 재정의를 통해 서브클래스를 객체생성해서 사용할 수 있다.
1
2
3
4
5
6
class B extends A {
@Override
public void 메서드이름(){
//구현부작성
}
}
  • 장점 : 재사용성 향상

참고링크 : 추상 클래스 및 추상 메서드(abstract class and abstract method)

2. 인터페이스

  • 두 시스템 간에 만나는 접점이라는 의미.

  • 모든 메서드가 abstract메서드인 클래스를 인터페이스라고 한다.

  • 자주 사용하는 인터페이스 : GUI(Graphic User Interface).

  • 인터페이스이름의 첫글자는 대문자.

  • 인터페이스는 클래스가 아니라서 클래스와 구성요소의 차이가 있다.

  • 객체생성 불가능 : abstract메서드가 있어서, 즉 메서드가 미완성

  • 미완성을 어떻게 완성시킬까?

    • 재구현! 클래스의 재구현을 통해서 객체생성할 수 있다.

2-1. 인터페이스와 클래스 차이점

  1. 인터페이스와 클래스는 정의법과 구성요소의 차이가 있다.
  • 인터페이스 정의시에 왜 예약어가 생략가능할까?
  • 컴파일러입장에서는 final과 abstract가 너무나 당연하기때문에
1
2
3
4
5
6
7
8
9
10
11
12
//클래스 정의법
class A{
멤버변수
메서드
생성자
}

//인터페이스 정의법
interface Interf {
상수(final 생략가능)
abstract()메서드(abstract 예약어 생략가능)
}
  1. 인터페이스와 클래스 차이
  • 인터페이스 : 다중구현 가능 (헷갈릴까봐 다중상속이라고하지않고 다중구현이라고부른다)
  • 클래스 : 다중상속 불가능
  1. 인터페이스는 객체 생성이 가능할까?
    NOPE! 클래스로 구현한 뒤 클래스를 객체생성할 수있다(업캐스팅)

2-2. 구현(implements)

  • 클래스의 구현을 통해서 인터페이스를 사용할 수 있다.
    • 키워드는 implements 사용!
  • abstract 예약어 생략가능. 따라서 abstract 예약어 안써도 다 생략되어있다고 생각하면됨
    • 왜냐면, 인터페이스안에는 일반변수와 일반메서드 사용할 수 없기 때문에
  • 인터페이스의 모든 abstract method를 재구현하기 위해서 단축키 alt + shift + s를 통해 Override/implements method를 클릭한 뒤 abstract method를 tick해서 재구현해준다.
1
2
3
4
5
6
7
8
//구현 키워드는 implements
class interA implements Interf{
//멤버변수, 메서드, 생성자

//인터페이스가 가지고있는 모든 abstract method를 재구현해야함.
@Override
void method(){}
}

2-3. 인터페이스의 필요성

만들어놓은 라이브러리를 사용하기 위해 인터페이스를 시용한다.

  • 구현의 강제로 표준화
  • 인터페이스를 통해 간접적인 클래스 사용으로 손쉬운 모듈교체지원
  • 서로 상속의 관계가 없는 클래스들에게 인터페이스를 통한 관계 부여로 다형성 확장
  • 모듈 간 독립적 프로그래밍으로 개발 시간 단축
    • stub : 아직 개발되지 않은 코드를 임시로 대치하는 역할.

2-4. 인터페이스에 추가할 수 있는 다양한 메서드

  • JDK 1.8버전에서부터 default메서드와 static메서드가 추가되었다.
  • default()메서드 : 구현부가 포함된 일반 메서드
    • interface클래스 구현한 뒤 디폴트메서드는 오버라이딩필요없이 사용가능.
    • 중요 : 접근제어자는 public만 사용가능
    • 문제점 : 인터페이스 다중구현할때 디폴트메서드가 이름이 똑같은 경우 우선순위를 어떻게 두는가? => 아래 규칙으로 충돌을 회피한다.
        1. 조상클래스의 메서드가 가장 높은 우선순위. 조상클래스의 메서드와 인터페이스의 디폴트메서드가 충돌하면 디폴트메서드는 무시된다.
        1. 하나의 인터페이스에서 디폴트메서드를 제공되고 다른 이터페이스에 충돌하는 메서드가 있는 경우(디폴트메서드가 아니더라도) 서브클래스는 반드시 조상의 메서드를 재정의해야한다.

[ITWILL : JSP]Javabean 3 : 회원정보조회/수정 페이지만들기

ITWILL학원 : 24강 JSP기초 BY 정규태강사

자바빈 프로젝트 1 : 회원가입페이지만들기
자바빈 프로젝트 2 : 로그인 및 로그아웃페이지만들기
자바빈 프로젝트 3 : 회원정보조회 및 수정페이지만들기

1. 메인페이지 main.jsp에서 버튼 추가

메인페이지에 회원정보조회 버튼을 만든다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//objectstring으로 다운캐스팅
String name = request.getParameter("name");
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>
<h2><%=id %>님 환영합니다.</h2>

<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

2. 회원정보조회페이지 memberinfo.jsp 생성

회원정보를 DB에서 가져와서 출력하는 memberinfo.jsp를 만든다

순서

  1. 한글설정 & 변수생성

    • 1-1. id값확인 -없으면 로그인페이지로 이동
  2. MemberDAO객체 생성 -> 회원정보 가져오는 메서드생성

    • MemberBean import하기
    • MemberBean 데이터타입 mb변수로 메서드정보 담아오기
  3. 데이터처리 : 테이블에 담기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//1. 한글설정 & 변수생성
String id = (String) session.getAttribute("id");//object이기에 형변환필수
//1-1.id값확인 -없으면 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
//2. 멤버DAO객체 생성 -> 회원정보 가져오는 메서드생성
MemberDAO mdao = new MemberDAO();
MemberBean mb = mdao.getMember(id);

//3. 데이터처리 : 테이블로 표현
if(mb != null){
%>
<h2>마이페이지</h2>
<table border="1">
<tr>
<td>아이디</td>
<td><%=mb.getId() %></td>
</tr>
<tr>
<td>비밀번호</td>
<td><%=mb.getPw() %></td>
</tr>
<tr>
<td>이름</td>
<td><%=mb.getName() %></td>
</tr>
<tr>
<td>나이</td>
<td><%=mb.getAge() %></td>
</tr>
<tr>
<td>성별</td>
<td><%=mb.getGender() %></td>
</tr>
<tr>
<td>이메일</td>
<td><%=mb.getEmail() %></td>
</tr>
<tr>
<td>회원가입일</td>
<td><%=mb.getReg_date() %></td>
</tr>
</table>
<%
}
%>
<hr>
<input type="button" value="뒤로가기" onclick="location.href='main.jsp'">

3. DAO에서 getMember()메서드만들기

회원정보 가져오는 메서드 getMember()로 회원정보 전부 리턴 -> 테이블에 추가해야한다.

순서

  1. 드라이브로드 & 디비연결
  2. SQL 구문 작성 & pstmt 생성
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 회원정보 저장 후 memberinfo페이지로 전달
    • 4-1. MemberBean mb = null; //객체 레퍼런스 생성
    • 4-2. rs.next() : DB의 컬럼명과 일치해야함!
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public MemberBean getMember(String id){
MemberBean mb = null; //객체 레퍼런스 생성
//왜 null인가? 정보가 생성되는 시점은 rs에 있을때이다.
//따라서 rs가 없을땐 굳이 만들필요가 없다.

try{
//5-1. 드라이브로드 디비연결
con = getCon();
//5-2. SQL & pstmt 생성
sql = "select * from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//5-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//5-4. 데이터처리 : DB에 있는 회원정보 저장 후 memberinfo페이지로 전달
//5-4-1. MemberBean mb = null; //객체 레퍼런스 생성
//DB의컬럼명을 입력할 것
if(rs.next()){
mb = new MemberBean();
mb.setId(rs.getString("id"));
mb.setPw(rs.getString("pw"));
mb.setName(rs.getString("name"));
mb.setAge(rs.getInt("age"));
mb.setEmail(rs.getString("email"));
mb.setGender(rs.getString("gender"));
mb.setReg_date(rs.getTimestamp("reg_date"));

System.out.println("회원정보저장완료");
}
System.out.println("sql구문실행완료");
}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { //5-5. 자원해제
closeDB();
}
return mb;
}

4. 회원정보수정페이지 updateForm.jsp 생성

순서

  1. 한글처리 & 세션변수
    • 1-1. 로그인여부체크 (로그인x->로그인페이지로이동) //object->string 형변환필수
  2. 드라이브로드 & 디비연결 = 멤버DAO객체 생성 -> getMember()메서드호출
    • 로그인한 사용자의 정보를 가져오기
    • getMember()를 이용해서 id에 해당하는 회원정보 가져오기
  3. 데이터처리 : 테이블형식으로 출력
  4. 비밀번호를 입력받은 뒤 수정하기 ->updatePro.jsp에서 진행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%//1.로그인여부체크 (로그인x->로그인페이지로이동)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object이기에 형변환필수
if(id == null){
response.sendRedirect("loginForm.jsp");
}
//2. 드라이브로드 & 디비연결 : 로그인한 사용자의 정보를 가져오기
MemberDAO mdao = new MemberDAO();
MemberBean mb = mdao.getMember(id);

//3. 데이터처리 : 테이블형식으로 출력
//4. 비밀번호를 입력받은 뒤 수정하기 ->updatePro.jsp에서 진행
%>
<fieldset>
<legend>회원정보수정</legend>
<form action="updatePro.jsp" method="post" name="fr">
아이디 <input type="text" name="id" value="<%=mb.getId() %>" readonly><br>
비밀번호 <input type="password" name="pw" placeholder="비밀번호를 입력하세요" required><br>
이름 <input type="text" name="name" value="<%=mb.getName() %>"><br>
나이 <input type="text" name="age" value="<%=mb.getAge() %>"><br>
성별
<input type="radio" name="gender" value="여"
<% if(mb.getGender().equals("여")){ %>
checked
<%}%>
> 여성
<input type="radio" name="gender" value="남"
<% if(mb.getGender().equals("남")){ %>
checked
<%}%>
> 남성<br>
이메일 <input type="text" name="email" value="<%=mb.getEmail() %>"><br>
<input type="submit" value="회원정보수정하기">
</form>
</fieldset>

<button onclick="location.href='main.jsp'">뒤로가기</button>

5. 회원정보수정페이지 updatePro.jsp 생성

순서

  1. 로그인여부체크 ->로그인페이지이동
  2. 액션태그사용 : 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜) = jsp:useBean
    2-1. 파라미터 값 저장 = jsp:setProperty
  3. MeberDAO객체 생성 -> updateMember()메서드 호출
  4. 데이터처리 : 1-수정완료, 0-비번오류, -1-아이디없음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<%
//1. 한글처리 & 로그인여부체크 ->로그인페이지이동
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");
if (id == null) {
response.sendRedirect("loginForm.jsp");
}

%>
<!-- 2. 액션태그사용 : 전달된 정보를 저장(아이디,비번,이름,나이,성별,이멜) -->
<jsp:useBean id="mb" class="com.itwillbs.member.MemberBean" />
<!-- 2-1. 파라미터 값 저장 -->
<jsp:setProperty property="*" name="mb"/>

<%//3. MeberDAO객체 생성
MemberDAO mdao = new MemberDAO();

//4. 데이터처리 : 1-수정완료, 0-비번오류, -1-아이디없음
int result = mdao.updateMember(mb);

if(result == 1){
%>
<script type="text/javascript">
alert("회원정보수정 성공");
</script>
<%
System.out.println("회원정보수정성공");
response.sendRedirect("main.jsp");
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호오류로 회원정보수정실패");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("존재하지않는 아이디입니다.");
history.back();
</script>
<%
}
%>

6. DAO에서 updateMember()메서드만들기

회원정보 수정 메서드

순서

  1. 드라이브로드 & 디비연결
  2. SQL 구문 작성 & pstmt 생성
    • 2-1. select 사용해서 id가 있는지 체크
  3. 실행 -> rs저장
  4. 데이터처리 : DB에 있는 회원인 경우
    • 4-1. DB에 있는 회원 -> 비번체크 : 비번일치(->수정) 비번불일치(->에러)
      • 비번일치하는 경우 : SQL 구문작성 & pstmt 생성 -> 실행
    • 4-2. DB에 없는 회원 -> 에러
  5. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public int updateMember(MemberBean mb){
int result = -1;

try {
//6-1. 드라이브로드 디비연결
con = getCon();
//6-2. SQL 구문작성 & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, mb.getId());
//6-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//6-4. 데이터처리 : DB에 있는 회원인 경우 수정 아닌 경우 에러
if(rs.next()){//DB에 있는 회원
if(mb.getPw().equals(rs.getString("pw"))){//비번일치
//6-5. 비번일치하면 정보수정 작업
//6-5-1. SQL 구문작성 & pstmt 생성
sql = "update itwill_member set name=?, age=?, gender=?, email=? "
+ "where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, mb.getId());
//6-5-2. 실행
pstmt.executeUpdate();
System.out.println("회원정보수정성공");
result = 1;
}else{
result = 0;
System.out.println("아디일치,비번불일치 - 회원정보수정실패");
}
}else{ //DB에 없는 회원
result = -1;
System.out.println("존재하지않는아이디 - 회원정보수정실패");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
closeDB();
}
return result;
}//updateMember닫힘

[ITWILL : JSP]Javabean 2 : 로그인,로그아웃페이지만들기

ITWILL학원 : 24강 JSP기초 BY 정규태강사

자바빈 프로젝트 1 : 회원가입페이지만들기
자바빈 프로젝트 2 : 로그인 및 로그아웃페이지만들기
자바빈 프로젝트 3 : 회원정보조회 및 수정페이지만들기

1. 로그인폼페이지 작성

1
2
3
4
5
6
7
8
9
<fieldset>
<legend>로그인</legend>
<form action="loginPro.jsp" method="post" name="fr">
아이디 <input type="text" name="id" required ><br>
비밀번호 <input type="password" name="pw"><br>
<input type="submit" value="로그인하기">
<input type="button" value="회원가입하기" onclick="location.href='insertForm.jsp'">
</form>
</fieldset>

2. 로그인프로페이지 작성

파라미터를 저장할 때 세가지 방법이 있다.

  1. 파라미터 사용 : getParameter()
  2. 자바빈객체사용 : Javabean jb = new Javabean(), jb.set변수()
  3. 액션태그 사용 : useBean(), setProperty()

자세히 : 자바빈기초

  • getParameter() : 주소줄과 폼태그에 작성한 INPUT은 getParameter로 가져온다.
  • getAttribute() : 세션, 페이지에서 저장한 값들은 getAttribute로 가져온다.

이 중 로그인 페이지에선 파라미터를 사용할 예정이다.

로그인페이지 작성 순서

  1. 한글처리 & 파라미터저장
    • 1-1. 파라미터저장 -> 파라미터사용
    • 1-2. 파라미터저장 -> 액션태그사용
  2. 로그인처리 -> DAO에서 처리
    • why? DB와 관련된 모든 사항은 DAO에서 처리하니까.
    • 로그인 메서드는 DB에서 해당 값이 있는지 체크하고 결과를 리턴
    • 리턴값은 정수형 데이터값 사용(1-로그인처리, 0-비번오류, (-1)-아이디없음)
  3. 결과(result가 -1,0,1)에 따른 페이지 이동처리
    • result = 1 : 아이디정보를 세션값으로 저장(키값, 저장할 데이터이름), main.jsp로 이동
    • result = 0 : 비번불일치 알림창, history.back()
    • result = -1 : 없는아이디 알림창, history.back()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<%//1. 한글처리
request.setCharacterEncoding("UTF-8");
//1-1. 파라미터사용 : 전달된 파라미터값 저장(아이디,비번)
String id = request.getParameter("id");
String pw = request.getParameter("pw");
%>
<!--1-2.액션태그사용 : 전달된 파라미터값 저장(아이디,비번)
`useBean`객체생성(id값 아무거나 작성해도 됨) -> `setProperty`로 파라미터저장
<jsp:useBean id="mb" class="com.itwillbs.member.MemberBean" />
<jsp:setProperty property="*" name="mb"/>
-->

<% //2. 로그인처리 -> DAO에서 처리 따라서 객체만 생성
MemberDAO mdao = new MemberDAO();
mdao.idCheack(id, pw);

//3. 결과(result가 -1,0,1)에 따른 페이지 이동처리
if(result == 1){
//3-1. 아이디정보를 세션값으로 저장(키값, 저장할 데이터이름)
session.setAttribute("id", id); //object자리에 string을 담았기에 업캐스팅발생
response.sendRedirect("main.jsp");
}else if(result == 0){
%>
<script type="text/javascript">
alert("비밀번호가 일치하지 않습니다");
history.back();
</script>
<%
}else{
%>
<script type="text/javascript">
alert("없는 아이디입니다");
history.back();
</script>
<%
}
%>

3. DAO페이지 작성

기존에 만들었던 MemberDAO를 그대로 가져온 뒤 idCheck()메서드만 생성하면 된다.

기존 MemberDAO 태그

순서

  1. 드라이브로드 디비연결
  2. SQL & pstmt 생성
  3. 실행 -> rs저장
  4. 데이터 처리
    • 왜 while이 아닌 if인가? where절에서 id는 pk조건을 가지고 있으므로 중복이 없기때문.
  5. 세션정보를 만들 수 있을까?
    • session.setAttribute();
    • 만들 수 없다. why? session은 jsp내장객체이다.
    • java에서 사용할 수 없지만 추후 서블릿을 통해 사용할 수 있다.
    • 그래서 지금은 main.jsp페이지에서 세션만들거임.
  6. 자원해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public int idCheack(String id, String pw){
int result = -1;
try {
//4-1. 드라이브로드 디비연결
con = getCon();
//4-2. SQL & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//4-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//4-4. 데이터 처리
//왜 while이 아닌 if인가? where절에서 id는 pk조건을 가지고 있으므로 중복이 없기때문
if(rs.next()){
if(pw.equals(rs.getString("pw"))){
result = 1;
System.out.println("아이디,비번일치 = 로그인성공(1)");
//4-5. 세션정보를 만들 수 있을까? 만들 수 없다.
}else{
result = 0;
System.out.println("아이디있지만 비번다름 (0)");
}
}else{
result = -1;
System.out.println("아이디,비번없음 (-1)");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally { //4-6. 자원해제
closeDB();
}
return result;
}//idCheck닫힘

4. main 페이지작성 후 로그아웃 페이지 연결하기.

순서

  1. 메인페이지, 한글처리 파라미터 저장
  2. 세션생성
  3. 메인페이지에 로그아웃버튼을 만들고 로그아웃페이지에 연결한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%//1.한글처리, 파라미터 (세션생성)
request.setCharacterEncoding("UTF-8");
String id = (String) session.getAttribute("id");//object를 string으로 다운캐스팅
//1-1. id없이는 진입불가, id없는 경우 로그인페이지로 이동
if(id == null){
response.sendRedirect("loginForm.jsp");
}
%>

<h2><%=id %>님 환영합니다.</h2>

//2. 버튼생성
<input type="button" value="회원정보조회" onclick="location.href='memberinfo.jsp'">
<input type="button" value="회원정보수정" onclick="location.href='updateForm.jsp'">
<input type="button" value="로그아웃" onclick="location.href='logout.jsp'">
<input type="button" value="회원탈퇴" onclick="location.href='deleteForm.jsp'">

4-1. 로그아웃페이지작성

메인페이지 연결한 로그아웃페이지를 만든다.

1
2
3
4
5
6
7
8
<%
session.invalidate();
System.out.println("로그아웃성공");
%>
<script type="text/javascript">
alert("정상적으로 로그아웃 되었습니다");
location.href="loginForm.jsp";
</script>
iframe태그

iframe태그

iframe태그

브라우저 영역에 다른 문서를 보여주는 태그이다.
화면을 독립적으로 사용하길 원할때 사용한다.

Read More

meta태그, 내부링크, id와 name속성의 차이

meta 태그 (메타태그)

  • meta태그는 웹사이트의 안내자이다.
    대부분의 포털사이트는 웹 사이트의 제목, 태그의 내용, 본문의 첫 100여 단어등을 검색한 후 사용자의 검색어와 비교해서 검색 결과를 나열해준다.
Read More
JOIN

JOIN

join 조인

여러 테이블에 있는 데이터를 합쳐서 출력.
join은 FROM절에 작성된다.

Read More