Learn/KH정보교육원

로그인,회원가입 구현하기 - 1

Dahoon06 2021. 4. 29. 15:49
728x90
반응형

 

 

 

프로젝트 구성)

 

 

 

파일 흐름도)

WebConent => WEB-INF => lib => 3가지 라이브러리(jstl,ojdbc,standard)

 

WebConent => WEB-INF => web.XML

 

WebConent => index.jsp / main.jsp

 

WebConent => member => idcheck.jsp / join.jsp / login.jsp / memberUpdate.jsp

 

WebConent => scipte => member.js

 

 

 

 

 

 

 

데이터 구성)

 

+ 시퀀스 1부터 시작해서 자동 1씩 증가

: Create SEQUENCE member_seq START WITH 1 INCREMENT BY 1;

 

 


MemberDAO

더보기

package com.jdh.dao;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import com.jdh.dto.MemberDTO;

public class MemberDAO {

 

//DB접속관련 공유 객체

public static MemberDAO instance = null;

 

//SingleTon 생성을 위한 private 생성자

private MemberDAO() {

}

 

//생성자가 private이기 때문에 외부에서 사용할수 없기 때문에 반환하는 메소드를 만들어준다.

/** MemberDAO 객체 생성후 반한 **/

public static MemberDAO getInstance() {

if(instance == null) {

instance = new MemberDAO();

}

//생성된 객체가 소멸될때까지 다시 생성되지 않기 때문에 싱글톤 방식이라고 한다.

return instance;

}//MemberDAO getInstance() END

 

 

 

 

 

/** Connection 객체 반환 **/

public Connection getConnection() {

Connection conn = null;

String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";

String id = "dahoon226";

String pw = "ekgns00";

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

conn = DriverManager.getConnection(url,id,pw);

} catch(ClassNotFoundException e) {

System.err.println("DRIVER ERR"+e.getMessage());

} catch(SQLException e) {

System.err.println("CONN ERR"+e.getMessage());

}

return conn;

}//Connection getConnection END

 

 

 

 

 

// 사용자 인증시(로그인) 사용하는 메소드

public int userCheck(String userid, String pwd) {

//아이디, 비밀번호 확인 결과값 (-1:아이디오류,0:비밀번호 오류, 1: 로그인성공)

int result=-1;

 

String query="SELECT pwd FROM member_tbl WHERE userid=?";

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

 

try {

conn = getConnection();

pstmt = conn.prepareStatement(query);

pstmt.setString(1, userid);

rs = pstmt.executeQuery();

 

if(rs.next()) {

if(rs.getString("pwd") != null && rs.getString("pwd").equals(pwd)) {

//로그인성공

result=1;

} else {

//비밀번호 틀림

result=0;

}

} else {

//아이디 틀림

result=-1;

}

 

} catch(SQLException e) {

System.err.println("아이디 조회 실패 "+e.getMessage());

} finally {

try {

if(rs != null) {rs.close();}

if(pstmt != null) {pstmt.close();}

if(conn != null) {conn.close();}

} catch(SQLException e) {

System.err.println("아이디 조회 자원해제 실패 "+e.getMessage());

}

}

 

return result;

}//userCheck(String userid, String pwd) END

 

 

 

 

 

 

// 아이디로 회원 정보 가져오는 메소드

public MemberDTO getMember(String userid) {

MemberDTO dto=null;

String query="SELECT * FROM mamber_tbl WHERE userid=?";

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

try {

conn = getConnection();

pstmt = conn.prepareStatement(query);

pstmt.setString(1, userid);

rs = pstmt.executeQuery();

 

if(rs.next()) {

dto = new MemberDTO();

dto.setName(rs.getString("name"));

dto.setUserid(rs.getString("userid"));

dto.setPwd(rs.getString("pwd"));

dto.setEmail(rs.getString("email"));

dto.setPhone(rs.getString("phone"));

dto.setAdmin(rs.getInt("admin"));

 

}

 

} catch(SQLException e) {

System.err.println("회원정보 가져오기 실패 "+e.getMessage());

} finally {

try {

if(rs!=null) {rs.close();}

if(pstmt!=null) {pstmt.close();}

if(conn!=null) {conn.close();}

} catch(SQLException e){

System.err.println("정보가져오기 자원해제 실패"+e.getMessage());

}

}

return dto;

}//getMember(String userid) END

 

 

 

 

 

