Skip to content

Commit

Permalink
[MVC 구현하기 - 3단계] 엔초(권예진) 미션 제출합니다. (#575)
Browse files Browse the repository at this point in the history
* refactor: 핸들러를 찾을 수 없을 때 404.jsp 를 보여주도록 변경

* refactor: 개행 정리 및 불필요한 static 선언 제거

* feat: HandlerExecutor 추가

* refactor: HandlerMapping과 HanelerAdapter를 DispatcherServletInitializer에서 추가하도록 변경

* feat: UserController 추가

* feat: JsonView 구현

* refactor: 레거시 제거

* rename: DispatcherServlet을 mvc 패키지로 이동

* refactor: HandlerExecutor에서 404.jsp를 관리하도록 변경

* feat: model에 데이터가 1개면 값을 그대로 반환하는 기능 추가

* style: 사용하지 않는 import 제거
  • Loading branch information
kwonyj1022 authored Sep 26, 2023
1 parent 9301524 commit a6efd67
Show file tree
Hide file tree
Showing 20 changed files with 133 additions and 243 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import web.org.springframework.web.WebApplicationInitializer;
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationHandlerMapping;
import webmvc.org.springframework.web.servlet.mvc.DispatcherServlet;
import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerExecutionHandlerAdapter;

/**
* Base class for {@link WebApplicationInitializer}
Expand All @@ -18,6 +21,8 @@ public class DispatcherServletInitializer implements WebApplicationInitializer {
@Override
public void onStartup(final ServletContext servletContext) {
final var dispatcherServlet = new DispatcherServlet();
dispatcherServlet.addHandlerMapping(new AnnotationHandlerMapping(Application.class.getPackageName() + ".*"));
dispatcherServlet.addHandlerAdapter(new HandlerExecutionHandlerAdapter());

final var registration = servletContext.addServlet(DEFAULT_SERVLET_NAME, dispatcherServlet);
if (registration == null) {
Expand Down
52 changes: 0 additions & 52 deletions app/src/main/java/com/techcourse/ManualHandlerMapping.java

This file was deleted.

20 changes: 20 additions & 0 deletions app/src/main/java/com/techcourse/controller/ForwardController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.techcourse.controller;

import context.org.springframework.stereotype.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import web.org.springframework.web.bind.annotation.RequestMapping;
import web.org.springframework.web.bind.annotation.RequestMethod;
import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.view.JspView;

@Controller
public class ForwardController {

private static final String PATH = "/index.jsp";

@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView execute(final HttpServletRequest request, final HttpServletResponse response) {
return new ModelAndView(new JspView(PATH));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.techcourse.controller.annotation_controller;
package com.techcourse.controller;

import com.techcourse.controller.UserSession;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import context.org.springframework.stereotype.Controller;
Expand All @@ -14,9 +13,9 @@
import webmvc.org.springframework.web.servlet.view.JspView;

@Controller
public class LoginAnnotationController {
public class LoginController {

private static final Logger log = LoggerFactory.getLogger(LoginAnnotationController.class);
private static final Logger log = LoggerFactory.getLogger(LoginController.class);

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView executePostLogin(final HttpServletRequest req, final HttpServletResponse res) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.techcourse.controller.annotation_controller;
package com.techcourse.controller;

import com.techcourse.controller.UserSession;
import context.org.springframework.stereotype.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -10,7 +9,7 @@
import webmvc.org.springframework.web.servlet.view.JspView;

@Controller
public class LogoutAnnotationController {
public class LogoutController {

@RequestMapping(value = "/logout", method = RequestMethod.GET)
public ModelAndView executeGetLogout(final HttpServletRequest req, final HttpServletResponse res) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.techcourse.controller.annotation_controller;
package com.techcourse.controller;

import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
Expand All @@ -11,7 +11,7 @@
import webmvc.org.springframework.web.servlet.view.JspView;

@Controller
public class RegisterAnnotationController {
public class RegisterController {

@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView executePostRegister(final HttpServletRequest req, final HttpServletResponse res) {
Expand Down
32 changes: 32 additions & 0 deletions app/src/main/java/com/techcourse/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.techcourse.controller;

import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import context.org.springframework.stereotype.Controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import web.org.springframework.web.bind.annotation.RequestMapping;
import web.org.springframework.web.bind.annotation.RequestMethod;
import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.view.JsonView;

@Controller
public class UserController {

private static final Logger log = LoggerFactory.getLogger(UserController.class);

@RequestMapping(value = "/api/user", method = RequestMethod.GET)
public ModelAndView show(HttpServletRequest request, HttpServletResponse response) {
final String account = request.getParameter("account");
log.info("user id : {}", account);

final ModelAndView modelAndView = new ModelAndView(new JsonView());
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow();

modelAndView.addObject("user", user);
return modelAndView;
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.techcourse;
package webmvc.org.springframework.web.servlet.mvc;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
Expand All @@ -7,12 +7,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.mvc.HandlerAdapter;
import webmvc.org.springframework.web.servlet.mvc.HandlerAdapterRegistry;
import webmvc.org.springframework.web.servlet.mvc.HandlerMappingRegistry;
import webmvc.org.springframework.web.servlet.mvc.asis.ControllerHandlerAdapter;
import webmvc.org.springframework.web.servlet.mvc.tobe.AnnotationHandlerMapping;
import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerExecutionHandlerAdapter;

import java.util.Optional;

Expand All @@ -23,34 +17,40 @@ public class DispatcherServlet extends HttpServlet {

private final HandlerMappingRegistry handlerMappingRegistry = new HandlerMappingRegistry();
private final HandlerAdapterRegistry handlerAdapterRegistry = new HandlerAdapterRegistry();
private HandlerExecutor handlerExecutor;

public DispatcherServlet() {
}

@Override
public void init() {
handlerMappingRegistry.addHandlerMapping(new ManualHandlerMapping());
handlerMappingRegistry.addHandlerMapping(new AnnotationHandlerMapping(Application.class.getPackageName() + ".*"));
handlerAdapterRegistry.addHandlerAdapter(new ControllerHandlerAdapter());
handlerAdapterRegistry.addHandlerAdapter(new HandlerExecutionHandlerAdapter());
handlerExecutor = new HandlerExecutor(handlerAdapterRegistry);
}

public void addHandlerMapping(final HandlerMapping handlerMapping) {
handlerMappingRegistry.addHandlerMapping(handlerMapping);
}

public void addHandlerAdapter(final HandlerAdapter handlerAdapter) {
handlerAdapterRegistry.addHandlerAdapter(handlerAdapter);
}

@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) {
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException {
final String requestURI = request.getRequestURI();
log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI);

final Optional<Object> nullableHandler = handlerMappingRegistry.getHandler(request);

if (nullableHandler.isEmpty()) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
final ModelAndView notFoundModelAndView = handlerExecutor.handleNotFound();
render(notFoundModelAndView, request, response);
return;
}

final Object handler = nullableHandler.get();
try {
final HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler);
final ModelAndView modelAndView = handlerAdapter.handle(request, response, handler);
final ModelAndView modelAndView = handlerExecutor.handle(request, response, handler);
render(modelAndView, request, response);
} catch (Exception e) {
throw new RuntimeException(e);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package webmvc.org.springframework.web.servlet.mvc;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import webmvc.org.springframework.web.servlet.ModelAndView;
import webmvc.org.springframework.web.servlet.view.JspView;

public class HandlerExecutor {

private final HandlerAdapterRegistry handlerAdapterRegistry;

public HandlerExecutor(final HandlerAdapterRegistry handlerAdapterRegistry) {
this.handlerAdapterRegistry = handlerAdapterRegistry;
}

public ModelAndView handle(
final HttpServletRequest request,
final HttpServletResponse response,
final Object handler
) throws Exception {
final HandlerAdapter handlerAdapter = handlerAdapterRegistry.getHandlerAdapter(handler);
return handlerAdapter.handle(request, response, handler);
}

public ModelAndView handleNotFound() {
return new ModelAndView(new JspView("404.jsp"));
}
}

This file was deleted.

Loading

0 comments on commit a6efd67

Please sign in to comment.