회원서비스
< 로그인 >
1. 로그인 화면
- 어디에서나 보이는 menubar.jsp에 작성
- 로그인 전 / 후로 조건을 주어 보여줄 div영역 다르게 작성
- Form태그로 아이디와 비밀번호를 받아서 요청시 전달
<div class="login-area">
<% if(loginUser == null) { %>
<!-- 사용자가 로그인 전 보게 될 화면 -->
<!-- <form action="/jsp/login.me" method="post"> -->
<form action="<%= contextPath %>/login.me" method="post">
<table>
<tr>
<th>아이디</th>
<td><input type="text" name="userId" required></input></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" onclick="enrollPage();">회원가입</button>
</th>
</tr>
</table>
</form>
<% } else { %>
<!-- 사용자가 로그인 성공 시 보게 될 화면 -->
<div id="user-info">
<b><%= loginUser.getUserName() %></b>님 환영합니다~!! <br><br>
<div align="center">
<a href="<%= contextPath %>/myPage.me">마이페이지</a>
<!-- <a href="/jsp/logout.me">로그아웃</a> -->
<a href="<%= contextPath %>/logout.me">로그아웃</a>
</div>
</div>
<% } %>
</div>
2. MemberLoginController.java (Servlet)
- 매핑값 : /login.me
- 로그인 실패 시 에러페이지
- 로그인 성공 시 사용자의 정보를 session으로 넘기며 welcome page
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1) 요청 방식 생각! => POST 방식일 경우 인코딩 설정
request.setCharacterEncoding("UTF-8");
// 2) 요청 시, 전달한 값을 꺼내서 변수에 기록 => request의 Parameter영역
String userId = request.getParameter("userId");
String userPwd = request.getParameter("userPwd");
// 3) 해당 요청을 처리해주는 서비스클래스의 메소드를 호출
Member loginUser = new MemberService().loginMember(userId, userPwd);
// 4) 처리된 결과를 가지고 사용자가 보게 될 응답화면을 지정
if(loginUser == null) { // 로그인 실패
// 에러 메시지 넘기기
request.setAttribute("errorMsg", "로그인에 실패했습니다.");
RequestDispatcher view = request.getRequestDispatcher("views/common/errorPage.jsp");
// forward메소드 호출 (포워딩) - 응답페이지로 보내줌
view.forward(request, response);
} else { // 로그인 성공 => index.jsp페이지 응답
// 사용자의 정보 넘기기 - 다른 페이지에서도 봐야 함 (Session에 담기)
HttpSession session = request.getSession();
session.setAttribute("loginUser", loginUser);
// 로그인 성공했을때만 띄워줄 메시지
session.setAttribute("alertMsg", "로그인에 성공했습니다.");
RequestDispatcher view = request.getRequestDispatcher("index.jsp"); // WebContent폴더 기준으로
view.forward(request, response);
}
}
3. MemberService.java (자바Class)
- loginMember()
- Connection객체와 아이디, 비밀번호를 Dao로 전달
- 결과를 Controller로 반환
public Member loginMember(String userId, String userPwd) {
Connection conn = JDBCTemplate.getConnection();
// SQL 실행 관련 객체에 대한 메소드를 JDBCTemplate에 정의해놓음
Member m = new MemberDao().loginMember(conn, userId, userPwd);
JDBCTemplate.close(conn);
return m;
}
4. MemberDao.java (자바Class)
- DAO 기본
- DB에 접속하기 위한 정보와 SQL문이 담긴 'XML'파일 읽기
public class MemberDao {
// 필드
private Properties prop = new Properties();
// 기본생성자 초기화블록
public MemberDao() {
String file = MemberDao.class.getResource("/sql/member/member-mapper.xml").getPath();
// 같은 경로를 받을 수 있도록 .class파일(자바 실행 파일)을 기준으로 상대경로방식으로 지정해서 xml파일의 위치를 나타냄
try {
prop.loadFromXML(new FileInputStream(file)); // XML파일 읽기 - loadFromXML()
} catch (IOException e) {
e.printStackTrace();
}
}
}
- loginMember()
- SQL문(SELECT문)실행 후, 결과로 돌아온 회원 정보를 Member객체에 담아 반환
public Member loginMember(Connection conn, String userId, String userPwd) {
// SELECT문 => ResultSet객체(Unique key 조건에 의해 한 행만 조회됨) -> Member
Member m = null;
PreparedStatement pstmt = null;
ResultSet rset = null;
String sql = prop.getProperty("loginMember");
try {
pstmt = conn.prepareStatement(sql); // pstmt객체 생성 - 예외처리
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;
}
- SQL문
<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>
< 로그아웃 >
1. 로그아웃 화면
- request.getContextPath()로 얻어낸 contextRoot경로를 변수로 저장 -> 출력식에 넣어 사용
<a href="<%= contextPath %>/logout.me">로그아웃</a>
2. LogoutContoller.java (Servlet)
- 매핑값 : /logout.me
- session을 무효화하여 session에 담은 loginUser값을 지우기
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// a태그로 보낸 요청은 GET방식 - url에 요청값이 보여짐
// 로그아웃 요청에 대한 처리 => session을 만료시킨다(== 무효화한다)
// 무효화 메소드 == invalidate() => session에서 제공하는 메소드
HttpSession session = request.getSession();
session.invalidate();
response.sendRedirect(request.getContextPath()); // contextRoot로
}
'개발 > Web' 카테고리의 다른 글
[Java] Sevlet/JSP - 회원서비스 - 마이페이지 (0) | 2022.11.18 |
---|---|
[Java] Sevlet/JSP - 회원서비스 - 회원가입 (0) | 2022.11.18 |
[Java] JSP - 스크립팅 요소(Scripting Element), 지시어/지시자(Directive) (0) | 2022.11.14 |
[Java] Servlet / JSP (0) | 2022.11.14 |
[Java] Servlet - Web Server / WAS / Servlet / web.xml / welcome-file (0) | 2022.11.03 |