// 아이디 중복 확인 메서드

public int confirmID(String userid) {

//아이디 검색 결과 (아이디 존재 : 1/존재하지않으면 -1)

int result=-1;

 

String query="SELECT userid FROM member_tbl WHERE userid=?";

Connection conn = null;

PreparedStatement pstmt = null;

ResultSet rs = null;

 

try {

conn = getConnection();

pstmt = conn.prepareStatement(query);

pstmt.setString(1, userid);

rs = pstmt.executeQuery();

 

if(rs.next()) {

result = 1;

} else {

result = -1;

}

 

} catch(SQLException e) {

System.err.println("중복 확인 실패 "+e.getMessage());

} finally {

try {

if(rs!=null) {rs.close();}

if(pstmt!=null) {pstmt.close();}

if(conn!=null) {conn.close();}

} catch(SQLException e) {

System.err.println("중복확인 자원 해제 실패"+e.getMessage());

}

}

 

return result;

}// confirmID(String userid) END

 

 

 

 

 

// 회원 가입 메서드

public int insertMember(MemberDTO dto) {

int result=-1;

 

String query="INSERT INTO member_tbl values (member_seq.nextval,?,?,?,?,?,?)";

Connection conn = null;

PreparedStatement pstmt = null;

try {

conn = getConnection();

pstmt = conn.prepareStatement(query);

pstmt.setString(1, dto.getName());

pstmt.setString(2, dto.getUserid());

pstmt.setString(3, dto.getPwd());

pstmt.setString(4, dto.getEmail());

pstmt.setString(5, dto.getPhone());

pstmt.setInt(6, dto.getAdmin());

 

result = pstmt.executeUpdate();

 

 

}catch(SQLException e) {

System.err.println("회원 가입 실패 "+e.getMessage());

} finally {

try {

if(pstmt!=null) {pstmt.close();}

if(conn!=null) {conn.close();}

}catch(SQLException e) {

System.err.println("회원가입 자원해제 실패"+e.getMessage());

}

}

return result;

}//insertMember(MemberDTO dto) END

 

 

 

 

 

// 회원 정보 수정 메서드

public int updateMember(MemberDTO dto) {

int result=-1;

 

String query="UPDATE member_tbl SET pwd=?,email=?,phone=?,admin=? WHERE userid=?";

Connection conn = null;

PreparedStatement pstmt = null;

try {

conn = getConnection();

pstmt = conn.prepareStatement(query);

pstmt.setString(1,dto.getPwd());

pstmt.setString(2,dto.getEmail());

pstmt.setString(3,dto.getPhone());

pstmt.setInt(4,dto.getAdmin());

pstmt.setString(5,dto.getUserid());

 

result = pstmt.executeUpdate();

 

}catch(SQLException e) {

System.err.println("정보수정 실패"+e.getMessage());

} finally {

try {

if(pstmt!=null) {pstmt.close();}

if(conn!=null) {conn.close();}

}catch(SQLException e) {

System.err.println("정보 수정 자원해제 실패"+e.getMessage());

}

}

return result;

}//updateMember(MemberDTO dto) END

}//MemberDAO END

 

MemberDTO

더보기

package com.jdh.dto;

