22.03.14 Web Server MVC패턴3 - 로그인 정보 가져오기, 회원정보 수정

최고고·2022년 3월 14일
0
post-custom-banner

MVC패턴2 (회원가입 성공화면, ID중복체크)


로그인 정보 저장 -> session 생성

  • 로그인 정보를 DB와 비교를 하고, 사용자의 email을 띄워줌

  • main.jsp의 로그인 부분 ↓

<ul class="links">
			<li><h5>로그인</h5></li>
			<form action="LoginServiceCon" method = "post">
				<li><input type="text" name="loginemail" placeholder="Email을 입력하세요"></li>
				<li><input type="password" name="pw" placeholder="PW를 입력하세요"></li>
				<li><input type="submit" value="LogIn" class="button fit"></li>
			</form>
		</ul>
  • ↓ Model package의 memberDAO 로그인메소드 ↓

    -login메소드의 매개변수는 사용자로 입력받은 email, pw --> DB와 비교함
    ->sql의 조건절이 where email=? and pw = ?
    -select문의 결과값이 테이블형태로 네가지 정보를 가지고 오기 때문에 MemberDTO 변수에 담아줌! --> 리턴이 MemberDTO dto인데, dto를 try~catch문 끝나고 나서도 필요하기때문에 클래스영역에 전역변수로 선언해줬다.
public MemberDTO login(String email, String pw) {
		dbconn();
		try {
			//사용자가 입력한 정보가 있는지 없는지 확인 필요값 불러오기
			String sql = "select * from web_member2 where email=? and pw = ?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, email);
			psmt.setString(2, pw);
			rs = psmt.executeQuery();
			if(rs.next()) {			//true일때만 실행이됨, 해당값이 있을때만 if문
				email = rs.getString(1);
				pw = rs.getString(2);
				String tel = rs.getString(3);
				String address  = rs.getString(4);
				//실행결과
				dto = new MemberDTO(email, pw, tel, address);
				
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			dbclose();
			
		}
		return dto;
	}
  • ↓ Controller package에 메인의 폼태그에서 요청한 LoginServiceCon을 생성한다 ↓

    -메인에서 넘어오는 파라미터 수집 후, login메소드의 매개변수로 담아줌 --> login(email, pw)
    -로그인 성공이라면 if (dto!=null) T일때 확인차 콘솔창에 출력하고(생략가능), 세션을 생성해준다.
    -서블릿에서는 객체 생성->이름,값 지정 순으로 해준다!get-set 순
    -로그인 성공or실패 모두 메인으로 페이지 전환 sendRedirect
package Controller;

import java.io.IOException;
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;

import Model.MemberDTO;
import Model.memberDAO;

@WebServlet("/LoginServiceCon")
public class LoginServiceCon extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LoginServiceCon]");
		//post방식 인코딩
		request.setCharacterEncoding("euc-kr");
		String email = request.getParameter("loginemail");
		String pw = request.getParameter("pw");
		
		//login 메소드
		MemberDTO dto = new memberDAO().login(email, pw);
		
		//성공 실패 여부 따지기
		if(dto != null) {
			System.out.println("로그인성공");
			System.out.println(dto.getEmail());
			HttpSession session = request.getSession();
			session.setAttribute("info", dto);
		}else {
			System.out.println("로그인실패");
		}
		
		response.sendRedirect("main.jsp");
		
	}	

}
  • ↓ 다시 메인에서 ->session정보 가져오기 ↓

    메인페이지의 바디태그 바로 아래, 스크립틀릿 작성
    리턴이 MemberDTO이기 때문에, 가져온 MemberDTO타입으로 다운캐스팅!
<body>
<%
	//세션의 회원정보 가져오기
	//로그인 성공시 info라는 이름으로 담아준 세션의 정보가있고, 로그인 실패 or 하지않은상태라면 null
	//가져오는 데이터타입이 MemberDTO 
	
	MemberDTO info = (MemberDTO)session.getAttribute("info");
	

%>
  • ↓ 로그인 성공시 헤더쪽 ↓


    -스크립틀릿에 (java문법) if문 달아줌
    -성공 시 a태그 안에 회원정보수정 / 로그아웃 맵핑해줌
    -실패 시 로그인 창만 뜨게해준다.
		<!-- Header -->
		<header id="header" class="alt"> <a href="index.html"
			class="logo"><strong>Forty</strong> <span>by HTML5 UP</span></a> 
			<nav>
			<% if(info != null){ %>
			<a href="update.jsp">개인정보수정<a>
			<a href="LogoutServiceCon">로그아웃<a>
			<%} else {%>
				<a href ="#menu">로그인<a> 
			<%} %>
		<!-- 로그인 후 Logout.jsp로 이동할 수 있는'로그아웃'링크와 '개인정보수정'링크를 출력하시오. -->
		</nav> </header>
  • ↓ 로그인 성공시 배너 쪽 ↓

<header class="major">
			<% if(info!=null){ %>
			<h1> <%= info.getEmail() %> 님 환영합니다!</h1>
			<%} else{ %>
			<h1> 로그인한 세션 아이디를 출력해주세요</h1>
			<%} %>
			
			<!-- 로그인 후 로그인 한 사용자의 세션아이디로 바꾸시오.
									 ex)smart님 환영합니다 --> </header>

회원 정보 수정

선행 작업 : 로그인한 상태에서 세션이 만들어지고 나서 회원정보를 수정할 수 있다.

