menubar 부분.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.kh.member.model.vo.Member"%>
<%
//System.out.println(request.getContextPath()); => /jsp
String contextPath = request.getContextPath();
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>
</head>
<style>
#login-form, #user-info {float:right}
#user-info a{
text-decoration: none;
color: black;
font-size: 12px;
}
.nav-area{background:rgb(175, 194, 230)}
.menu{
display:table-cell;
height: 50px;
width: 150px;
}
.menu a{
text-decoration: none;
color: rgb(247, 247, 247);
font-size: 15px;
font-weight: bold;
display: block;
width: 100%;
height: 100%;
line-height: 50px;
}
.menu a:hover{
background: darkgray;
}
</style>
<body>
<h1 align="center" style="color: rgb(179, 179, 179);">Conimal</h1>
<div class="login-area">
<% if(loginUser == null) { %>
<!--로그인전에 보이는 로그인폼-->
<form id="login-form" action="<%= request.getContextPath() %>/login.me" method="post">
<table>
<tr>
<th>아이디 : </th>
<td><input type="text" name="userId" required></td>
</tr>
<tr>
<th>비밀번호 : </th>
<td><input type="password" name="userPwd" required></td>
</tr>
<tr>
<th colspan="2">
<button type="submit">로그인</button>
<button type="button">회원가입</button>
</th>
</tr>
</table>
</form>
<% } else { %>
<!-- 로그인성공후 -->
<div id="user-info">
<b><%= loginUser.getUserName() %>님</b>의 방문을 환영합니다. <br><br>
<div align="center">
<a href="">마이페이지</a>
<a href="<%= contextPath %>/logout.me">로그아웃</a>
</div>
</div>
<% } %>
</div>
<br clear="both">
<br>
<div class="nav-area" align="center">
<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>
Java
복사
login 서블릿
package com.kh.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 com.kh.member.model.service.MemberService;
import com.kh.member.model.vo.Member;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/login.me")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
/*
* < HttpServletRequest 객체와 HttpServletRespone 객체 >
* - request : 서버로 요청할때의 정보들이 담겨있음 (요청시 전달값, 요청전송방식 등)
* - response : 요청에 대해 응답할때 필요한 객체
*
* < Get방식과 Post방식 차이 >
* - Get방식 : 사용자가 입력한 값들이 url 노출 o / 데이터 길이제한 o / 대신 즐겨찾기 편리
* - Post방식 : 사용자가 입력한 값들이 url 노출 x / 데이터 길이제한 x / 대신 Timeout존재
*/
// 1) 전달값에 한글이 있을 경우 인코딩 처리해야됨 (Post방식일 경우)
request.setCharacterEncoding("UTF-8");
// 2) 요청시 전달값 (request의 parameter영역) 꺼내서 변수 또는 객체에 기록하기
// request.getParameter("키값") : String 밸류값
// request.getParameterValues("키값") : String[] 밸류값들
String userId = request.getParameter("userId");
String userPwd = request.getParameter("userPwd");
// 3) 해당 요청을 처리하는 서비스클래스의 메소드 호출 및 결과 받기
Member loginUser = new MemberService().loginMember(userId, userPwd);
// 4) 처리된 결과를 가지고 사용자가 보게될 뷰 지정 후 포워딩 또는 url재요청
//System.out.println(loginUser);
/*
* * 응답 페이지에 전달할 값이 있을 경우 어딘가에 담아야됨!! (담아줄 수 있는 JSP Scope내장객체 4종류)
* 1) application : application에 담은 데이터는 웹 애플리케이션 전역에서 다 꺼내 쓸 수 있음
* 2) session : session에 담은 데이터는 모든 jsp에 servlet에서 꺼내 쓸 수 있음
* 한 번 담은 데이터는 내가 직접 지우기 전까지, 서버가 멈추기 전까지, 브라우저가 종료되기 전까지
* 접근해서 꺼내 쓸 수 있음
* 3) request : request에 담은 데이터는 해당 request를 포워딩한 응답 jsp에서만 꺼내 쓸 수 있음 (일회성 느낌)
* 4) page : 해당 jsp페이지에서만 꺼내 쓸 수 있음
*
* 공통적으로 데이터를 담고자 한다면 .setAttribute("키", 밸류)
* " 데이터를 꺼내고자 한다면 .getAttribute("키")
* " 데이터를 지우고자 한다면 .removeAttribute("키")
*/
if(loginUser == null) { // 로그인 실패 => 에러페이지 응답
request.setAttribute("errorMsg", "로그인 실패했습니다.");
// 응답 페이지 jsp에게 위임시 필요한 객체 (RequestDispatcher)
// '응답 뷰 지정하는' 포워딩 방식
// 포워딩 방식 : 해당 경로로 선택된 뷰가 보여질 뿐 url은 절대 변경되지 않음 (요청했을때의 url이 여전히 남아있을 거임)
RequestDispatcher view = request.getRequestDispatcher("views/common/errorPage.jsp");
view.forward(request, response);
}else { // 로그인 성공 => index페이지 응답
// Servlet에서 JSP내장객체인 session에 접근하고자 한다면 우선 세션 객체를 얻어와야됨
HttpSession session = request.getSession();
session.setAttribute("loginUser", loginUser);
// 1. 포워딩방식 *복붙해주세용
// 2. url 재요청방식 (sendRedirect 방식) => response.sendRedirect("요청할 url");
// localhost:8888/jsp
response.sendRedirect("/jsp");
//response.sendRedirect(request.getContextPath());
}
}
}
Java
복사
3. logout 서블릿
package com.kh.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;
/**
* Servlet implementation class LogoutServlet
*/
@WebServlet("/logout.me")
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LogoutServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 로그아웃 요청 처리 => session 만료시키기 == 세션을 무효화 시키기
request.getSession().invalidate();
// 응답페이지 => /jsp url 재요청 => index.jsp 페이지
//response.sendRedirect("/jsp");
response.sendRedirect(request.getContextPath()); // 경로 알아오는 메소드 !! 명시적으로 쓰지말고 이 메소드 쓰기 (협업할 때 특히 !)
}
/**
* @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);
}
}
Java
복사
4. MemberService
package com.kh.member.model.service;
import java.sql.Connection;
import com.kh.common.JDBCTemplate;
import com.kh.member.model.dao.MemberDao;
import com.kh.member.model.vo.Member;
public class MemberService {
/**
* 로그인 요청 서비스
* @param userId 사용자가 입력했던 아이디값
* @param userPwd 사용자가 입력했던 비밀번호값
*/
public Member loginMember(String userId, String userPwd) {
Connection conn = JDBCTemplate.getConnection();
Member m = new MemberDao().loginMember(conn, userId, userPwd);
JDBCTemplate.close(conn);
return m;
}
}
Java
복사
5. MemberDao
package com.kh.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.kh.common.JDBCTemplate;
import com.kh.member.model.vo.Member;
public class MemberDao {
private Properties prop = new Properties();
public MemberDao() {
// WebContent파일 안의 WEB-INF/sql/member 경로에 있는 파일을 제시해야함 !!!
// NullPointer 오류 발생 가능 ! => 경로 오타 확인
// 변수에 담지 않고 바로 FileInputStream안에 물리주소를 입력해도 된다.
String fileName = MemberDao.class.getResource("/sql/member/member-mapper.xml").getPath();
try {
prop.loadFromXML(new FileInputStream(fileName));
} 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"); // NullPointer 에러 발생시 오타난것!!
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_no"),
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;
}
}
Java
복사
member-mapper.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!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>
XML
복사