public class MemberDTO {

private String name = null;

private String userid = null;

private String pwd = null;

private String email = null;

private String phone = null;

private int admin = 0;

public MemberDTO() {

}//기본 생성자

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getUserid() {

return userid;

}

public void setUserid(String userid) {

this.userid = userid;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public int getAdmin() {

return admin;

}

public void setAdmin(int admin) {

this.admin = admin;

}

@Override

public String toString() {

return "MemberDTO [name=" + name + ", userid=" + userid + ", pwd=" + pwd + ", email=" + email + ", phone="

+ phone + ", admin=" + admin + "]";

}

}

 

데이터


Index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index.jsp</title>
</head>
<body>
	<a href="login.do">로그인 페이지로 이동 : LoginServlet으로 이동(get방식 요청 : doGet() 호출)</a>
	LoginServlet : <br />
	이미 접속이 되어 있으면 main.jsp <br />
	처음 접속하면 member/login.jsp 
</body>
</html>

 

 

Index.jsp

LoginServlet.java(서블릿)으로 링크를 걸었다. (기본적으로 링크 태그는 전송 방식이 GET방식..!!)

만약 세션값을 가지고 있으면 서블릿 페이지에서 main.jsp로 보낼 것이고

세션값이 없다면 로그인을 해야하기 때문에 member폴더 안에 있는 login.jsp로 보낼것이다.

 

 

 

LoginServlet.java

더보기

package com.jdh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

 

@WebServlet("/login.do")

public class LoginServlet extends HttpServlet {

             private static final long serialVersionUID = 1L;

 

             protected void doGet(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

          // index.jsp의 링크에 의해 요청되어 자동 호출 됨

          String url = "member/login.jsp";

 

          //세션 값 얻어내기(session 이유 : 로그인 한 후에 해당 userid를 세션에 저장시키기 위해서!!)

          //=> 저장된 세션명 : "loginUser"으로 생성 할것이다.

          HttpSession session = request.getSession();

         if(session.getAttribute("loginUser") != null) {

                //값이 저장 되어있으면 url값을 main.jsp로 변경 시킬 것이다.

                //아이디가 있기 때문에 메인페이지로 이동. 

                 url="main.jsp";

         }

             RequestDispatcher rd = request.getRequestDispatcher(url);

             rd.forward(request, response);

          }

 

             protected void doPost(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

             //member/login.jsp에 의해 요청된다.

      }

}

로그인 서블릿은 세션값에 따라 페이지 이동을 명령하는 역할을 하게 된다.

 

index.jsp에서 링크를 타고 넘어온 방식(GET방식)이기 때문에 doGet()메소드에서 값을 처리한다.

먼저 서블릿은 session객체를 가지고 있지 않다. 그렇기 때문에 HttpSession 에서 요청을 통하여 session 객체를 생성해야한다. 

session객체가 생성 되었으면 값을 비교해야하는데 값이 들어있다면 로그인이 된것이기 때문에 main.jsp로 보낼것이고

없다면 로그인을 해야하기 때문에 login.jsp로 보낼것이다.

 

String url = "member/login.jsp"; 기본 url값으로 선언한것

 

현재는 값이 없으므로 login.jsp로 이동 될것이다.

 

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>login.jsp</title>
</head>
<body>
login.jsp는 두가지 값을 출력 : <br />
1.회원가입된 아이디 출력 <br />
2.가입 메세지 출력 <br />
 <h3>로그인 화면</h3>
   <form action="login.do" method="post">
     <table>
          <tr>
            <td>아이디</td>
            <td><input type="text" name="userid" value="${userid }" required="required" /></td>
          </tr>
          <tr>
            <td>비밀번호</td>
            <td><input type="password" name="pwd" required="required" /></td>
          </tr>
          <tr>
             <td colspan="2" align="center">
                <input type="submit" value="로그인" />
                <input type="reset" value="다시입력" />
                <input type="button" value="회원가입" onclick="location.href='join.do'" />
             </td>
          </tr>
          <tr>
             <td colspan="2">${message }</td>
          </tr>
     </table>
   </form>
</body>
</html>

로그인 버튼을 누르게 되면 다시 LoginServlet.java로 값이 보내지게 되는데 이때 보내는 방식은 POST방식이다

이때 LoginServlet.java 에서 doPost()메소드가 실행되게 된다.

 

 

회원가입을 누르면 로그인과 마찬가지로 회원가입을 담당하는 서블릿 ( JoinServlet.java )로 이동

** 이때 보내는 방식은 GET방식으로 보내진다. (button)

 

** 아래쪽에 보면 message 변수가 있다.

아직 Join서블릿의 post메소드 쪽을 작성을 하지 않았기 때문에 출력이 안되는것!!

 

더보기

package com.jdh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

@WebServlet("/join.do")

