JSP
[JSP] 47. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (6)
Song hyun
2024. 7. 10. 09:17
728x90
반응형
[JSP] 47. <JSP와 MVC 패턴을 사용한 to-do 프로젝트> (6)



1. UserController
package com.tenco.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import com.mysql.cj.Session;
import com.tenco.model.UserDAO;
import com.tenco.model.UserDAOImpl;
import com.tenco.model.UserDTO;
// 주소설계
// http://localhost:8080/mvc/user/
@WebServlet("/user/*")
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1L;
private UserDAO userDAO;
public UserController() {
super();
}
@Override
public void init() throws ServletException {
userDAO=new UserDAOImpl();
}
// GET 방식으로 들어올 때,
// http://localhost:8080/mvc/user/signUp --> 회원가입 페이지
// http://localhost:8080/mvc/user/signIn --> 로그인 페이지
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getPathInfo();
System.out.println("action : "+action);
switch(action) {
case "/signIn":
request.getRequestDispatcher("/WEB-INF/views/signIn.jsp").forward(request, response);
break;
case "/signUp":
request.getRequestDispatcher("/WEB-INF/views/signUp.jsp").forward(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
break;
}
}
// 로그인 처리 기능
private void signIn(HttpServletRequest request, HttpServletResponse response) throws IOException {
// URL, 인증 검사, 유효성 검사, 서비스 로직, DAO --> 전달, 뷰 호출
String username=request.getParameter("username");
String password=request.getParameter("password");
// 유효성 검사
if(username==null || password.trim().isEmpty()) {
response.sendRedirect("signIn?message=invalid");
return;
}
// 빠른 검사
UserDTO user= userDAO.getUserByUsername(username);
if(user!=null && user.getPassword().equals(password)) {
HttpSession session = request.getSession();
session.setAttribute("principal", user);
// 로그인 --> todoForm 화면 이동 처리
response.sendRedirect("/mvc/todo/todoForm");
System.out.println("로그인 처리 완료");
} else {
response.sendRedirect("signIn?message=invalid");
}
// null <--- 회원가입 x
// 비밀번호 == dto.getPassword();
}
// 회원 가입 기능
private void signUp(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 인증 검사 필요 없는 기능
String username = request.getParameter("username");
String password=request.getParameter("password");
String email=request.getParameter("email");
// 방어적 코드 작성 (username)
if(username==null || username.trim().isEmpty()) {
request.setAttribute("errorMessage", "사용자 이름을 입력하시오.");
request.getRequestDispatcher("/WEB-INF/views/signUp.jsp").forward(request,response);
return;
}
// 방어적 코드 작성 (password)
// 방어적 코드 작성 (email)
UserDTO userDTO = UserDTO.builder()
.username(username)
.password(password)
.email(email)
.build();
int resultRowCount = userDAO.addUser(userDTO);
System.out.println("resultRowCount : "+resultRowCount);
if(resultRowCount==1) {
response.sendRedirect("/mvc/user/signIn?message=success");
} else {
response.sendRedirect("/mvc/user/signUp?message=error");
}
}
// 로그인 기능 요청 (자원의 요청 -- GET 방식, 하지만 예외 처리 -> because of 보안)
// POST 요청 시 - 로그인 기능 구현, 회원 가입 기능 구현
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getPathInfo();
System.out.println("action : "+action);
switch(action) {
case "/signIn":
// 로그인 페이지로 보내는 동작 처리
signIn(request,response);
break;
case "/signUp":
// 회원가입 페이지로 보내는 동작 처리
signUp(request,response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
break;
}
}
}
2. TodoController
package com.tenco.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import com.tenco.model.UserDTO;
// .../mvc/todo/xxx
@WebServlet("/todo/*")
public class TodoController extends HttpServlet {
private static final long serialVersionUID = 1L;
public TodoController() {
super();
}
// http://localhost:8080/mvc/todo/todoForm
// http://localhost:8080/mvc/todo/form
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getPathInfo();
System.out.println("action : "+action);
switch (action) {
case "/todoForm": {
todoFormPage(request,response);
break;
}
default:
throw new IllegalArgumentException("Unexpected value: " + action);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
private void todoFormPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 로그인 한 사용자만 접근을 허용하도록 설계
HttpSession session=request.getSession();
UserDTO principal= (UserDTO)session.getAttribute("principal");
// 인증 검사
if(principal==null) {
// 로그인을 안 한 상태
response.sendRedirect("/mvc/user/signIn?message=invalid");
return;
}
request.getRequestDispatcher("/WEB-INF/views/todoForm.jsp").forward(request, response);
}
}
3. TodoForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>새 할 일 추가</title>
</head>
<body>
<h1> Todo Page </h1>
<%-- http;//localhost:8080/mvc/todo/add --%>
<form action="add" method="POST">
<label for="title"> 제목 : </label>
<input type="text" id="title" name="title" value="코딩연습 무한반복"> <br><br>
<label for="description"> 설명 : </label>
<textarea name="description" id="description" rows="20" cols="50">
그래야 성공하고 높은 연봉은 기본... 아니면 워라밸
</textarea> <br><br>
<label for="dueDate"> 마감기한 : </label>
<input type="date" id="dueDate" name="dueDate" value="2024-07-11"> <br><br>
<label for="completed"> 완료 여부 : </label>
<input type="checkbox" id="completed" name="completed"> <br><br>
<button type="submit">추가</button>
</form>
<br><br>
<a href="list">목록으로 돌아가기</a>
</body>
</html>
728x90
반응형