Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions src/main/java/DispatcherServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import controller.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 java.io.IOException;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet {
private RequestMapper requestMapper;
private static final String REDIRECT = "redirect:";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

redirect: 문자열에 대한 상수 선언 좋은 것 같습니다!


@Override
public void init() throws ServletException {
requestMapper = new RequestMapper();
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getRequestURI();
Controller controller = requestMapper.getController(url);

String view = controller.execute(req, resp);
sendView(req, resp, view);
}

private static void sendView(HttpServletRequest req, HttpServletResponse resp, String view) throws IOException, ServletException {
if (view.startsWith(REDIRECT)) {
resp.sendRedirect(view.substring(REDIRECT.length()));
return;
}
req.getRequestDispatcher(view).forward(req, resp);
}
}
23 changes: 23 additions & 0 deletions src/main/java/RequestMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import controller.*;

import java.util.HashMap;
import java.util.Map;

public class RequestMapper {
private static final Map<String, Controller> controllerMap = new HashMap<>();

static {
controllerMap.put("/", new HomeController());
controllerMap.put("/user/signup", new CreateUserController());
controllerMap.put("/user/userList", new ListUserController());
controllerMap.put("/user/login", new LoginController());
controllerMap.put("/user/logout", new LogoutController());
controllerMap.put("/user/update", new UpdateUserController());
controllerMap.put("/user/updateForm", new UpdateUserFormController());
}

public Controller getController(String url) {
return controllerMap.get(url);
}

}
8 changes: 8 additions & 0 deletions src/main/java/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public interface Controller {
String execute(HttpServletRequest req, HttpServletResponse response);
}
25 changes: 25 additions & 0 deletions src/main/java/controller/CreateUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package controller;

import core.db.MemoryUserRepository;
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 jwp.model.User;

import java.io.IOException;

public class CreateUserController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
User user = new User(req.getParameter("userId"),
req.getParameter("password"),
req.getParameter("name"),
req.getParameter("email"));
MemoryUserRepository.getInstance().addUser(user);

return "redirect:/user/userList";
}
}
18 changes: 18 additions & 0 deletions src/main/java/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package controller;

import jakarta.servlet.RequestDispatcher;
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 java.io.IOException;

public class HomeController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
return "/home.jsp";
}
}
32 changes: 32 additions & 0 deletions src/main/java/controller/ListUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package controller;

import core.db.MemoryUserRepository;
import jakarta.servlet.RequestDispatcher;
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 jwp.model.User;

import java.io.IOException;
import java.util.Collection;

public class ListUserController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
HttpSession session = req.getSession();
Object value = session.getAttribute("user");

if (value != null) {
Collection<User> users = MemoryUserRepository.getInstance().findAll();
req.setAttribute("users", users);

return "/user/list.jsp";
}

return "redirect:/user/login.jsp";
Copy link
Copy Markdown
Contributor

@kisusu115 kisusu115 Apr 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

navigation.jspf 파일의 comment에서 언급한 ForwardController 활용 시 리다이렉트 요청을 "redirect:/user/loginForm" 으로 보내어 파일의 위치가 노출되지 않을 것 같습니다!

}
}
32 changes: 32 additions & 0 deletions src/main/java/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package controller;

import core.db.MemoryUserRepository;
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 jwp.model.User;

import java.io.IOException;

public class LoginController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
String userId = req.getParameter("userId");
String password = req.getParameter("password");

User findUser = MemoryUserRepository.getInstance().findUserById(userId);

if (findUser == null || !findUser.matchPassword(password)) {
return "redirect:/user/login_failed.jsp";
}

HttpSession session = req.getSession();
session.setAttribute("user", findUser);

return "redirect:/";
}
}
21 changes: 21 additions & 0 deletions src/main/java/controller/LogoutController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package 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;

public class LogoutController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
HttpSession session = req.getSession();
session.removeAttribute("user");

return "redirect:/";
}
}
26 changes: 26 additions & 0 deletions src/main/java/controller/UpdateUserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package controller;