     public class JoinServlet extends HttpServlet {

     private static final long serialVersionUID = 1L;

 

     protected void doGet(HttpServletRequest request, HttpServletResponse response)

     throws ServletException, IOException {

          //login.jsp에서 회원가입을 눌렀을때

          //여기서는 회원가입 화면(member/join.jsp)만 응답처리할 것이다.

     RequestDispatcher rd = request.getRequestDispatcher("member/join.jsp");

     rd.forward(request, response);

     }

 

protected void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

          //회원가입 화면(member/join.jsp)에서 입력값을 모두 입력 후, 가입 버튼을 눌렀을 때

 

    }

}

회원가입 서블릿은 다른 서블릿과 다르게 값을 비교해서 명령을 내리는 것이 아니기 때문에 페이지 전환만 해주면 된다.

회원가입 버튼을 눌러 GET방식으로 보내진 명령은 서블릿의 doGet()메소드를 호출하게 되고

join.jsp에서 회원가입 버튼을 누르게 되면 POST방식으로 보내지기 때문에 그때는 doPost() 메소드가 호출 될 것!!

 

**  request로 넘어오지 않고 session으로 값을 저장해놨기 때문에 RequestDispatcher를 통하여 포워딩 

 

 

join.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>회원가입화면</title>
<script type="text/javascript" src="script/member.js" ></script>
</head>

<body>
	<h2>회원 가입 화면</h2>
	<br />
	'*' 표시 항목은 필수 입력 항목입니다. <br />
	
	<form action="join.do" method="post" name="frm">
		<table>
			<tr>
			   <td>이름</td>
			   <td><input type="text" name="name" size="20" required="required" />*</td>
			</tr>
			<tr>
			   <td>아이디</td>
			   <td>
				 <input type="text" name="userid" size="20" required="required" />
				 <input type="hidden" name="reid" size="20" />
				 <input type="button" value="중복확인" onclick="idCheck()" />
			   </td>
			</tr>
			<tr>
			   <td>비밀번호</td>
			   <td><input type="password" name="pwd" size="20" required="required" />*</td>
			</tr>
			<tr>
			   <td>비밀번호 확인</td>
			   <td><input type="password" name="pwd_check" size="20" required="required" />*</td>
			</tr>
			<tr>
			   <td>이메일</td>
			   <td><input type="email" name="email" size="20" /></td>
			</tr>
			<tr>
			   <td>전화번호</td>
			   <td><input type="tel" name="phone" size="20" /></td>
			</tr>
			<tr>
			   <td>등급</td>
			   <td>
			     <input type="radio" name="admin" value="0" checked="checked" /> 일반회원
			     <input type="radio" name="admin" value="1" /> 관리자
		       </td>
			</tr>
			<tr>
			   <td colspan="2">
			     <input type="submit" value="가입하기" onclick="return joinCheck()" />
			     <input type="reset" value="취소" />
			   </td>
			</tr>
			<tr>
			   <td colspan="2">${message }</td>
			</tr>
		</table>
	</form>
	
</body>
</html>

먼저 <head> 태그 사이에 사용할 자바 스크립트 파일을 추가 시켜줘야한다.

 

자바 스크립트파일

더보기

