6. MVC
스프링의 주요 구성요소
- DispatcherServlet
- 클라이언트의 요청을 전달
- 컨트롤러에게 클라이언트의 요청을 전달
- 컨트롤러가 리턴한 결과값을 view에게 전달
- HandlerMapping
- 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 결정
- Controller
- 클라이언트의 요청을 처리
- 결과를 DispatcherServlet에 전달
- ModelAndView
- 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다
- ViewResolver
- 컨트롤러의 처리 결과를 생성할 뷰를 결정
- View
- 컨트롤러의 처리결과 화면을 생성. JSP 등
처리 흐름
- 클라이언트의 요청이 DispatcherServlet에 전달
- DispatcherServlet은 HandlerMapping을 사용하여 요청을 처리할 컨트롤러 객체를 구함
- DispatcherServlet은 컨트롤러 객체를 이용해 클라이언트 요청 처리
- 컨트롤러는 클라이언트의 요청 처리결과 정보를 담은 ModelAndView 객체 리턴
- DispatcherServlet은 ViewResolver로부터 응답결과를 생성할 뷰 객체를 구함
- 뷰는 클라이언트에 전송할 응답을 생성
개발자는 컨트롤러와 뷰를 개발
나머지는 스프링이 기본적으로 제공하는 구현클래스 사용
SpringMVC 적용 절차
- web.xml 파일에 DispatcherServlet 등록
- 클라이언트의 요청에 대한 Controller 작성
- Spring 설정파일에 HandlerMapping, Controller, ViewResolver 등록
Web.xml
- web.xml 파일에 DispatcherServlet 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<display-name>SpringMVC</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
- web.xml파일에 SpringMVC 설정파일 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<display-name>SpringMVC</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/config/presentation/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
- web.xml 파일에 인코딩 설정
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<display-name>SpringMVC</display-name>
<filter>
<filter-name>Encoding Filter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
컨트롤러
- Spring MVC에서 제공하는 Controller 인터페이스를 implements하여 로직 구현
public class LoginController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//1. 사용자 입력정보(id, password)추출
String id = request.getParameter("id");
String pwd = request.getParameter("password");
//2. DB 연동
UserDAO dao = new UserDAO();
UserVO user = dao.getUser(id, pwd);
//3. 적절한 화면으로 이동
ModelAndView mav = new ModelAndView();
if(user != null){
mav.addObject("message", "로그인 성공");
mav.addObject("userVo", user);
mav.setViewName("loginResult");
}else{
mav.addObject("message", "로그인 실패");
mav.setViewName("login");
}
return mav;
}
}
- 로직 수행 결과를 ModelAndView 객체에 담아 리턴
- 직접 특정 JSP를 식별하지않고, 뷰 이름을 DispatcherServler으로 돌려보낸다
- 컨트롤러가 특정 뷰에 종속되지 않는다
- 뷰 이름은 결과를 만들어낼 실제 뷰를 찾는데 사용되는 논리적 이름
- DispatcherServler은 뷰 리졸버에게 논리적 뷰이름을 실제 뷰 구현체에 매핑하도록 요청
스프링 MVC 설정파일
- Spring MVC 설정파일인 spring-mvc.xml파일에 HandlerMapping, Controller, ViewResolver를 등록
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<!-- HandlerMapping -->
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">helloController</prop>
</props>
</property>
</bean>
<!-- Controller -->
<bean id="helloController" class="com.mymall.test.controller.HelloController"></bean>
<!-- ViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/view/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
- HandlerMapping
- SimpleUrlHandlerMapping 클래스는 클라이언트의 요청 URL과 매핑되는 Controller를 찾는다
- hello.do라는 요청에 대해 helloController라는 이름의 Controller가 요청을 처리한다
- Controller
- 앞서 작성한 HelloController를 Bean으로 등록한다
- HandlerMapping에 설정한 Controller이름과 동일한 id 속성값으로 등록한다
- ViewResolver
- jsp를 view로 사용할 경우, InternalResourceViewResolver 사용
- 접두사(prefix)와 접미사(suffix)를 지정하여 view 정보를 완성
- ModelAndView에서 view 이름이 login 이라면, 완성된 정보는 /WEB-INF/view/login.jsp
jsp 작성
- 일반적인 jsp와 동일하게 구현