Model - View - Controller
Model : Business logic 실행, data 처리, database 연동
View : User Interface, presentation logic
(브라우저에 출력시킬 response 만듦, 주로 jsp)
Controller : Request 처리 흐름 제어, request/response data 전달
DispatcherServlet
: client 요청(request) 받아 controller에 전달, controller 처리 결과를 view에 전달(Tomcat과 같은 서블릿엔진(서버)로 실행, front controller 역할)HandlerMapping
: 요청 URL을 처리할 Controller 결정Controller
: 요청을 처리한 후 결과를 dispatcherServlet에 전달ModelAndView
: controller가 처리한 결과, DTO 역할, view의 이름도 포함ViewResolver
: controller 처리 결과를 출력한 view 결정view
: 처리 결과 출력하기 위한 화면(response) 생성
DispatcherServlet, HanlderMapping, ViewResolver 는 Spring에서 제공되는 구현 클래스 이용
-> web.xml이나 설정 파일에 등록
Model component(domain, DAO 클래스 포함), Controller(request 처리), view(xml, html, json등 형태)는 직접 구현
DispatherServlet
Client의 request 전달받는 servlet(front controller 역할)
Web application의 설정 파일(WEB-INF/web.xml) 에 설정
<web-app ...>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern> // URL이 .do로 끝나는 모든 request 처리
</servlet-mapping>
Web application은 일반적으로 여러 계층(controller, service, dao등)으로 구성되는데 각 계층에 속하는 bean들을 서로 다른 설정 파일에 관리한다
DispatcherServlet 설정 파일에는 HandlerMapping, Controller, ViewResolver등 mvc관련 bean에 대한 설정만을 포함.
Controller
Request 객체 전달 받아 처리, 일반적으로 ModelAndView 객체 생성하여 반환
Controller 객체를 Spring bean으로 등록해야 함
@Controller annotation 사용 (<context:component-scan />이나 <mvc:annotation-driven /> 설정 파일에 작성)
@RequestMapping annotation으로 사용자가 정의한 method를 특정 request URL에 대한 handler method로 지정
//index.jsp
<body>
<h1>Spring Web MVC 예제 (LectureNotes 5 & 6)</h1>
<ul>
<li><p>HelloWorld Example<br>
<a href="<c:url value='/hello.do' />">/hello.do</a></p>
</li>
...
//controller
package org.springframework.samples.controller;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
//bean 자동 등록, 이 class의 객체를 controller로 사용하겠다
public class HelloController {
("/hello.do") // requestURL Mapping, request처리할 method 지정
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
mav.setViewName("hello"); //★★ view 이름 : hello ★★
mav.addObject("greeting", getGreeting()); //★★ model객체 이름 : greeting ★★
return mav; //DispatcherServlet에 return
}
private String getGreeting() {
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hour >= 6 && hour <= 11) {
return "Good morning!";
} else if (hour > 11 && hour <= 14) {
return "Did you have lunch?";
} else if (hour > 14 && hour <= 18) {
return "Good afternoon!";
} else if (hour > 18 && hour <= 24) {
return "Good evening!";
}
return "Hello!";
}
}
//view(hello.jsp)
<% page language="java" contentType="text/html; charset=EUC-KR"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>인사</title>
</head>
<body>
인사말: <strong>${greeting}</strong> //객체이름, ModelAndView 객체에 저장한 모델 객체 참조
</body>
</html>
@RequestMapping
: 적용된 URL 경로는 각 request hanlder method의 기본 경로로 사용됨@PathVariable
: URL 경로 내의 변수 값을 parameter로 전달 받음
"/members") (
public class MemberController{
"/{memberId}/orders/{orderId}") //ex) /members/jain/orders/12 (
public String memberOrderDetail( String memberId, {orderId} int orderNum, Model model){
model.addAttribute("member", memberService.getMemberInfo(memberId));
model.addAttribute("order", new OrderInfo(orderNum, memberId));
return "members/memberOrderDetail";
}
}
HTTP 전송 방식
"/article/newArticle.do") (
public class NewArticleController {
private ArticleService articleService;
(method = RequestMethod.GET) //GET Request만 처리
public String form() {
return "article/newArticleForm"; //form view로 이동
}
(method = RequestMethod.POST) //POST Request만 처리
public String submit( ("command") NewArticleCommand command) {
articleService.writeArticle(command); //service객체 호출 : form 입력 처리
return "article/newArticleSubmitted"; // 처리 결과 출력하는 view로 이동
}
}
//Command 객체 : HTTP request parameter를 저장한 객체
HttpServletRequest 이용한 request parameter 접근
public class EventController {
("/detail")
public String list(HttpServletRequest request, Model model){
//HttpServletRequest 타입의 파라미터 추가, getParameter() method 이용하여 값을 추출
String id = request.getParameter("id");
if(id == null)
return "redirect:/event/list";
}
@RequestParam
public class SearchController {
//http://{host}/{context}/search/internal.do?query=spring&p=3
("/search/internal.do")
public ModelAndView searchInternal( ("query") String query,
(value = "p", defaultValue = "1") int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/internal");
}
//query parameter 존재하지 않으면 오류, p parameter가 존재하지 않으면 기본값 1
("/search/external.do")
public ModelAndView searchExternal( (value="query", required=false) String query,
(value = "p", defaultValue = "1") int pageNumber) {
System.out.println("query=" + query + ",pageNumber=" + pageNumber);
return new ModelAndView("search/external");
}
//required=false 로 설정하면 request parameter 존재하지 않으면 null 할당
}
ViewResolver
물리적 view 객체 생성
DispatcherServlet이 사용하는 spring 설정 파일에 bean으로 등록
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
prefix : view 이름 앞
suffix : view 이름 뒤
ex ) /WEB-INF/view/hello.jsp
'Computer Science > Spring' 카테고리의 다른 글
#7 Model Data (0) | 2018.05.26 |
---|---|
#6 Command 객체 이용한 Form 전송 처리 (2) | 2018.05.25 |
#4 Bean 객체의 life-cycle 관리 (0) | 2018.05.14 |
#3 Spring DI : auto-wiring, annotation 기반 (0) | 2018.05.14 |
#2 Spring DI - xml 기반 (0) | 2018.05.14 |