function loginCheck() {

if (document.frm.userid.value.length == 0) {

     alert("아이디를 써주세요");

     frm.userid.focus();

return false;

}

if (document.frm.pwd.value == "") {

     alert("암호는 반드시 입력해야 합니다.");

     frm.pwd.focus();

return false;

}

return true;

}

 

 

function idCheck() {

if (document.frm.userid.value == "") {

     alert('아이디를 입력하여 주십시오.');

     document.formm.userid.focus();

return;

}

var url = "idCheck.do?userid=" + document.frm.userid.value;

window.open(url, "_blank_1", "toolbar=no, menubar=no, scrollbars=yes, resizable=no, width=450, height=200");

}

 

 

function idok(userid) {

     opener.frm.userid.value = document.frm.userid.value;

     opener.frm.reid.value = document.frm.userid.value;

self.close();

}

 

 

function joinCheck() {

if (document.frm.name.value.length == 0) {

     alert("이름을 써주세요.");

     frm.name.focus();

return false;

}

if (document.frm.userid.value.length == 0) {

     alert("아이디를 써주세요");

     frm.userid.focus();

return false;

}

if (document.frm.userid.value.length < 4) {

     alert("아이디는 4글자이상이어야 합니다.");

     frm.userid.focus();

return false;

}

if (document.frm.pwd.value == "") {

     alert("암호는 반드시 입력해야 합니다.");

     frm.pwd.focus();

return false;

}

if (document.frm.pwd.value != document.frm.pwd_check.value) {

     alert("암호가 일치하지 않습니다.");

     frm.pwd.focus();

return false;

}

if (document.frm.reid.value.length == 0) {

     alert("중복 체크를 하지 않았습니다.");

     frm.userid.focus();

return false;

}

return true;

}

회원가입 버튼을 누르게 되면 바로 서블릿으로 보내는게 아니라 자바 스크립트 내의 함수를 먼저 비교하게 된다!!

: submit 쪽에 onclick="return joinCheck()"

자바 스크립트 내의 joinCheck()함수를 살펴보자

ex)

if (document.frm.name.value.length == 0) {

alert("이름을 써주세요.");

frm.name.focus();

return false;

}

 

document => 현재 body태그 사이의 영역 중에

frm => 이름이 frm인 영역 사이에서 (form 태그에 name속성명으로 frm으로 지정해준것을 볼 수 있다.)

name => 이름이 name인 영역을 찾아

value => 그 영역의 값을 꺼내어

length == 0 => 길이를 비교하는데 이 조건과 일치하면 아래 구문 실행 아니면 if문을 빠져나온다.(return)

 

alert은 경고창을 띄어주는 자바 스크립트 함수이고

frm.name.focus(); => focus()는 말그대로 해당영역에 마우스 커서를 가져다 놓는다.(자바스크립트 함수) 

 

회원가입 화면

아이디 중복 체크)

글로 정리하면서 코드도 한번 더 읽고는 있지만

아직 자바스크립트를 배우지 않아서 완전히 이해가 되는건 아니다...

 

다만 기능부분에서는 이해가 됐다.

아이디입력 칸을 보면 input이 3개로 나눠져있다.

첫번째 : input태그 => 입력값을 받게 되는곳

두번째 : input태그 => 이때 타입이 hidden -> 사용자 눈에는 보이지 않지만 서버내의 값이 전송된다.

세번째 : input태그 => 이 때 onclick에서 자바스크립트 함수가 사용되어 값을 확인하게된다.

 

idCheck()

var url = "idCheck.do?userid=" + document.frm.userid.value(입력한값,즉 첫번째 input태그);

**  IdCheck.java 서블릿 페이지로 보내는데 이 때 파라미터 값이 입력된 아이디값으로 보낸다.

window.open(url, "_blank_1", "toolbar=no, menubar=no, scrollbars=yes, resizable=no, width=450, height=200");

window.open => 새창을 열는데 이때 url값을 지정해줬으니 이 페이지를 열게된다.

뒤에는 대충 자바스크립트 내용인데....이번 실습은 스크립내용이 아니라 일단은 패스...

 

