728x90
반응형
1. Todo List 추가된 부분
- 로그인 세션
- 회원가입
- 로그인 확인(DB연결)
- 로그아웃
2. 추가된 코드
2.1 회원 등록
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>mRegister</title>
<h1>회원등록</h1>
</head>
<body>
<form action="/mRegister" method="post">
<input type="text" name="mid" placeholder="id">
<input type="password" name="mpw" placeholder="password">
<input type="text" name="mname" placeholder="이름">
<button type="submit">회원 등록</button>
</form>
<a href="/todo/list">홈으로</a>
</body>
</html>
@WebServlet(name="mRegisterController", urlPatterns = "/mRegister")
public class mRegisterController extends HttpServlet {
TodoService todoService = TodoService.INSTANCE;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/mRegister.jsp").forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
MemberDTO memberDTO = MemberDTO.builder()
.mid(req.getParameter("mid"))
.mpw(req.getParameter("mpw"))
.mname(req.getParameter("mname"))
.build();
try{
todoService.mRegister(memberDTO);
}catch (Exception e){
e.printStackTrace();
}
resp.sendRedirect("/login");
}
}
public void mRegister(MemberDTO memberDTO) throws Exception{
dao.register(memberDTO);
}
public void register(MemberDTO memberDTO) throws Exception{
String sql = "insert into tbl_member values(?,?,?)";
@Cleanup Connection conn = ConnectionUtil.INSTANCE.getConnection();
@Cleanup PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memberDTO.getMid());
pstmt.setString(2, memberDTO.getMpw());
pstmt.setString(3, memberDTO.getMname());
pstmt.executeUpdate();
}
- 회원 등록의 흐름 : 브라우저에서 form 형식으로 post받아 컨트롤러에서 memberDTO타입으로 변환 후 서비스로 보내고, DAO에서 "INSERT INTO~" SQL 명령문으로 회원을 등록한다.
2.2 로그인 확인
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
<style>
.submit-button{
display: block;
}
</style>
<script>
<% if (request.getAttribute("loginError") != null) { %>
alert('<%= request.getAttribute("loginError") %>');
<% } %>
</script>
</head>
<body>
<form action="/login" method="post">
<input type="text" name="mid">
<input type="text" name="mpw">
<button type="submit" class="submit-button">LOGIN</button>
</form>
<form action="/mRegister" method="get">
<button type="submit" class="submit-button">회원등록</button>
</form>
</body>
</html>
- 로그인 버튼과 회원 등록 버튼이 있다.
- 회원 등록은 새로운 페이지를 열어야하기 때문에 get방식으로 호출한다.
@WebServlet(name="LoginController", urlPatterns = "/login")
public class LoginController extends HttpServlet {
TodoService todoService = TodoService.INSTANCE;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String mid = req.getParameter("mid");
String mpw = req.getParameter("mpw");
try{
if(!todoService.login(mid, mpw)){
req.setAttribute("loginError", "Invalid username or password");
req.getRequestDispatcher("/WEB-INF/login.jsp").forward(req, resp);
return;
}
}catch (Exception e){
e.printStackTrace();
}
String str = mid;
HttpSession session = req.getSession();
session.setAttribute("loginInfo", str);
resp.sendRedirect("/todo/list");
}
}
public boolean login(MemberDTO memberDTO) throws Exception{
String sql = "select * from tbl_member where mid=? and mpw=?";
@Cleanup Connection conn = ConnectionUtil.INSTANCE.getConnection();
@Cleanup PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, memberDTO.getMid());
pstmt.setString(2, memberDTO.getMpw());
@Cleanup ResultSet rs = pstmt.executeQuery();
if(rs.next()){
return true;
}else {
return false;
}
}
- doGet에선 페이지를 dispatcher로 열어준다.
- (doPost에서도 dispatcher로 .jsp파일에 접근하여 새 페이지를 열어 줄 수 있다.)
- doPost에선 입력받은 값을 getParameter로 받아 서비스의 login(String mid, String mpw) 메서드를 호출한다.
- DB에서 아이디와 비밀번호가 일치하면 true를 반환 받는다.
- 일치하지 않으면 login()메서드가 false를 반환하여 request에 "loginError"를 설정하고 login페이지로 이동하도록 한다.
- 페이지에선 자바스크립트와 EL문을 사용하여 loginError가 set되어 있으면 loginError에 저장되어있는 "Invalid username or password"을 화면에 alter한다.
3. 로그아웃
@WebServlet(name="logOutController", urlPatterns = "/logout")
public class LogOutController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
if(session.getAttribute("loginInfo") != null){
session.removeAttribute("loginInfo");
resp.sendRedirect("/todo/list");
}
}
}
- loginInfo 세션을 removeAttribute한다.
- /todo/list로 이동한다.(로그인 세션이 없으므로 /login 으로 이동한다.)
4. 앞으로 보완할 부분
- tbl_member 테이블에 mid 고유키를 tbl_todo 테이블의 foregin키로 받는다.
- 로그인한 사람에 따라 다른 todo 테이블을 /todo/list 페이지에 보여준다.
- memberVO를 만든다.
- memberDTO를 memverVO로 mapping하여 DB에 적용한다.
댓글