Skip to content
Draft
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
4 changes: 3 additions & 1 deletion src/main/java/core/mvc/Controller.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package core.mvc;

import core.mvc.modelandview.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Controller {
String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception;
ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception;
}
30 changes: 7 additions & 23 deletions src/main/java/core/mvc/DispatcherServlet.java
Original file line number Diff line number Diff line change
@@ -1,56 +1,40 @@
package core.mvc;

import java.io.IOException;
import core.mvc.modelandview.ModelAndView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@WebServlet(name = "dispatcher", urlPatterns = "/", loadOnStartup = 1)
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory.getLogger(DispatcherServlet.class);
private static final String DEFAULT_REDIRECT_PREFIX = "redirect:";

private RequestMapping rm;

@Override
public void init() throws ServletException {
public void init() {
rm = new RequestMapping();
rm.initMapping();
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException {
String requestUri = req.getRequestURI();
logger.debug("Method : {}, Request URI : {}", req.getMethod(), requestUri);

Controller controller = rm.findController(requestUri);
try {
String viewName = controller.execute(req, resp);
if (viewName != null) {
move(viewName, req, resp);
}
ModelAndView modelAndView = controller.execute(req, resp);
modelAndView.render(req, resp);
} catch (Throwable e) {
logger.error("Exception : {}", e);
throw new ServletException(e.getMessage());
}
}

private void move(String viewName, HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (viewName.startsWith(DEFAULT_REDIRECT_PREFIX)) {
resp.sendRedirect(viewName.substring(DEFAULT_REDIRECT_PREFIX.length()));
return;
}

RequestDispatcher rd = req.getRequestDispatcher(viewName);
rd.forward(req, resp);
}
}
7 changes: 5 additions & 2 deletions src/main/java/core/mvc/ForwardController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package core.mvc;

import core.mvc.modelandview.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

Expand All @@ -14,7 +16,8 @@ public ForwardController(String forwardUrl) {
}

@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
return forwardUrl;
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
return ModelAndView.builder()
.jspView(forwardUrl);
}
}
52 changes: 52 additions & 0 deletions src/main/java/core/mvc/modelandview/ModelAndView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package core.mvc.modelandview;

import core.mvc.view.JsonView;
import core.mvc.view.JspView;
import core.mvc.view.View;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

public class ModelAndView {
private final Map<String, Object> model;
private final View view;

private ModelAndView(Map<String, Object> model, View view) {
this.model = model;
this.view = view;
}

public void render(HttpServletRequest req, HttpServletResponse resp) throws Exception {
view.render(req, resp, model);
}

public static ModelAndViewBuilder builder() {
return new ModelAndViewBuilder();
}

public static class ModelAndViewBuilder {
private final Map<String, Object> model;
private View view;

public ModelAndViewBuilder() {
this.model = new HashMap<>();
}

public ModelAndViewBuilder addAttribute(String key, Object value) {
model.put(key, value);
return this;
}

public ModelAndView jspView(String viewName) {
view = new JspView(viewName);
return new ModelAndView(model, view);
}

public ModelAndView jsonView() {
view = new JsonView();
return new ModelAndView(model, view);
}
}
}
29 changes: 29 additions & 0 deletions src/main/java/core/mvc/view/JsonView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package core.mvc.view;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Map;

public class JsonView implements View {
@Override
public void render(HttpServletRequest req, HttpServletResponse resp, Map<String, Object> model) throws Exception {
ObjectMapper mapper = new ObjectMapper();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(mapper.writeValueAsString(model));
}

private Map<String, Object> createModel(HttpServletRequest req, Map<String, Object> model) {
final Enumeration<String> names = req.getAttributeNames();
while (names.hasMoreElements()) {
final String name = names.nextElement();
model.put(name, req.getAttribute(name));
}

return model;
}
}
35 changes: 35 additions & 0 deletions src/main/java/core/mvc/view/JspView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package core.mvc.view;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