IdCheckServlet.java

더보기

package com.kkh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import com.kkh.dao.MemberDAO;

 

@WebServlet("/idCheck.do")

public class IdCheckServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

     throws ServletException, IOException {

// join.jsp => 중복체크버튼 => script/member.js => idCheck() 내에서 window.open()로 요청

     String userid=request.getParameter("userid");

 

     MemberDAO dao=MemberDAO.getInstance();

     int result=dao.confirmID(userid); // 1(아이디존재) / -1 (아이디존재하지 않을 경우)

 

     request.setAttribute("userid", userid);

     request.setAttribute("result", result);

     RequestDispatcher rd=request.getRequestDispatcher("member/idcheck.jsp");

     rd.forward(request, response);

}

     protected void doPost(HttpServletRequest request, HttpServletResponse response)

     throws ServletException, IOException {

 

     }

}

idCheck.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>아이디 중복 확인</title>
<script type="text/javascript" src="script/member.js" ></script>
</head>

<body>
  <h3>아이디 중복 확인</h3>
  <form action="idCheck.do" method="get" name="frm">
     아이디 <input type="text" name="userid" value="${userid }" /> 
            <input type="submit" value="중복체크" />
            <br/>
       <c:if test="${result == 1 }">
             <script type="text/javascript">
                  opener.document.frm.userid.value="";
             </script>
             ${userid }는 이미 사용중인 아이디 입니다.
        </c:if>
        <c:if test="${result == -1 }">
             ${userid }는 사용가능한 아이디 입니다.
            <input type="button" value="사용" onclick="idok('${userid}')" />
        </c:if>			
   </form>
</body>
</html>

 

JSP내에서 if문을 사용하기 위해서 태그라이브러리 사용

 

 

새창을 띄어서 중복 체크

 

해당 칸을 다 입력하면 조건문에 해당되는것이 없기 때문에 return true;를 반환하게 되어 값을 보낸다

이때 <form>태그에 action으로 다시 JoinServlet으로 보내는데 방식은 POST방식으로 보내져서

서블릿의 doPost()메소드를 실행시킨다.

 

 

다시 서블릿으로 넘어가서 doPost부분을 완성시키자.

JoinServlet.java의 doPost()

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//회원가입 화면(member/join.jsp)에서 입력값을 모두 입력 후, 가입 버튼을 눌렀을 때
		request.setCharacterEncoding("UTF-8");
		
		MemberDTO dto = new MemberDTO();
		dto.setName(request.getParameter("name"));
		dto.setUserid(request.getParameter("userid"));
		dto.setPwd(request.getParameter("pwd"));
		dto.setEmail(request.getParameter("email"));
		dto.setPhone(request.getParameter("phone"));
		dto.setAdmin(Integer.parseInt(request.getParameter("admin")));
		
		MemberDAO dao = MemberDAO.getInstance();
		int result = dao.insertMember(dto);
		
		HttpSession session = request.getSession();
		if(result == 1) {
			//초기 로그인 화면에서 아이디를 바로 출력하기 위한 코드
			session.setAttribute("userid", dto.getUserid());
			session.setAttribute("message", "회원 가입에 성공했습니다.");
		} else {
			session.setAttribute("message", "회원 가입에 실패했습니다.");
		}
		
		RequestDispatcher rd = request.getRequestDispatcher("member/login.jsp");
		rd.forward(request, response);
	}

POST방식은 한글을 출력하지 못하기 때문에 인코딩이 필요

데이터를 이동 시켜주는 클래스 DTO

DTO객체를 생성해서 회원가입 페이지에서 넘어온 파라미터값들을 저장시켜준다.

 

DTO객체에 값을 저장했으면 이제 이 값을 데이터 베이스에 저장시켜야한다.

데이터 베이스에 접근하는 클래스 MemberDAO클래스의 객체를 생성하여 값을 저장

 