import core.db.MemoryUserRepository;
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 jwp.model.User;

import java.io.IOException;

public class UpdateUserController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
User user = new User(req.getParameter("userId"),
req.getParameter("password"),
req.getParameter("name"),
req.getParameter("email"));

MemoryUserRepository.getInstance().update(user);

return "redirect:/user/userList";
}
}
23 changes: 23 additions & 0 deletions src/main/java/controller/UpdateUserFormController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package controller;

import core.db.MemoryUserRepository;
import jakarta.servlet.RequestDispatcher;
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 jwp.model.User;

import java.io.IOException;

public class UpdateUserFormController implements Controller{

@Override
public String execute(HttpServletRequest req, HttpServletResponse response) {
User user = MemoryUserRepository.getInstance().findUserById(req.getParameter("userId"));
req.setAttribute("user", user);

return "/user/updateForm.jsp";
}
}
10 changes: 9 additions & 1 deletion src/main/java/core/db/MemoryUserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import java.util.HashMap;
import java.util.Map;

public class MemoryUserRepository {
public class MemoryUserRepository implements Repository{
private Map<String, User> users = new HashMap<>();
private static MemoryUserRepository memoryUserRepository;

Expand All @@ -21,14 +21,17 @@ public static MemoryUserRepository getInstance() {
return memoryUserRepository;
}

@Override
public void addUser(User user) {
users.put(user.getUserId(), user);
}

@Override
public User findUserById(String userId) {
return users.get(userId);
}

@Override
public Collection<User> findAll() {
return users.values();
}
Expand All @@ -38,4 +41,9 @@ public void changeUserInfo(User user) {
users.put(user.getUserId(), user);
}
}

public void update(User updateUser) {
User originUser = users.get(updateUser.getUserId());
originUser.update(updateUser);
}
}
80 changes: 80 additions & 0 deletions webapp/home.jsp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!doctype html>
<html lang="ko">
<%@ include file="./include/header.jspf" %>
<body>
<%@ include file="./include/navigation.jspf" %>

<div class="container" id="main">
<h2>Q&A</h2>
<div class="qna-list">
<ul class="list">
<li>
<div class="wrap">
<div class="main">
<strong class="subject">
<a href="qna/show.jsp"> 객체지향을 가장 잘 다룬 책이 뭐가 있나요? </a>
</strong>
<div class="auth-info">
<i class="icon-add-comment"></i>
<span class="time">2025-03-26 23:11</span>
<span clas="author">이영선</span>
<!-- <a href="./user/profile.html" class="author">이영선</a> -->
</div>
<div class="reply" title="댓글">
<i class="icon-reply"></i>
<span class="point">12</span>
</div>
</div>
</div>
</li>
<li>
<div class="wrap">
<div class="main">
<strong class="subject">
<a href="qna/show.jsp"> 객체지향에서 가장 중요하다고 생각하는 것이 무엇인가요? </a>
</strong>
<div class="auth-info">
<i class="icon-add-comment"></i>
<span class="time">2025-03-27 23:55</span>
<span class="author">이윤정</span>
<!-- <a href="./user/profile.html" class="author">이윤정</a> -->
</div>
<div class="reply" title="댓글">
<i class="icon-reply"></i>
<span class="point">8</span>
</div>
</div>
</div>
</li>
</ul>
<div class="row">
<div class="col-md-5"></div>
<div class="col-md-5">
<ul class="pagination" style="display:align-items-center;">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1" aria-disabled="true">Previous</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item active" aria-current="page">
<a class="page-link" href="#">2</a>
</li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</div>
<div class="col-md-2 qna-write">
<a href="qna/form.jsp" class="btn btn-primary pull-right" role="button">질문하기</a>
</div>
</div>
</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<script src="js/scripts.js"></script>
</body>
</html>
7 changes: 7 additions & 0 deletions webapp/include/header.jspf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>KUIT</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="./css/styles.css" rel="stylesheet">
</head>
Loading