public class JspView implements View {
private static final String DEFAULT_REDIRECT_PREFIX = "redirect:";

private final String url;

public JspView(String url) {
this.url = url;
}

@Override
public void render(HttpServletRequest req, HttpServletResponse resp, Map<String, Object> model) throws Exception {
model.forEach(req::setAttribute);
move(url, req, resp);
}

private void move(String viewName, HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (viewName.startsWith(DEFAULT_REDIRECT_PREFIX)) {
resp.sendRedirect(viewName.substring(DEFAULT_REDIRECT_PREFIX.length()));
return;
}

RequestDispatcher rd = req.getRequestDispatcher(viewName);
rd.forward(req, resp);
}
}
9 changes: 9 additions & 0 deletions src/main/java/core/mvc/view/View.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package core.mvc.view;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public interface View {
void render(HttpServletRequest req, HttpServletResponse resp, Map<String, Object> model) throws Exception;
}
14 changes: 8 additions & 6 deletions src/main/java/next/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package next.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import core.mvc.Controller;
import core.mvc.modelandview.ModelAndView;
import next.dao.QuestionDao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HomeController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
QuestionDao questionDao = new QuestionDao();
req.setAttribute("questions", questionDao.findAll());
return "home.jsp";
return ModelAndView.builder()
.addAttribute("questions", questionDao.findAll())
.jspView("home.jsp");
}
}
27 changes: 11 additions & 16 deletions src/main/java/next/controller/qna/AddAnswerController.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,29 @@
package next.controller.qna;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;

import core.mvc.Controller;
import core.mvc.modelandview.ModelAndView;
import next.dao.AnswerDao;
import next.model.Answer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddAnswerController implements Controller {
private static final Logger log = LoggerFactory.getLogger(AddAnswerController.class);

@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Answer answer = new Answer(req.getParameter("writer"), req.getParameter("contents"),
Long.parseLong(req.getParameter("questionId")));
log.debug("answer : {}", answer);

AnswerDao answerDao = new AnswerDao();
Answer savedAnswer = answerDao.insert(answer);
ObjectMapper mapper = new ObjectMapper();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(mapper.writeValueAsString(savedAnswer));
return null;

return ModelAndView.builder()
.addAttribute("savedAnswer", savedAnswer)
.jsonView();
}
}
19 changes: 6 additions & 13 deletions src/main/java/next/controller/qna/DeleteAnswerController.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,21 @@
package next.controller.qna;

import java.io.PrintWriter;
import core.mvc.Controller;
import core.mvc.modelandview.ModelAndView;
import next.dao.AnswerDao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

import core.mvc.Controller;
import next.dao.AnswerDao;
import next.model.Result;

public class DeleteAnswerController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Long answerId = Long.parseLong(req.getParameter("answerId"));
AnswerDao answerDao = new AnswerDao();

answerDao.delete(answerId);

ObjectMapper mapper = new ObjectMapper();
resp.setContentType("application/json;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(mapper.writeValueAsString(Result.ok()));
return null;
return ModelAndView.builder()
.jsonView();
}
}
19 changes: 11 additions & 8 deletions src/main/java/next/controller/qna/ShowController.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
package next.controller.qna;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import core.mvc.Controller;
import core.mvc.modelandview.ModelAndView;
import next.dao.AnswerDao;
import next.dao.QuestionDao;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Long questionId = Long.parseLong(req.getParameter("questionId"));
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
long questionId = Long.parseLong(req.getParameter("questionId"));
QuestionDao questionDao = new QuestionDao();
AnswerDao answerDao = new AnswerDao();
req.setAttribute("question", questionDao.findById(questionId));
req.setAttribute("answers", answerDao.findAllByQuestionId(questionId));
return "/qna/show.jsp";

return ModelAndView.builder()
.addAttribute("question", questionDao.findById(questionId))
.addAttribute("answers", answerDao.findAllByQuestionId(questionId))
.jspView("/qna/show.jsp");
}
}
17 changes: 9 additions & 8 deletions src/main/java/next/controller/user/CreateUserController.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
package next.controller.user;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import core.mvc.Controller;
import core.mvc.modelandview.ModelAndView;
import next.dao.UserDao;
import next.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CreateUserController implements Controller {
private static final Logger log = LoggerFactory.getLogger(CreateUserController.class);

@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
User user = new User(req.getParameter("userId"), req.getParameter("password"), req.getParameter("name"),
req.getParameter("email"));
log.debug("User : {}", user);

UserDao userDao = new UserDao();
userDao.insert(user);
return "redirect:/";
return ModelAndView.builder()
.jspView("redirect:/");
}
}
Loading