insertMember(dto);메소드를 보면 int값을 반환한다. 그래서 반환값을 session에 저장해서 다른페이지에서도 사용할 수 있게 할 것이다.

 

가입 메세지와 가입한 아이디가 자동으로 입력된다.

 

** 데이터베이스에서도 정확히 저장 됐는지 확인해야한다.

 

 

회원가입도 끝났고 세션에도 값이 저장 되었으니 이제 로그인 기능 마무리

 

다시 LoginServlet.java (로그인 서블릿)으로 이동한다.=> doPost() 마무리

 

LoginServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//member/login.jsp에 의해 요청된다.
		//로그인 실패시 다시 이동해야하기 떄문에 기본값 설정
		String url = "member/login.jsp";
		
		String userid = request.getParameter("userid");
		String pwd = request.getParameter("pwd");
		//이 두값을 가지고 값을 비교해야하므로
		MemberDAO dao = MemberDAO.getInstance();
		
		int result = dao.userCheck(userid, pwd);
		
		if(result == 1) {
			//로그인 성공
			MemberDTO dto = dao.getMember(userid);
			
			HttpSession session = request.getSession();
			session.setAttribute("loginUser", dto);
			
			request.setAttribute("message", "로그인 되었습니다.");
			url = "main.jsp";
		} 
		else if(result == 0) {
			//비밀번호 틀림
			request.setAttribute("message", "비밀번호가 틀렸습니다.");
		} 
		else if(result == -1) {
			//아이디 없음
			request.setAttribute("message", "존재하지 않는 아이디 입니다.");
		}
		RequestDispatcher rd = request.getRequestDispatcher("url");
		rd.forward(request, response);
	}

DAO클래스의 로그인 체크 기능을 가진 메소드 userCheck()메소드는 3개의 값을 반환하게 만들어놨다.

1을 반환하면 로그인 성공

0은 비밀번호가 틀린것

-1은 아이디가 존재하지 않는것

 

첫번째 조건문 if문이 맞다면 페이지를 main.jsp로 변경해야하기 때문에 기본값으로 설정해놨던 변수 url의 값을 변경 시켜줘야한다. 또한 2개의 변수 loginUser와 message 를 보낼 것이기 때문에 session 객체를 만들어 저장시킨다.

 

** 세션명을 잘 확인해서 값을 넘겨주기

 

 

Main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<c:if test="${empty loginUser }">
	<jsp:forward page="login.do"></jsp:forward>
</c:if>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main.jsp</title>
</head>

<body>
  <h3>여기는 로그인 후 화면</h3>
  <h4>회원 전용 페이지</h4>
    <form action="logout.do">
       <table>
          <tr>
            <td>안녕하세요${loginUser.name } (${loginUser.userid }) 님</td>
          </tr>
          <tr>
              <td>
                <input type="submit" value="로그아웃" /> 
                <input type="button" value="개인정보수정" onclick="location.href='memberUpdate.do?userid=${loginUser.userid}'" />
              </td>
          </tr>
       </table>
     </form>
</body>
</html>

loginUser이라는 세션명안에 dto가 가진 모든 정보가 들어가있다.

그렇기에 세션명에서 값을 추출할 수가 있다.

 

근데 왜 이름이 안나왔지..

 

 

 

**  복습겸 다시 만들어서 해결

 

 

 

LogoutServlet.java

더보기

package com.jdh.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/logout.do")

public class LogoutServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

 

     protected void doGet(HttpServletRequest request, HttpServletResponse response)

     throws ServletException, IOException {

//main.jsp의 로그아웃 버튼

      HttpSession session = request.getSession();

//세션 데이터 삭제

     session.invalidate();

 

     RequestDispatcher rd = request.getRequestDispatcher("member/login.jsp");

     rd.forward(request, response);

}

 

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

 

    }

}

 

로그아웃버튼 눌렀을 경우 세션에 있는 모든 값을 삭제한 후 login.jsp로 이동

 


728x90
반응형