본문 바로가기

Study

[JSP] 게시판 만들기 - 로그인

 

 


 

게시판 폼 만들기

WebContent/views/common/menubar.jsp 생성

 

<%@page import="com.yh.member.model.vo.Member"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Member loginUser = (Member)session.getAttribute("loginUser");
	// 로그인 시도 전 menubar.jsp 로딩시 : null
	// 로그인 성공 후 menubar.jsp 로딩시 : 로그인 성공한 회원의 정보가 담겨있는 Member 객체
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
    .login-area>* {float: right;}
    .login-area a {
        text-decoration: none;
        color: black;
        font-size: 12px;
    }
    .nav-area {background-color: #E0BFE6 ;}
    .menu {
        display: table-cell;
        width: 150px;
        height: 50px;
    }
    .menu a {
        text-decoration: none;
        color: white;
        font-size: 20px;
        font-weight: bold;
        display: block;
        width: 100%;
        height: 100%;
        line-height: 50px;
    }
    .menu a:hover {background-color: #C7A9CC;}
</style>
</head>
<body>
    <h1 align="center" style="color: #A28AA6;">Welcome</h1>

    <div class="login-area">

		<% if (loginUser == null) { %>
		<!-- case1. 로그인 전 -->
		<form action="/jsp/login.me" method="post">
			<table>
				<tr>
					<th>아이디</th>
					<td><input type="text" name="userId"></td>
				</tr>
				<tr>
					<th>비밀번호</th>
					<td><input type="password" name="userPwd"></td>
				</tr>
				<tr>
					<th colspan="2">
						<button type="submit">로그인</button>
						<button type="button">회원가입</button>
					</th>
				</tr>
			</table>
		</form>

		<% } else { %>
		<!-- case2. 로그인 후 -->
		<div>
			<b><%= loginUser.getUserName() %> 님</b>의 방문을 환영합니다. <br>
			<br>
			<div>
				<a href="#">마이페이지</a> <a href="#">로그아웃</a>
			</div>
		</div>
		<% } %>

	</div>

    <br clear="both">
    <br>

    <div class="nav-area" align="center">
        <!-- (.menu>a)*4 -->
        <div class="menu"><a href="#">HOME</a></div>
        <div class="menu"><a href="#">공지사항</a></div>
        <div class="menu"><a href="#">일반게시판</a></div>
        <div class="menu"><a href="#">사진게시판</a></div>
    </div>


</body>
</html>

 

LoginController

src/com/yh/member/controller/LoginController.java 생성

package com.yh.member.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;
import javax.websocket.Session;

import com.yh.member.model.service.MemberService;
import com.yh.member.model.vo.Member;

/**
 * Servlet implementation class LoginController
 */
@WebServlet("/login.me")
public class LoginController extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1) 전달값에 한글이 있을 경우 인코딩 처리해주기 (post 방식에서만)
		request.setCharacterEncoding("UTF-8");

		// 2) 요청시 전달값 뽑아서 변수 또는 객체에 기록하기
		String userId = request.getParameter("userId");
		String userPwd = request.getParameter("userPwd");

		// 3) 요청 처리 (db에 sql문 실행)
		//	  해당 요청을 처리하는 서비스 클래스의 메소드 호출 및 결과 받기
		Member loginUser = new MemberService().loginMember(userId, userPwd); // null 혹은 로그인한 멤버 객체 담김

		// 4) 처리된 결과를 가지고 사용자가 보게될 응답뷰(jsp)지정 후 포워딩 또는 url 재요청

		if (loginUser == null) {
			// 조회 결과 없음 == 로그인 실패 => 에러 문구가 보여지는 에러페이지 응답
			request.setAttribute("errorMsg", "로그인 실패했습니다.");

			// 응답페이지(jsp)에게 위임시 필요한 객체 (RequestDispatcher)
			// 포워딩 방식 
			RequestDispatcher view = request.getRequestDispatcher("views/common/errorPage.jsp");
			view.forward(request, response);

		} else {
			// 조회 결과 있음 == 로그인 성공 => 메인페이지 응답 (index.jsp)

			// 로그인한 회원정보(loginUser)를 session에 담기

			// Servlet에서는 session에 접근하고자 한다면 우선 세션 객체 얻어와야함
			HttpSession session = request.getSession();

			session.setAttribute("loginUser", loginUser);

			// 1. 포워딩 방식 응답 뷰 출력
			//	  해당 선택된 jsp가 보여질 뿐 url에는 여전히 현재 이 서블릿 매핑값이 남아있음
			//	  localhost:8001/jsp/login.me
			// RequestDispatcher view = request.getRequestDispatcher("index.jsp");
			// view.forward(request, response);
			
			// 2. url 재요청 방식 (sendRedirect 방식)
			//	  기존에 저 페이지를 응답하는 url이 존재한다면 사용 가능
			//	  localhost:8001/jsp
			// response.sendRedirect("/jsp");
			
			response.sendRedirect(request.getContextPath()); // "/jsp"
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

응답페이지에 전달한 값이 있을 경우 담을 수 있는 영역(jsp 내장객체) 필요함

 jsp 내장객체

1) application : 웹 애플리케이션 전역에서 다 꺼내서 쓸 수 있음
2) session : 내가 직접 지우기 전까지, 세션이 만료(서버 멈춤, 브라우저 종료)되기 전까지 유효함
3) request : 현재 이 request 객체를 포워딩한 응답 jsp에서만 꺼내 쓸 수 있음 (일회성 느낌)
4) page : 해당 jsp에서 담고 그 jsp에서만 꺼내 쓸 수 있음

