#22 mvc: view resolver
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -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, ""));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package org.example.mvc.view;
|
||||
|
||||
public interface ViewResolver {
|
||||
|
||||
View resolveView(String viewName);
|
||||
}
|
||||
Reference in New Issue
Block a user