배운대로 화면에 DB의 memberTABLE을 그대로 list.jsp에 뿌릴까 하다가
어차피 회원 데이터를 뿌릴거면 내가 원하는 데이터만 뽑아서 출석부를 만들까? 하는 생각에
코드를 조금 변형했다.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- c:out 태그를 사용하기 위해서는 JSTL(Core Tag Library)을 사용 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Semicolone</title>
</head>
<body>
<header>
<!-- ... (기존 코드) -->
</header>
<main>
<c:if test="${ses.id ne null }">
<div>
[ ${ses.id } ]님 환영합니다.<br>
최근 접속일 : ${ses.lastlogin }<br>
<a href="/memb/attend"><button>출석하기</button></a>
<a href="/memb/attend_book"><button>출석부</button></a>
</div>
</c:if>
</main>
<footer></footer>
<script type="text/javascript">
<!-- ... (기존 코드) -->
</script>
</body>
</html>
출석하기 버튼과 출석부의 위치는 추후 바꾸기로 하고, 일단은 main에 위치 시켰다.
출석을 한다면 출석하기 버튼을 눌렀을 때의 시간을 가져와야하는데,
크게 일을 벌리지 않고 간단하게 할 수 있는 방법을 생각하다보니
logout에서 lastlogin을 업데이트 하는 method를 활용하면 되겠다고 생각했다.
MemberController.java
package controller;
import java.io.IOException;
import java.util.List;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import service.MemberService;
import service.MemberServiceImpl;
@WebServlet("/memb/*")
public class MemberController extends HttpServlet {
// ... (기존 코드)
case "attend":
try {
// 로그인 정보
HttpSession ses = request.getSession();
// ses에서 mvo 객체로 가져오기
MemberVO mvo = (MemberVO)ses.getAttribute("ses");
log.info(">>> ses mvo >>> {}",mvo);
// lastLogin update
isOk = msv.lastLogin(mvo.getId());
log.info(">>> 출석을 위한 lastLogin update >>> {}", (isOk > 0) ? "OK" : "FAIL");
destPage = "/memb/attend_book";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> atten error");
}
break;
case "attend_book":
try {
log.info("memList check 1");
List<MemberVO> list = msv.getList();
log.info("memList >>> {} " + list);
request.setAttribute("list", list);
destPage = "/member/attend.jsp";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> memList error");
}
break;
}
// ... (기존 코드)
}
MemberService.interface
package service;
import java.util.List;
import domain.MemberVO;
public interface MemberService {
// ... (기존 코드)
List<MemberVO> getList();
}
MemberServiceImpl.java
package service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import repository.MemberDAO;
import repository.MemberDAOImpl;
public class MemberServiceImpl implements MemberService {
// ... (기존 코드)
@Override
public List<MemberVO> getList() {
log.info(">>> attned_book check 2");
return mdao.selectList();
}
}
MemberDAO.interface
package repository;
import java.util.List;
import domain.MemberVO;
public interface MemberDAO {
// ... (기존 코드)
List<MemberVO> selectList();
}
MemberDAOImpl.java
package repository;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import orm.DatabaseBuilder;
public class MemberDAOImpl implements MemberDAO {
// ... (기존 코드)
@Override
public List<MemberVO> selectList() {
log.info(">>> attend_book check 3");
return sql.selectList("MemberMapper.list");
}
}
memberMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MemberMapper">
<!-- ... (기존 코드) -->
<select id="list" resultType="mvo">
select * from member order by lastlogin desc
</select>
</mapper>
member > attend.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>출석부</title>
</head>
<body>
<h1>출석부</h1>
<table>
<tr>
<th>ID</th>
<th>출석일</th>
</tr>
<c:forEach items="${list }" var="mvo">
<tr>
<td>${mvo.id }</td>
<td>${mvo.lastlogin }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
이렇게 완성하고 보니 로그아웃을 할때도 lastlogin이 업데이트 되어서
출석부가 바뀌겠네? 하는 생각이 들었다.
그래서 출석하기 버튼만 눌렀을 때 업데이트 되도록 수정했다.
MemberController.java
package controller;
import java.io.IOException;
import java.util.List;
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import domain.MemberVO;
import service.MemberService;
import service.MemberServiceImpl;
@WebServlet("/memb/*")
public class MemberController extends HttpServlet {
// ... (기존 코드)
case "logout":
try {
// 로그인 정보
HttpSession ses = request.getSession();
// ses에서 mvo 객체로 가져오기
// lastLogin update할 때 id 가져오려고 만듦
MemberVO mvo = (MemberVO)ses.getAttribute("ses");
log.info(">>> ses mvo >>> {}",mvo);
// lastLogin update
// isOk = msv.lastLogin(mvo.getId());
// log.info(">>> lastLogin >>> {}", (isOk > 0) ? "OK" : "FAIL");
// 세션 무효화 (세션 끊기)
ses.invalidate();
destPage = "/index.jsp";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> logout error");
}
break;
// ... (기존 코드)
case "attend":
try {
// 로그인 정보
HttpSession ses = request.getSession();
// ses에서 mvo 객체로 가져오기
MemberVO mvo = (MemberVO)ses.getAttribute("ses");
log.info(">>> ses mvo >>> {}",mvo);
// lastLogin update
isOk = msv.lastLogin(mvo.getId());
log.info(">>> 출석을 위한 lastLogin update >>> {}", (isOk > 0) ? "OK" : "FAIL");
destPage = "/memb/attend_book";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> atten error");
}
break;
case "attend_book":
try {
log.info("memList check 1");
List<MemberVO> list = msv.getList();
log.info("memList >>> {} " + list);
request.setAttribute("list", list);
destPage = "/member/attend.jsp";
} catch (Exception e) {
e.printStackTrace();
log.info(">>> memList error");
}
break;
}
// ... (기존 코드)
}
지금 진행하고 있는 토이 프로젝트는 기초적인 CRUD에 초점을 맞춘 기본 홈페이지 만들기이므로,
욕심부리지 않고 목적에 맞게 lastlogin을 출석으로 활용하면 어떨까? 라는 취지로 만든 것이다.
처음 만들어보는 홈페이지이므로 화려한 기능보다 지금은 코드 하나하나 이해하고 넘어가는 것이 중요하다..
[JSP/Servlet] 17. 회원 출석부 만들기
(다음 게시물 예고편)
[JSP/Servlet] 18. 나의 게시물
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!