공통적으로 데이터를 담고자 한다면 .setAttribute("K",V);
꺼내고자 한다면 .getAttribute("K") => Object 타입으로 뱉음 (다운캐스팅 해줘야 됨)
지우고자 한다면 .removeAttribute("K");

 

LogoutController

src/com/yh/member/controller/LogoutController.java 생성

package com.yh.member.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;

/**
 * Servlet implementation class LogoutController
 */
@WebServlet("/logout.me")
public class LogoutController extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 로그아웃 요청 처리 => session 만료 시키기 == 세션을 무효화 시키기
		// HttpSession session = request.getSession();
		// session.invalidate();

		// 위의 두 줄을 한 줄로!
		request.getSession().invalidate();

		// 응답페이지 => index 페이지 => url 재요청
		// response.sendRedirect("/jsp");
		response.sendRedirect(request.getContextPath()); // == /jsp

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

member Vo

src/com/yh/member/model/vo/Member.java

package com.yh.member.model.vo;

import java.util.Date;

public class Member {

	// 필드부 선언
	private int userNo;
	private String userId;
	private String userPwd;
	private String userName;
	private String phone;
	private String email;
	private String address;
	private String interest;
	private Date enrollDate;
	private Date modifyDate;
	private String status;

	// 기본생성자
	public Member() {}

	// 매개변수생성자
	public Member(int userNo, String userId, String userPwd, String userName, String phone, String email,
			String address, String interest, Date enrollDate, Date modifyDate, String status) {
		super();
		this.userNo = userNo;
		this.userId = userId;
		this.userPwd = userPwd;
		this.userName = userName;
		this.phone = phone;
		this.email = email;
		this.address = address;
		this.interest = interest;
		this.enrollDate = enrollDate;
		this.modifyDate = modifyDate;
		this.status = status;
	}

	// setter/getter	
	public int getUserNo() {
		return userNo;
	}

	public void setUserNo(int userNo) {
		this.userNo = userNo;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserPwd() {
		return userPwd;
	}

	public void setUserPwd(String userPwd) {
		this.userPwd = userPwd;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getInterest() {
		return interest;
	}

	public void setInterest(String interest) {
		this.interest = interest;
	}

	public Date getEnrollDate() {
		return enrollDate;
	}

	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}

	public Date getModifyDate() {
		return modifyDate;
	}

	public void setModifyDate(Date modifyDate) {
		this.modifyDate = modifyDate;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	// toString
	@Override
	public String toString() {
		return "Member [userNo=" + userNo + ", userId=" + userId + ", userPwd=" + userPwd + ", userName=" + userName
				+ ", phone=" + phone + ", email=" + email + ", address=" + address + ", interest=" + interest
				+ ", enrollDate=" + enrollDate + ", modifyDate=" + modifyDate + ", status=" + status + "]";
	}


}

 

loginMember mapper

src/db/sql/member-mapper.xml 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<entry key="loginMember">
	SELECT
		  USER_NO
		, USER_ID
		, USER_PWD
		, USER_NAME
		, PHONE
		, EMAIL
		, ADDRESS
		, INTEREST
		, ENROLL_DATE
		, MODIFY_DATE
		, STATUS
	 FROM MEMBER
	WHERE USER_ID = ?
	  AND USER_PWD = ?
	  AND STATUS = 'Y'
	</entry>
</properties>

 

loginMember Dao

src/com/kh/member/model/dao/MemberDao.java 생성

package com.yh.member.model.dao;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.yh.common.JDBCTemplate;
import com.yh.member.model.vo.Member;

public class MemberDao {

	private Properties prop = new Properties();

	public MemberDao() {
		String filePath = MemberDao.class.getResource("/db/sql/member-mapper.xml").getPath();
		try {
			prop.loadFromXML(new FileInputStream(filePath));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public Member loginMember(Connection conn, String userId, String userPwd) {
		// select문 => ResultSet 객체 (한행) => Member 객체
        
		Member m = null;

		PreparedStatement pstmt = null;
		ResultSet rset = null;

		String sql = prop.getProperty("loginMember");

		try {
			pstmt = conn.prepareStatement(sql); // 미완성된 sql문

			pstmt.setString(1, userId);
			pstmt.setString(2, userPwd);

			rset = pstmt.executeQuery(); // 조회 결과가 있다면 한 행 | 조회 결과가 없다면 아무것도 안담김

			if (rset.next()) {
				m = new Member(rset.getInt("user_no"),
							   rset.getString("user_id"),
							   rset.getString("user_pwd"),
							   rset.getString("user_name"),
							   rset.getString("phone"),
							   rset.getString("email"),
							   rset.getString("address"),
							   rset.getString("interest"),
							   rset.getDate("enroll_date"),
							   rset.getDate("modify_date"),
							   rset.getString("status"));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rset);
			JDBCTemplate.close(pstmt);
		}

		return m;
	}
}

 

loginMember Service

src/com/yh/member/model/service/MemberService.java 생성

package com.yh.member.model.service;

import java.sql.Connection;

import com.yh.common.JDBCTemplate;
import com.yh.member.model.dao.MemberDao;
import com.yh.member.model.vo.Member;

public class MemberService {

	public Member loginMember(String userId, String userPwd) {

		// connection 객체 생성
		Connection conn = JDBCTemplate.getConnection();

		// dao 호출
		Member m = new MemberDao().loginMember(conn, userId, userPwd);

		JDBCTemplate.close(conn);

		return m;
	}
}

 

실행화면

로그인 화면

로그인 성공시

로그인 실패시