#22 mvc: view resolver

This commit is contained in:
haerong22
2022-10-11 01:26:51 +09:00
parent dbc80e4d80
commit 6744d9ab7a
6 changed files with 91 additions and 3 deletions

View File

@@ -3,6 +3,9 @@ package org.example.mvc;
import org.example.mvc.controller.Controller;
import org.example.mvc.controller.HandlerKey;
import org.example.mvc.controller.RequestMethod;
import org.example.mvc.view.JspViewResolver;
import org.example.mvc.view.View;
import org.example.mvc.view.ViewResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -13,6 +16,9 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@WebServlet("/")
public class DispatcherServlet extends HttpServlet {
@@ -20,11 +26,14 @@ public class DispatcherServlet extends HttpServlet {
private static final Logger log = LoggerFactory.getLogger(DispatcherServlet.class);
private RequestMappingHandlerMapping requestMappingHandlerMapping;
private List<ViewResolver> viewResolvers;
@Override
public void init() throws ServletException {
requestMappingHandlerMapping = new RequestMappingHandlerMapping();
requestMappingHandlerMapping.init();
viewResolvers = Collections.singletonList(new JspViewResolver());
}
@Override
@@ -35,12 +44,17 @@ public class DispatcherServlet extends HttpServlet {
Controller handler =
requestMappingHandlerMapping.findHandler(new HandlerKey(RequestMethod.valueOf(req.getMethod()), req.getRequestURI()));
if (handler == null) return;
if (handler == null) {
resp.sendError(404);
return;
}
String viewName = handler.handleRequest(req, resp);
RequestDispatcher requestDispatcher = req.getRequestDispatcher(viewName);
requestDispatcher.forward(req, resp);
for (ViewResolver viewResolver : viewResolvers) {
View view = viewResolver.resolveView(viewName);
view.render(new HashMap<>(), req, resp);
}
} catch (Exception e) {
log.error("exception occured: [{}]", e.getMessage(), e);

View File

@@ -0,0 +1,23 @@
package org.example.mvc.view;
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 name;
public JspView(String name) {
this.name = name;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
model.forEach(request::setAttribute);
RequestDispatcher requestDispatcher = request.getRequestDispatcher(name);
requestDispatcher.forward(request, response);
}
}

View File

@@ -0,0 +1,15 @@
package org.example.mvc.view;
import static org.example.mvc.view.RedirectView.*;
public class JspViewResolver implements ViewResolver {
@Override
public View resolveView(String viewName) {
if (viewName.startsWith(DEFAULT_REDIRECT_PREFIX)) {
return new RedirectView(viewName);
}
return new JspView(viewName + ".jsp");
}
}

View File

@@ -0,0 +1,20 @@
package org.example.mvc.view;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public class RedirectView implements View {
public static final String DEFAULT_REDIRECT_PREFIX = "redirect:";
private final String name;
public RedirectView(String name) {
this.name = name;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
response.sendRedirect(name.replace(DEFAULT_REDIRECT_PREFIX, ""));
}
}

View File

@@ -0,0 +1,10 @@
package org.example.mvc.view;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public interface View {
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}

View File

@@ -0,0 +1,6 @@
package org.example.mvc.view;
public interface ViewResolver {
View resolveView(String viewName);
}