아래 사진 처럼 뷰를 ViewResolver를 통해 부르고
Model을 따로 전달해주는 방식을 사용해보려고 한다!!
public interface ControllerV3 {
ModelView process(Map<String,String> paramMap);
}
public class MemberFormControllerV3 implements ControllerV3 {
@Override
public ModelView process(Map<String,String> paramMap) {
return new ModelView("new-form");
}
}
여기는 그냥 리스트를 조회! 그리고 mv에 데이터를 저장!!
public class MemberListControllerV3 implements ControllerV3 {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
public ModelView process(Map<String,String> paramMap) {
List<Member> members = memberRepository.findAll();
ModelView mv = new ModelView("members");
mv.getModel().put("members",members);
return mv;
}
}
- 일단 생성자에 controllerV3Map.put()을 사용해서 컨트롤러에 매핑되는 url들 설정 해놓기!
- url이 urlPatterns에 적합하게 들어오면 service메소드가 실행되고 controllerV3Map에 이 url 들어있는지 확인하기!
- 적합한 url이면 createParamMap으로 req를 줘서 각각의 parameter를 Map에 저장해서 다시 준다
- 그리고 viewResolver함수에 viewName을 파라미터로 줘서 진짜 jsp로 바꿔줌!
- view.render(mv.getModel(), req,resp)를 통해 실제 view를 동적으로 보여줌!
@WebServlet(name = "frontControllerServletV3", urlPatterns = "/front-controller/v3/*")
public class FrontControllerV3 extends HttpServlet {
private Map<String, ControllerV3> controllerV3Map = new HashMap<>();
public FrontControllerServletV3() {
controllerV3Map.put("/front-controller/v3/new-form", new MemberFormControllerV3());
controllerV3Map.put("/front-controller/v3/save", new MemberSaveControllerV3());
controllerV3Map.put("/front-controller/v3/members", new MemberListControllerV3());
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp )throws ServletException, IOException {
String requestURI = req.getRequestURI();
ControllerV3 controllerV3 = controllerV3Map.get(requestURI);
if(controllerV3 ==null) {
resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
}
Map<String,String> paramMap = createParamMap(req);
ModelView mv = controllerV3.process(paramMap);
String viewName = mv.getViewName();
MyView view = viewResolver(viewName);
view.render(mv.getModel(),req,resp);
}
private static MyView viewResolver(String viewName)
{
return new MyView("/WEB-INF/views/" + viewName + ".jsp");
}
private static Map<String,String> createMap(HttpServletRequest req) {
Map<String,String> paraMap = new HashMap<>();
req.getParameterNames().asIterator()
.forEachRemaining(paramName-> paraMap.put(paramName,req.getParameter(paramName)));
return paramMap;
}
}