1 / 68

Agilejava Spring Study

Agilejava.net Spring Study. Chapter 13. Web MVC Framework 이윤걸 이대엽. 목차. What is MVC (Model-View-Controller)? Spring Web MVC 의 기능 DispatcherServlet Controllers Handler mappings Views and resolving them Using locales Using themes Spring’s multipart (file upload) support

zach
Download Presentation

Agilejava Spring Study

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Agilejava.net Spring Study Chapter 13. Web MVC Framework 이윤걸 이대엽

  2. 목차 • What is MVC(Model-View-Controller)? • Spring Web MVC의 기능 • DispatcherServlet • Controllers • Handler mappings • Views and resolving them • Using locales • Using themes • Spring’s multipart (file upload) support • Using Spring’s form tag library

  3. What is MVC? • Model : 비즈니스 영역의 상태정보 표현 • View : 비즈니스 영역에 대한 프레젠테이션 뷰 • Controller : 입력 및 흐름 제어 • 개발 방식 • 모델 1 : 가장 기본적인 개발방식, JSP에서 전담 • 모델 2 : MVC에 근간

  4. What is MVC? • 모델 1 개발방식 1 브라우저 JSP 요청 4 응답 2 3 자바빈 엔터프라이즈 서버/ 데이터 소스 애플리케이션 서버

  5. What is MVC? • 모델 2 개발방식 1 브라우저 (컨트롤러) 서블릿 요청 5 응답 2 3 뷰(JSP) 모델 (자바빈) 4 엔터프라이즈 서버/ 데이터 소스 애플리케이션 서버

  6. What is MVC? • Spring MVC HandlerMapping 2 Controller 3 요청 DispatcherServlet ModelAndView 1 4 6 5 ViewResolver View

  7. Spring Web MVC의 기능 • 각 MVC role간의 명확한 분리 • 프레임워크 및 애플리케이션에 대한 강력하고 직관적인 설정 • Adaptability, non-intrusiveness • 재사용 가능한 비즈니스 코드 – 중복 제거 • Customizable 바인딩, 유효성 검사 • Customizable 핸들러맵핑, 뷰 resolution • 유연한모델 transfer– via name/value support

  8. Spring Web MVC의 기능 • Customizable 로케일 및 테마 resolution, Spring 태그 라이브러리, JSTL, Velocity 등 • 단순하지만 강력한 Spring 태그 라이브러리 • JSP폼 태그 라이브러리(Spring 2.0) • 현재 HTTP 요청이나 HTTP Session scope을 lifecycle로 가지는 빈 지원

  9. DispatcherServlet • Spring 역시 다른 웹 MVC프레임워크와 마찬가지로 request-driven임 • 즉, 요청을 컨트롤러로 디스패치하는서블릿 중심으로 이루어져 있음 • 그러나 Spring의 DispatcherServlet은 여기에만 그치지 않고 Spring의 IoC컨테이너와 기타 Spring이 제공하는 기능들을 완전히 통합할 수 있도록 해줌

  10. DispatcherServlet • Workflow in Spring Web MVC 요청 처리 요청 요청 위임 Controller Front Controller Model 응답 응답 렌더링 위임 모델 생성 제어 반환 Model 응답 렌더링 View Template 서블릿 엔진(예, Tomcat)

  11. DispatcherServlet • DispatcherServlet의 상속구조 HttpServlet javax.servlet.http HttpServletBean org.springframework.web.servlet FrameworkServlet org.springframework.web.servlet DispatcherServlet org.springframework.web.servlet

  12. DispatcherServlet • DispatcherServlet을 등록(web.xml) • DispatcherServlet초기화시WEB-INF 디렉터리에서[servlet-name]-servlet.xml파일을 탐색 • 따라서 여기에서는 /WEB-INF/blog-servlet.xml파일을 탐색

  13. DispatcherServlet • WebApplicationContext • ApplicationContext를 확장하여 웹 애플리케이션에 필요한 추가 기능을 제공 • 기본적으로 DispatcherServlet은 애플리케이션 초기화시 XmlWebApplicationContext에 다음의 bean이 선언되어 있는지를 검사 (WEB_APPLICATION_CONTEXT_ATTRIBUTE필드) • HandlerMapping -> “handlerMapping” • ViewResolver -> “viewResolver” • LocaleResolver -> “localeResolver” • MultipartResolver -> “multipartResolver” • ThemeResolver -> “themeResolver” • HandlerExceptionResolver -> “handlerExceptionResolver” • Controllers -> “??” • HandlerInterceptors -> “??”

  14. DispatcherServlet • WebApplicationContext의 special beans

  15. DispatcherServlet • 기본값은 DispatcherServlet.properties에 정의

  16. Controllers • 컨트롤러는 일반적으로 서비스 인터페이스에 정의된 애플리케이션의 behavior에 대한 접근을 제공 • 컨트롤러는 사용자 입력을 해석하고 변환하여 view를 통해 그 입력에 대한 결과를 돌려줌 • Spring에서는 다음과 같은 유형의 컨트롤러를 제공 • Form-specific controllers • Command-based controllers • Wizard-style controllers • org.springframework.web.servlet.mvc.Controller 인터페이스에 기반

  17. Controllers public interface Controller { ModelAndViewhandleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception; }

  18. Controllers • AbstractController • BaseCommandController • WebContentGenerator • ParameterizableViewController • AbstractUrlViewController • UrlFilenameViewController • MultiActionController • AbstractCommandController • AbstractFormController • SimpleFormController • AbstractWizardFormController • CancellableFormController • ServletForwardingController • ServletWrappingController

  19. Controllers

  20. Controllers • Spring MVC가 제공하는 컨트롤러 클래스

  21. Controllers • AbstractController에서 제공하는 기능

  22. Controllers • AbstractController를 사용할 경우 hadleRequestInternal()만 구현해주면 됨 컨트롤러 등록

  23. Controllers hello.jsp

  24. Controllers • ParameterizableViewController • AbstractController를 확장 • 앞서 살펴보았던 AbstractController와 동일하나 setViewName(String) 메서드를 이용하여 View 이름을 지정해줄 수 있음 • 뷰 이름을 Java 클래스 내에 하드코딩할 필요가 없어짐 • UrlFilenameViewController • AbstractUrlViewController를 확장 • URL을 검사하여 요청 파일의 이름을 알아내어 그 이름을 뷰 이름으로 사용함. • Ex) http://www.springframework.org/index.html의 경우 index가 뷰 이름이 됨.

  25. Controllers • MultiActionController • 한컨트롤러 클래스 내에 여러 여러 action이 포함 • 한 컨트롤러 내에 비슷한 공통적인 기능이 다수 포함되어 있으나 각각의 진입점을 가질 필요가 있을 경우 편리하게 사용 • MultiActionController의 기능

  26. Controllers • MultiActionController의 메소드 정의 • 오버로딩이 허용되지 않음 • 다음의 메소드 서명을 따름 • 따라서 다음의 메소드 서명을 가진 메소드 선언이 가능 • public [ModelAndView | Map | void] anyMeaningfulName( • HttpServletRequest, HttpServletResponse • [, Exception | anyObject]); • public ModelAndViewdoRequest(HttpServletRequest, HttpServletResponse) • public ModelAndViewdoLogin(HttpServletRequest, HttpServletResponse, Login) • public ModelAndViewprocessException(HttpServletRequest, HttpServletResponse, IllegalArgumentException) • public void goHome(HttpServletRequest, HttpServletResponse) • public Map doRequest(HttpServletRequest,HttpServletResponse)

  27. Controllers • MultiActionController의 MethodNameResolver • 들어오는 요청에 근거하여 메소드 이름을 resolving 해줄 책임을 맡고 있음 • Spring에서는 다음의 MethodNameResolver구현체를 제공 • ParameterMethodNameResolver • 요청 파라미터를메소드명으로 사용 • /index.view?testParam=testIt -> testIt(request, response) • InternalPathMethodNameResolver • 요청경로의 파일명을 메소드명으로 사용 • /testing.view -> testing(request, response) • PropertiesMethodNameResolver • 사용자가 정의한 properties 객체로 요청 URL을 메소드명에 맵핑 • /index/welcome.html -> /**/welcom?.html이란 것이 정의되어 있으면 그것과 맵핑된 메소드가 실행.

  28. Controllers • MultiActionController 예제 • ParameterMethodNameResolver

  29. Controllers • Command controllers • 데이터 객체와 HttpServletRequest객체간의 바인딩 지원 • 스트러츠의ActionForm과 유사하다고 하나 데이터 객체가Framework-specific 인터페이스를 구현할 필요가 없음 • 유형 • AbstractCommandController • AbstractFormController • SimpleFormController • AbstractWizardFormController

  30. Controllers • AbstractCommandController • 요청 파라미터를 데이터 객체와 바인딩할 수 있음 • command object에 대한 유효성 검증(validation)기능 제공 • AbstractFormController • 폼 전송을 지원하는 컨트롤러 • 사용자가 폼을 채우면 AbstractFormController가 필드를 바인딩 하며 command object에 대한 유효성 검증을 수행한 다음 컨트롤러로 리턴된 객체를 이용하여 적절한 행위를 수행 • 개발자는 폼을 나타내는 뷰와 submission 성공시보여줄 뷰를 결정하는 메소드를 구현해야 함

  31. Controllers • SimpleFormController • 입력폼을 구현하기 위하여 제공되는 컨트롤러 • 하나의 컨트롤러로 입력이나 수정에 대한 작업을 처리 가능 • GET 방식과 POST 방식에 대한 처리 과정이 서로 상이하기 때문 • Spring 프레임워크 워크북 p.335~347

  32. Controllers • AbstractWizardFormController • 마법사 기능을 가진 폼을 구현할 때 사용 • 개발자는 validatePage(), processFinish() 및 processCancel() 메소드를 구현해야 함 • setPage() 메소드를 이용하여 페이지에 마법사 페이지들을 구성하는 페이지에 대한 String 배열을 전달 • setCommandName()과 setCommandClass() 메소드를 이용하여 command 객체를 지정 • 이 밖에도 필요에 따라 개발자는 referenceData(), getTargetPage(), onBindAndValidate(), setAllowDirtyBack(), setAllowDirtyForward() 등의 메소드를 재정의할 수 있음 • 스프링 인 액션. p.294~300

  33. Handler mappings • 클라이언트 요청에 대한 적절한 핸들러와맵핑 처리 • HandlerExecutionChain • 요청-핸들러맵핑 정보, 요청-핸들러interceptor 목록 • 유형 • SimpleUrlHandlerMapping • BeanNameUrlHandlerMapping - 기본값 public interface HandlerMapping { String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE; publicHandlerExecutionChaingetHandler( HttpServletRequest request) throws Exception; }

  34. Handler mappings

  35. Handler mappings • 앞의 두 HandlerMapping클래스 모두 AbstractHandlerMapping을 확장하며 다음의 프로퍼티를 가짐 • interceptors : 사용할 인터셉터 목록 • defaultHandler : 사용할 기본 핸들러 • order : order 프로퍼티 값 (Ordered 인터페이스) • alwaysUseFullPath : true일 경우 적절한 핸들러를 찾을 때 현재 서블릿 컨텍스트내의 완전한 경로를 이용. false이면 현재 경로만 이용. • urlPathHelper : URL을 검사시 UrlPathHelper 사용 • urlDecode : 기본값은 false이며, URI decode 여부 결정 • lazyInitHandlers : 기본값 false. 싱글턴핸들러에 대한 lazy initialization 허용 여부

  36. Handler mappings • BeanNameUrlHandlerMapping • 기본값으로 지정되어 있는 HandlerMapping클래스 • 빈 이름과 URL을 맵핑 • ANT-Style의 맵핑 가능 • BeanNameUrlHandlerMapping이 단순하긴 하지만 presentation 계층 URL과 컨트롤러 이름간의 결합을 발생시키므로 권장하지 않음 • 스프링 인 액션, p.281

  37. Handler mappings • SimpleUrlHandlerMapping • URL 패턴을 직접적으로 컨트롤러에 맵핑 • 컨트롤러 빈을 정의하고 맵핑을 별도로 설정하는 불편함이 있기는 하지만 맵핑 정보를 수정할 필요가 있을 시 BeanNameUrlHandlerMapping에 비해 효율적으로 관리 가능

  38. Handler mappings • Intercepting request - HandlerInterceptor • 실제로 핸들러가 실행되기 전(before)과 요청에 대한 처리가 완전히 완료되었을 때(after)의 필요한 작업을 수행 • preHandle() 및 postHandle() 메소드를 사용 • preHandle() 메소드는리턴값으로boolean값을 리턴하며, true일 경우, 계속 요청 처리를 수행하고, false일 경우 요청 처리를 중단 • 예제 • http://whiteship.tistory.com/841^^;

  39. Handler mappings • Intercepting request - HandlerInterceptor

  40. Handler mappings • 레퍼런스에 오타 발견!!!! ㅋㅋ(p.265) 요렇게 고쳐야 합니다.

  41. Views and Resolving them • ModelAndView객체에 부여된 논리적인 뷰 이름으로 사용자에게 결과를 렌더링할View 빈을 결정 • ViewResolve구현체 • AbstractCachingViewResolver • XmlViewResolver • ResourceBundlerViewResolver • UrlBasedViewResolver • InternalResourceViewResolver • VelocityViewResolver, FreeMarkerViewResolver public interface ViewResolver { public View resolveViewName( String viewName, Locale locale) throws Exception; }

  42. Views and Resolving them

  43. Views and Resolving them • View Resolvers

  44. Views and Resolving them • ViewResolver설정 예제

  45. Views and Resolving them • Chaining ViewResolvers • Spring은 하나 이상의 view resolver를 사용할 수 있도록 해줌 • 특정 상황에 특정한 뷰를 재정의 가능 • 설정 예

  46. Views and Resolving them • Redirecting to views • InternalResourceViewResolver/InternalResourceView에 의해 처리되는 내부적으로 RequestDispatcher.forward()나 RequestDispatcher.include() 메소드에 의해 처리됨 • view가 렌더링되기 전 클라이언트에 HTTP redirect를 발생시키고자 할 경우가 있음 • redirect 유형 • RedirectView • redirect: prefix • forward: prefix

  47. Views and Resolving them • RedirectView • 스프링에서 제공하는 RedirectView클래스의 인스턴스를 생성하여 리턴. • 이 경우 DispatcherServlet은 일반적인 view resolution 메커니즘을 사용하지 않고 주어진 redirect 뷰를 사용 • 내부적으로 HttpServletResponse.sendRedirect()를 호출 • redirect: prefix • RedirectView가 컨트롤러와 강결합. 컨트롤러는 response가 어떻게 처리되었는지를 알 필요가 없음 • redirect: prefix를 사용할 경우 컨트롤러는 redirection이 일어났는지 알지 못함

  48. Views and Resolving them • forward: prefix • forward prefix를 사용하는 view는 UrlBasedViewResolver와 하위클래스에 의해 resolving됨 • 내부적으로 RequestDispatcher.forward()를 사용 • redirect: prefix와 마찬가지로 컨트롤러와 약결합

  49. Using Locales • 요청이 들어오면 DispatcherServlet는 locale resolver를 탐색하고 적절한 locale 적용을 시도 • RequestContext.getLocale() 메소드를 이용하여 locale resolver에 의해 resolving된 locale을 얻을 수 있음 • 특정 상황에서 locale을 변경하기 위하여(요청 파라미터에 의해) HandlerInterceptor인터페이스의 구현체를 이용하여 interceptor를 첨부할 수도 있음 • Locale Resolvers • AcceptHeaderLocaleResolver • CookieLocaleResolver • SessionLocaleResolver

  50. Using Locales

More Related