Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6주차 미션 / 서버 3조 김상균 #48

Open
wants to merge 1 commit into
base: step4-mvc-view
Choose a base branch
from
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
18 changes: 18 additions & 0 deletions src/main/java/core/mvc/AbstractController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package core.mvc;

import core.mvc.view.ModelAndView;

import java.util.Map;

public interface AbstractController extends Controller{

// JspView의 경우 viewName에 따라서 어떤 경로로 forward할지, redirect를 할 지 결정한다. 따라서 인자로 viewName을 받을 수 있도록 해주었다.
ModelAndView jspView(String viewName);


// JsonView의 경우 model을 전달받아서 해당 모델의 정보를 모두 json 형식으로 바꿔주는 형태로 동작을 한다.
// 그러다보니 ModelAndView 객체를 생성한 후, 해당 객체 내의 model에 데이터를 삽입해주기 위해서는 ModelAndView에 삽입해 줄 데이터를 지니고 있는
// 원본 자료구조가 필요했다. 따라서 인자로 해당 데이터를 가지고 있는 Map을 전달해줄 수 있도록 해주었다.
ModelAndView jsonView(Map<String, Object> model);

}
3 changes: 2 additions & 1 deletion src/main/java/core/mvc/Controller.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package core.mvc;

import core.mvc.view.ModelAndView;
import core.mvc.view.View;

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

public interface Controller {
View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception;
ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception;
}
8 changes: 3 additions & 5 deletions src/main/java/core/mvc/DispatcherServlet.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package core.mvc;

import core.mvc.view.ModelAndView;
import core.mvc.view.View;

import javax.servlet.RequestDispatcher;
Expand All @@ -25,11 +26,8 @@ protected void service(HttpServletRequest req, HttpServletResponse resp) throws
String url = req.getRequestURI();
Controller controller = requestMapping.getController(url);
try {
View view = controller.execute(req, resp);
if (view == null) {
return;
}
view.render(req, resp);
ModelAndView mav = controller.execute(req, resp);
mav.render(req, resp);
} catch (Exception e) {
System.out.println(e.getMessage());
throw new ServletException(e.getMessage());
Expand Down
20 changes: 17 additions & 3 deletions src/main/java/core/mvc/ForwardController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package core.mvc;

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

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

public class ForwardController implements Controller {
public class ForwardController implements AbstractController {

private final String forwardUrl;

Expand All @@ -17,8 +20,19 @@ public ForwardController(String forwardUrl) {
}
}

// forward 수정
@Override
public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
return new JspView(forwardUrl);
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
return jspView(forwardUrl);
}

@Override
public ModelAndView jspView(String viewName) {
return new ModelAndView(new JspView(viewName));
}

@Override
public ModelAndView jsonView(Map<String, Object> model) {
return null;
}
}
24 changes: 13 additions & 11 deletions src/main/java/core/mvc/view/JsonView.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,23 @@

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

private static Map<String, Object> createModel(HttpServletRequest request) {
Enumeration<String> names = request.getParameterNames();
Map<String, Object> model = new HashMap<>();
while (names.hasMoreElements()) {
String name = names.nextElement();
model.put(name, request.getParameter(name));
}
return model;
// model -> JSON으로 변환
out.print(objectMapper.writeValueAsString(model));
}

// private static Map<String, Object> createModel(HttpServletRequest request) {
// Enumeration<String> names = request.getParameterNames();
// Map<String, Object> model = new HashMap<>();
// while (names.hasMoreElements()) {
// String name = names.nextElement();
// model.put(name, request.getParameter(name));
// }
// return model;
// }

}
10 changes: 8 additions & 2 deletions src/main/java/core/mvc/view/JspView.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,29 @@
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