<a href="update.jsp">개인정보수정<a>

  • ↓ 개인정보를 수정하는 update.jsp ↓

    -로그인정보를 불러오기위해 body태그 아래 아까 만들었던 세션을 불러온다.
    MemberDTO info = (MemberDTO)session.getAttribute("info");
    -li태그에 표현식<%= info.getEmail() %>
    -수정값을 입력받는 폼태그를 보낼 주소 UpdateServiceCon
    -각 input태그에 type과 name값 지정해준다
    -사용자 메일은 로그인할때 이미 입력받았기때문에 또 입력받지 않고 type을 hidden으로 하면 화면에 나타나지않음 --> value(값, 또는 기본값)으로 표현식 <%= info.getEmail() %>
<%@page import="Model.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>Forty by HTML5 UP</title>
		<meta charset="utf-8" />
		<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
		<!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]-->
		<link rel="stylesheet" href="assets/css/main.css" />
		<!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]-->
		<!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]-->
		
	</head>
	<style>
	
	</style>
	<body style="text-align: center;">
 	<%
 	MemberDTO info = (MemberDTO)session.getAttribute("info");
 	
 	
 	%>
		<!-- Wrapper -->
			<div id="wrapper">
				<!-- Menu -->
					<nav id="Update">	
						<ul class="actions vertical">
							<li><h5>회원정보수정</h5></li>
								<form action="UpdateServiceCon" method="post">
									<li>접속한 Email : <%= info.getEmail() %></li>
									<li><input type="password" name="pw" placeholder="PW를 입력하세요" style="width: 500px; margin: 0 auto;"></li>
									<li><input type="text" name="tel" placeholder="전화번호를 입력하세요" style="width: 500px; margin: 0 auto;"></li>
									<li><input type="text" name="address"  placeholder="집주소를 입력하세요" style="width: 500px; margin: 0 auto;"></li>
									<li><input type="hidden" name="email" value="<%=info.getEmail() %>"></li>
									<li><input type="submit" value="JoinUs" class="button fit" style="width: 500px; margin: 0 auto;"></li>
								</form>
						</ul>
					</nav>			
			</div>
  • ↓ Model package의 memberDAO에 수정 값 Update하는 메소드 ↓

    -update메소드의 매개변수는 사용자로부터 입력받은 email,pw,tel,address 4가지를 담고있는 MemberDTO dto
    ->update의 조건절은 email
    ->변경내용은 pw,tel,address
    --->psmt.setString 순서 유의하기
    -결과값 rows -> 정수형으로 반환되기때문에 리턴은 int update, 역시 try~catch이후에도 쓰이기 때문에 전역변수로 선언함
public int update(MemberDTO dto) {
		dbconn();
		try {
			String sql ="update web_member2 set pw=?, tel=?, address=? where email=?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, dto.getPw());
			psmt.setString(2, dto.getTel());
			psmt.setString(3, dto.getAddress());
			psmt.setString(4, dto.getEmail());
			
			cnt = psmt.executeUpdate(); 
			
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			dbclose();
		}
		return cnt;
	}
  • ↓ controller package에 update.jsp 폼태그에서 요청한 UpdateServiceCon 생성 ↓

    -post방식 인코딩, 폼태그에서 넘어오는 파라미터 수집 -> 여러번 쓰이기 때문에 MemberDTO dto 변수에 담아 데이터 담아줌
    -update메소드에 수집한 dto를 매개변수로 담아 호출하고 리턴이 int이기 때문에 int 변수에 담아줌
    -결과값이 0이상일때 (회원정보 수정 성공) 기존과 변경된 세션 정보를 갱신
    -메인으로 이동시킴 sendRedirect
package Controller;

import java.io.IOException;
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;

import Model.MemberDTO;
import Model.memberDAO;

@WebServlet("/UpdateServiceCon")
public class UpdateServiceCon extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[UpdateServiceCon]");
		
		request.setCharacterEncoding("euc-kr");
		String email = request.getParameter("email");
		String pw = request.getParameter("pw");
		String tel = request.getParameter("tel");
		String address = request.getParameter("address");
		System.out.println("email : "+email);
		System.out.println("pw : "+ pw);
		System.out.println("tel : "+ tel );
		System.out.println("address : "+ address );
		
		MemberDTO dto = new MemberDTO(email, pw, tel, address);
		int cnt = new memberDAO().update(dto);
//		int cnt = new memberDAO().update(new MemberDTO(email, pw, tel, address));
		
		if(cnt>0) {
			System.out.println("회원정보 수정 성공");
			//성공시 session에 새로운 정보로 update
			HttpSession session = request.getSession();
			session.setAttribute("info", dto);
			
		}else {
			System.out.println("회원정보 수정 실패");
		}
		response.sendRedirect("main.jsp");
	}

}

로그아웃하기

<a href="LogoutServiceCon">로그아웃<a>

  • 로그아웃 a태그
  • ↓ controller package에 메인 a태그를 누르면 이동하는 LogoutServiceCon생성 ↓

    -로그인 정보를 삭제해주기
    -세션정보 가져와서(request.getSession) .removeAttribute("세션이름");
    -세션을 지우고 메인으로 이동시킴 sendRedirect
package Controller;

import java.io.IOException;
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("/LogoutServiceCon")
public class LogoutServiceCon extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LogoutServiceCon]");
		//로그아웃 : 로그인한 정보 삭제 
		HttpSession session = request.getSession();
//		session.invalidate();  페이지에사용되는 모든 세션 삭제 => 세션삭제
		session.removeAttribute("info");
		
		System.out.println("로그아웃 성공");
		response.sendRedirect("main.jsp");
	}

}
post-custom-banner

0개의 댓글