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("/mem/*")
public class MemberController extends HttpServlet {
private static final long serialVersionUID = 1L;
//로그객체
private static final Logger log = LoggerFactory.getLogger(MemberController.class);
//동기방식 : requestDispatcher : request에 대한 응답 데이터를 jsp(html) 화면으로 전송하는 역할
private RequestDispatcher rdp;
//목적지 주소
private String destPage;
private int isOk;
//service
private MemberService msv;
public MemberController() {
msv = new MemberServiceImpl();
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 처리
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");
// 요청주소 추출
String uri = request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/")+1);
log.info(">>>> member path > {}", path);
switch(path) {
case "join":
destPage="/member/join.jsp";
break;
case "register":
try {
//jsp에서 온 파라미터 받기
//member 객체 생성 후 service 에게 등록 요청
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
String email = request.getParameter("email");
String phone = request.getParameter("phone");
MemberVO mvo = new MemberVO(id, pwd, email, phone);
isOk = msv.join(mvo);
log.info(" >>>> join > {} ", (isOk>0? "OK":"FAIL"));
destPage = "/index.jsp";
} catch (Exception e) {
log.info("join error!!");
e.printStackTrace();
}
break;
case "login":
try {
// 로그인 : id, pwd 파라미터로 받아서 DB에 해당 id가 있는지 확인, pwd가 일치하는지 확인
// 정보를 가져와서 session 객체에 저장
// session : 모든 jsp에 공유되는 객체 / 브라우저가 종료되면 삭제
// ${변수명}
String id = request.getParameter("id");
String pwd = request.getParameter("pwd");
MemberVO mvo = new MemberVO(id, pwd);
MemberVO loginMvo = msv.login(mvo);
// 로그인 정보가 잘못되면 loginMvo는 null 로 출력
log.info(">>>> loginMvo > {}", loginMvo);
// session 에 저장
if(loginMvo != null) {
// 로그인이 성공했다면...
// 세션에 저장
HttpSession ses = request.getSession();
ses.setAttribute("ses", loginMvo);
//로그인 유지시간 초단위로 설정 10분
ses.setMaxInactiveInterval(10*60);
}else {
//로그인이 실패했다면... index.jsp로 메시지 전송
request.setAttribute("msg_login", -1);
}
destPage = "/index.jsp";
} catch (Exception e) {
log.info("login error");
e.printStackTrace();
}
break;
case "logout":
try {
//session에 값이 있다면 해당 세션을 끊어라.
HttpSession ses = request.getSession();
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"));
ses.invalidate(); //세션 무효화(세션 끊기)
destPage="/index.jsp";
} catch (Exception e) {
log.info("logout error");
e.printStackTrace();
}
break;
case "list":
try {
List<MemberVO> list = msv.getList();
log.info(">>>> list mvo > {}", list);
request.setAttribute("list", list);
destPage = "/member/list.jsp";
} catch (Exception e) {
e.printStackTrace();
}
break;
case "modify":
try {
destPage = "/member/modify.jsp";
} catch (Exception e) {
e.printStackTrace();
}
break;
case "update":
try {
String pwd = request.getParameter("pwd");
HttpSession ses = request.getSession();
if(pwd.length() <= 0 || pwd==null) {
pwd = ((MemberVO)ses.getAttribute("ses")).getPwd();
}
MemberVO mvo = new MemberVO(
request.getParameter("id"),
pwd,
request.getParameter("email"),
request.getParameter("phone")
);
isOk = msv.modify(mvo);
log.info(">>>> modify mvo > {}", isOk>0?"OK":"FAIL");
if(isOk == 0) {
request.setAttribute("msg_update", "fail");
}else {
ses.setAttribute("ses", mvo);
}
destPage="/index.jsp";
} catch (Exception e) {
e.printStackTrace();
}
break;
case "delete":
HttpSession ses = request.getSession();
String id = ((MemberVO)ses.getAttribute("ses")).getId();
isOk = msv.delete(id);
log.info(">>>> delete mvo > {}", isOk>0?"OK":"FAIL");
if(isOk > 0) {
request.setAttribute("msg_delete", "ok");
}
ses.invalidate();
destPage = "/index.jsp";
break;
}
// rdp 전송
rdp = request.getRequestDispatcher(destPage);
rdp.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
service(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
service(request, response);
}
}
▣ MemberService.java
package service;
import java.util.List;
import domain.MemberVO;
public interface MemberService {
int join(MemberVO mvo);
MemberVO login(MemberVO mvo);
int lastLogin(String id);
List<MemberVO> getList();
int modify(MemberVO mvo);
int delete(String id);
}
▣ MemberServiceImpl.java
package service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import dao.MemberDAO;
import dao.MemberDAOImpl;
import domain.MemberVO;
public class MemberServiceImpl implements MemberService {
private static final Logger log = LoggerFactory.getLogger(MemberServiceImpl.class);
private MemberDAO mdao;
public MemberServiceImpl() {
mdao = new MemberDAOImpl();
}
@Override
public int join(MemberVO mvo) {
// TODO Auto-generated method stub
return mdao.join(mvo);
}
@Override
public MemberVO login(MemberVO mvo) {
// TODO Auto-generated method stub
return mdao.login(mvo);
}
@Override
public int lastLogin(String id) {
// TODO Auto-generated method stub
return mdao.lastLogin(id);
}
@Override
public List<MemberVO> getList() {
// TODO Auto-generated method stub
return mdao.getList();
}
@Override
public int modify(MemberVO mvo) {
// TODO Auto-generated method stub
return mdao.update(mvo);
}
@Override
public int delete(String id) {
// TODO Auto-generated method stub
return mdao.delete(id);
}
}
▣ MemberDAO.java
package dao;
import java.util.List;
import domain.MemberVO;
public interface MemberDAO {
int join(MemberVO mvo);
MemberVO login(MemberVO mvo);
int lastLogin(String id);
List<MemberVO> getList();
int update(MemberVO mvo);
int delete(String id);
}
▣ MemberDAOImpl.java
package dao;
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 {
private static final Logger log = LoggerFactory.getLogger(MemberDAOImpl.class);
private SqlSession sql;
public MemberDAOImpl() {
new DatabaseBuilder();
sql = DatabaseBuilder.getFactory().openSession();
}
@Override
public int join(MemberVO mvo) {
log.info("join dao in!!");
int isOk = sql.insert("MemberMapper.join", mvo);
if(isOk > 0) sql.commit();
return isOk;
}
@Override
public MemberVO login(MemberVO mvo) {
log.info("login dao in!!");
return sql.selectOne("MemberMapper.login", mvo);
}
@Override
public int lastLogin(String id) {
log.info("lastLogin up dao in!!");
int isOk = sql.update("MemberMapper.last", id);
if(isOk>0) sql.commit();
return isOk;
}
@Override
public List<MemberVO> getList() {
// TODO Auto-generated method stub
return sql.selectList("MemberMapper.list");
}
@Override
public int update(MemberVO mvo) {
log.info("update dao in!!");
int isOk = sql.update("MemberMapper.up", mvo);
if(isOk>0) sql.commit();
return isOk;
}
@Override
public int delete(String id) {
log.info("delete dao in!!");
int isOk = sql.update("MemberMapper.del", id);
if(isOk>0) sql.commit();
return isOk;
}
}
▣ 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">
<insert id="join">
insert into member(id, pwd, email, phone)
values(#{id},#{pwd},#{email},#{phone})
</insert>
<select id="login" resultType="domain.MemberVO">
select * from member where id=#{id} and pwd=#{pwd}
</select>
<update id="last">
update member set lastlogin = now()
where id=#{id}
</update>
<select id="list" resultType="domain.MemberVO">
select * from member order by regdate desc
</select>
<update id="up">
update member set pwd=#{pwd}, email = #{email}, phone=#{phone}
where id = #{id}
</update>
<delete id="del">
delete from member where id=#{id}
</delete>
</mapper>