public class JspView implements View {

private final String viewName;
private static final String REDIRECT_PREFIX = "redirect:";


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

@Override
public void render(HttpServletRequest request, HttpServletResponse response) throws Exception {
public void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

if (viewName.startsWith(REDIRECT_PREFIX)) {
response.sendRedirect(viewName.substring(REDIRECT_PREFIX.length()));
return;
}

for (Map.Entry<String, Object> entry : model.entrySet()) {
request.setAttribute(entry.getKey(), entry.getValue());
}

RequestDispatcher rd = request.getRequestDispatcher(viewName);
rd.forward(request, response);
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/core/mvc/view/ModelAndView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package core.mvc.view;

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

public class ModelAndView {

View view;
Map<String, Object> model = new HashMap<>();

public ModelAndView(View view) {
this.view = view;
}

public ModelAndView addObject(String attributeName, Object attributeValue) {
model.put(attributeName, attributeValue);
return this;
}

public void render(HttpServletRequest req, HttpServletResponse resp) throws Exception {
view.render(model, req, resp);
}
}
3 changes: 2 additions & 1 deletion src/main/java/core/mvc/view/View.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

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

public interface View {
void render(HttpServletRequest request, HttpServletResponse response) throws Exception;
void render(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
20 changes: 16 additions & 4 deletions src/main/java/jwp/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -1,23 +1,35 @@
package jwp.controller;

import core.mvc.AbstractController;
import core.mvc.Controller;
import core.mvc.view.JspView;
import core.mvc.view.ModelAndView;
import core.mvc.view.View;
import jwp.dao.QuestionDao;
import jwp.model.Question;

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

public class HomeController implements Controller {
public class HomeController implements AbstractController {

private final QuestionDao questionDao = new QuestionDao();

@Override
public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
List<Question> questions = questionDao.findAll();
req.setAttribute("questions", questions);
return new JspView("/home.jsp");
return jspView("/home.jsp").addObject("questions", questions);
}

@Override
public ModelAndView jspView(String viewName) {
return new ModelAndView(new JspView(viewName));
}

@Override
public ModelAndView jsonView(Map<String, Object> model) {
return null;
}
}
42 changes: 38 additions & 4 deletions src/main/java/jwp/controller/qna/CreateAnswerController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package jwp.controller.qna;

import core.mvc.AbstractController;
import core.mvc.Controller;
import core.mvc.view.JsonView;
import core.mvc.view.ModelAndView;
import core.mvc.view.View;
import jwp.dao.AnswerDao;
import jwp.dao.QuestionDao;
Expand All @@ -10,14 +12,17 @@

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

public class CreateAnswerController implements Controller {
public class CreateAnswerController implements AbstractController {

private final AnswerDao answerDao = new AnswerDao();
private final QuestionDao questionDao = new QuestionDao();

@Override
public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.println("[CreateAnswerController] 실행");
int questionId = Integer.parseInt(req.getParameter("questionId"));
Answer answer = new Answer(questionId,
Expand All @@ -30,8 +35,37 @@ public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exc
question.increaseCountOfAnswer();
questionDao.updateCountOfAnswer(question);

req.setAttribute("answer", savedAnswer);
Map<String, Object> model = new HashMap<>();
model.put("answer", savedAnswer);

return new JsonView();
/*
이 컨트롤러에서는 JsonView를 활용해야했다. 따라서 jsonView() 메소드를 사용해주었다.
이 때는 ModelAndView를 전달할 때, 해당 ModelAndView의 model을 통해 savedAnswer를 view로 넘겨주어야했다.
그러다보니 ModelAndView 의 model에 데이터를 삽입해주는 동작이 필요했는데, 그 동작을 jsonView() 메소드를 통해 수행하고자 하다보니
새로운 Map을 만든 후, 해당 Map에 attributeName, attributeValue를 저장하고 그 Map을 jsonView() 메소드의 인자로 전달해주었다.
jsonView() 메소드에서는 인자로 넘어온 Map에서 데이터를 하나하나 꺼내어 ModelAndView 객체 내부의 model에 저장해주었다.
이 ModelAndView 객체 내부의 model에 저장된 데이터들은 실제로 JsonView 의 render()에 의해서 JSON 데이터로 추후 변하게된다.
*/
return jsonView(model);
}

@Override
public ModelAndView jspView(String viewName) {
return null;
}

@Override
public ModelAndView jsonView(Map<String, Object> model) {
ModelAndView mav = new ModelAndView(new JsonView());

Iterator<String> keys = model.keySet().iterator();

while (keys.hasNext()) {
String key = keys.next();
Object value = model.get(key);
mav.addObject(key, value);
}

return mav;
}
}
20 changes: 17 additions & 3 deletions src/main/java/jwp/controller/qna/CreateQuestionController.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
package jwp.controller.qna;

import core.mvc.AbstractController;
import core.mvc.Controller;
import core.mvc.view.JspView;
import core.mvc.view.ModelAndView;
import core.mvc.view.View;
import jwp.dao.QuestionDao;
import jwp.model.Question;

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

public class CreateQuestionController implements Controller {
public class CreateQuestionController implements AbstractController {

private final QuestionDao questionDao = new QuestionDao();

@Override
public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
Question question = new Question(
req.getParameter("writer"),
req.getParameter("title"),
req.getParameter("contents"),
0);
Question savedQuestion = questionDao.insert(question);
System.out.println("saved question id= " + savedQuestion.getQuestionId());
return new JspView("redirect:/");
return jspView("redirect:/");
}


@Override
public ModelAndView jspView(String viewName) {
return new ModelAndView(new JspView(viewName));
}

@Override
public ModelAndView jsonView(Map<String, Object> model) {
return null;
}
}
21 changes: 17 additions & 4 deletions src/main/java/jwp/controller/qna/CreateQuestionFormController.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
package jwp.controller.qna;

import core.mvc.AbstractController;
import core.mvc.Controller;
import core.mvc.view.JspView;
import core.mvc.view.ModelAndView;
import core.mvc.view.View;
import jwp.util.UserSessionUtils;

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

public class CreateQuestionFormController implements Controller {
public class CreateQuestionFormController implements AbstractController {

@Override
public View execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
public ModelAndView execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
HttpSession session = req.getSession();
if (UserSessionUtils.isLogined(session)) { // 회원만 질문 등록 가능
return new JspView("/qna/form.jsp");
return jspView("/qna/form.jsp");
}
return new JspView("redirect:/user/loginForm");
return jspView("redirect:/user/loginForm");
}

@Override
public ModelAndView jspView(String viewName) {
return new ModelAndView(new JspView(viewName));
}

@Override
public ModelAndView jsonView(Map<String, Object> model) {
return null;
}
}
Loading