agilejava spring study
DESCRIPTION
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 - PowerPoint PPT PresentationTRANSCRIPT
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 Using Spring’s form tag library
목차
Model : 비즈니스 영역의 상태정보 표현 View : 비즈니스 영역에 대한 프레젠테이션 뷰 Controller : 입력 및 흐름 제어
개발 방식◦ 모델 1 : 가장 기본적인 개발방식 , JSP 에서 전담◦ 모델 2 : MVC 에 근간
What is MVC?
모델 1 개발방식
What is MVC?
브라우저
JSP
자바빈
요청1
응답
4
2
3
애플리케이션 서버 엔터프라이즈 서버 /데이터 소스
모델 2 개발방식
What is MVC?
브라우저
뷰 (JSP) 모델( 자바빈 )
요청1
응답
5
3
4
애플리케이션 서버 엔터프라이즈 서버 /데이터 소스
( 컨트롤러 )서블릿
2
Spring MVC
What is MVC?
HandlerMapping
ViewResolver
View
1
Controller
ModelAndView
Dispatch-erServlet
요청
23
4
56
각 MVC role 간의 명확한 분리 프레임워크 및 애플리케이션에 대한 강력하고
직관적인 설정 Adaptability, non-intrusiveness 재사용 가능한 비즈니스 코드 – 중복 제거 Customizable 바인딩 , 유효성 검사 Customizable 핸들러 맵핑 , 뷰 resolution 유연한 모델 transfer – via name/value sup-
port
Spring Web MVC 의 기능
Customizable 로케일 및 테마 resolution, Spring 태그 라이브러리 , JSTL, Velocity 등
단순하지만 강력한 Spring 태그 라이브러리 JSP 폼 태그 라이브러리 (Spring 2.0) 현재 HTTP 요청이나 HTTP Session scope 을
lifecycle 로 가지는 빈 지원
Spring Web MVC 의 기능
Spring 역시 다른 웹 MVC 프레임워크와 마찬가지로 request-driven 임
즉 , 요청을 컨트롤러로 디스패치하는 서블릿 중심으로 이루어져 있음
그러나 Spring 의 DispatcherServlet 은 여기에만 그치지 않고 Spring 의 IoC 컨테이너와 기타 Spring 이 제공하는 기능들을 완전히 통합할 수 있도록 해줌
DispatcherServlet
Workflow in Spring Web MVC
DispatcherServlet
FrontController Controller
ViewTemplate
요청
응답
요청 위임
Model
응답 렌더링 위임 모델 생성
요청 처리
Model 응답 렌더링제어반환
서블릿 엔진 ( 예 , Tomcat)
DispatcherServlet 의 상속구조
DispatcherServlet
HttpServletjavax.servlet.http
DispatcherServletorg.springframework.web.servlet
FrameworkServletorg.springframework.web.servlet
org.springframework.web.servlet HttpServletBean
DispatcherServlet 을 등록 (web.xml)
◦ DispatcherServlet 초기화시 WEB-INF 디렉터리에서[servlet-name]-servlet.xml 파일을 탐색
◦ 따라서 여기에서는 /WEB-INF/blog-servlet.xml 파일을 탐색
DispatcherServlet
WebApplicationContext◦ ApplicationContext 를 확장하여 웹 애플리케이션에 필요한 추가
기능을 제공◦ 기본적으로 DispatcherServlet 은 애플리케이션 초기화시 Xml-
WebApplicationContext 에 다음의 bean 이 선언되어 있는지를 검사 (WEB_APPLICATION_CONTEXT_ATTRIBUTE 필드 ) HandlerMapping -> “handlerMapping” ViewResolver -> “viewResolver” LocaleResolver -> “localeResolver” MultipartResolver -> “multipartResolver” ThemeResolver -> “themeResolver” HandlerExceptionResolver -> “handlerExceptionResolver” Controllers -> “??” HandlerInterceptors -> “??”
DispatcherServlet
WebApplicationContext 의 special beans
DispatcherServlet
빈 타입 설명Controllers MVC 의 ‘ C’ 를 이루는 컨트롤러들Handler mappings 전 - 후처리기 및 컨트롤러 실행목록을 처리 (URL 맵핑 )
View resolvers View 이름을 토대로 뷰 처리를 위해 resolving 수행Locale resolvers 클라이언트가 사용하고 있는 로케일을 resolving, 지역화Theme resolvers 웹 애플리케이션이 사용하는 테마를 resolving, personalizationMultipart file re-solver HTML 폼으로부터 파일 업로드 처리Handler exception resolver(s) 예외 발생시 특정 view 나 복잡한 예외처리 코드로 맵핑
기본값은 DispatcherServlet.properties 에 정의
DispatcherServlet
컨트롤러는 일반적으로 서비스 인터페이스에 정의된 애플리케이션의 behavior 에 대한 접근을 제공
컨트롤러는 사용자 입력을 해석하고 변환하여 view를 통해 그 입력에 대한 결과를 돌려줌
Spring 에서는 다음과 같은 유형의 컨트롤러를 제공◦ Form-specific controllers◦ Command-based controllers◦ Wizard-style controllers
org.springframework.web.servlet.mvc.Con-troller 인터페이스에 기반
Controllers
public interface Controller { ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception;}
Controllers
AbstractController BaseCommandController WebContentGenerator ParameterizableViewController AbstractUrlViewController UrlFilenameViewController MultiActionController AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController CancellableFormController ServletForwardingController ServletWrappingController
Controllers
Controllers
Spring MVC 가 제공하는 컨트롤러 클래스
Controllers
컨트롤러 유형 클래스 유용한 상황단순 Controller( 인터페이스 )
AbstractController극도로 간단한 컨트롤러를 만들고자 할 때 사용 . 기본적인 자바 서블릿이 제공하는 것보다 기능이 약간 더 많음
일회성 ThrowawayController요청을 명령으로서 처리하는 단순한 방법을 사용하고자 할 때 사용 . WebWork 의 Action 과 유사
다중 액션 MultiActionController 비슷하거나 관련있는 로직을 수행하는 다수의 액션을 가지고 있을 때 사용
명령 BaseCommandControllerAbstractCommandController
요청으로부터 하나 이상의 파라미터를 받아서 다른 객체에 바인딩시켜야 할 떄 사용 . 또한 파라미터의 유효성 검증 기능이 포함됨
폼 AbstractFormControllerSimpleFormController
입력 폼을 사용자에게 보여주며 입력된 데이터를 처리해야 하는 경우에 사용
마법사 AbstractWizardFormController사용자로 하여금 다수의 페이지에 걸친 복잡한 입력 폼들을 거치도록 해야 할 경우에 사용 ( 실질적으로는 하나의 폼으로서 처리됨 )
AbstractController 에서 제공하는 기능
Controllers
기 능 설 명supportedMethods 이 컨트롤러가 어떤 메소드를 받아들여야 하는지를 나타냄 . 일반적으로 GET 과
POST 둘 모두 지정되어 있음 . 지정된 메소드가 아니면 ServletException 이 발생requiresSession 컨트롤러가 주어진 작업을 처리하기 위하여 HTTP 세션을 필요로 하는지를 나타냄 .
요청을 받을 시 세션이 없을 경우 ServletException 이 발생synchronizeSes-sion 사용자의 HTTP 세션에 대하여 컨트롤러를 동기화하고자 할 때 사용
cacheSeconds HTTP 응답에 캐싱 지시자 (caching directive) 를 생성하고자 할 때 사용하며 양의 정수값으로 지정 . 기본값은 -1 이며 캐싱 지시자가 생성되지 않음
useExpireHeader 컨트롤러가 생성된 응답에 HTTP 1.0 에 compatible 한 “ Expires” 헤더를 지정할 때 사용 . 기본값은 true.
useCacheHeader 컨트롤러가 생성된 응답에 HTTP 1.1 에 compatible 한 “ Cache-Control” 헤더를 지정할 때 사용 . 기본값은 true.
AbstractController 를 사용할 경우 hadleRequestInternal() 만 구현해주면 됨
Controllers
컨트롤러 등록
Controllers
hello.jsp
ParameterizableViewController◦ AbstractController 를 확장◦ 앞서 살펴보았던 AbstractController 와 동일하나 setView-
Name(String) 메서드를 이용하여 View 이름을 지정해줄 수 있음
◦ 뷰 이름을 Java 클래스 내에 하드코딩할 필요가 없어짐
UrlFilenameViewController◦ AbstractUrlViewController 를 확장◦ URL 을 검사하여 요청 파일의 이름을 알아내어 그 이름을 뷰
이름으로 사용함 .◦ Ex) http://www.springframework.org/index.html의 경우
index 가 뷰 이름이 됨 .
Controllers
MultiActionController◦ 한 컨트롤러 클래스 내에 여러 여러 action 이 포함◦ 한 컨트롤러 내에 비슷한 공통적인 기능이 다수 포함되어
있으나 각각의 진입점을 가질 필요가 있을 경우 편리하게 사용
◦ MultiActionController 의 기능
Controllers
기 능 설 명delegate MultiActionController 의 하위 클래스를 생성하지 않고 위임 객체를 이용하여
MultiActionController 를 이용할 경우 사용함 .
methodNameRe-solver
클라이언트로부터 들어오는 요청에 기반하여 호출해야할 메소드를 resolving하는 전략이 필요한데 , 이러한 전략이 MethodNameResolver 에 정의됨
MultiActionController 의 메소드 정의◦ 오버로딩이 허용되지 않음◦ 다음의 메소드 서명을 따름
◦ 따라서 다음의 메소드 서명을 가진 메소드 선언이 가능
Controllers
public [ModelAndView | Map | void] anyMeaningfulName(HttpServletRequest, HttpServletResponse
[, Exception | anyObject]);
public ModelAndView doRequest(HttpServletRequest, HttpServletResponse)
public ModelAndView doLogin(HttpServletRequest, HttpServle-tResponse, Login)
public ModelAndView processException(HttpServletRequest, HttpServletResponse, IllegalArgumentException)
public void goHome(HttpServletRequest, HttpServletResponse)public Map doRequest(HttpServletRequest, HttpServletRe-sponse)
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 이란 것이 정의되어 있으면
그것과 맵핑된 메소드가 실행 .
Controllers
MultiActionController 예제◦ ParameterMethodNameResolver
Controllers
Command controllers◦ 데이터 객체와 HttpServletRequest 객체간의 바인딩 지원◦ 스트러츠의 ActionForm 과 유사하다고 하나 데이터 객체가
Framework-specific 인터페이스를 구현할 필요가 없음◦ 유형
AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController
Controllers
AbstractCommandController◦ 요청 파라미터를 데이터 객체와 바인딩할 수 있음◦ command object 에 대한 유효성 검증 (validation) 기능
제공
AbstractFormController◦ 폼 전송을 지원하는 컨트롤러◦ 사용자가 폼을 채우면 AbstractFormController 가 필드를
바인딩 하며 command object 에 대한 유효성 검증을 수행한 다음 컨트롤러로 리턴된 객체를 이용하여 적절한 행위를 수행
◦ 개발자는 폼을 나타내는 뷰와 submission 성공시 보여줄 뷰를 결정하는 메소드를 구현해야 함
Controllers
SimpleFormController 입력폼을 구현하기 위하여 제공되는 컨트롤러 하나의 컨트롤러로 입력이나 수정에 대한 작업을 처리 가능
GET 방식과 POST 방식에 대한 처리 과정이 서로 상이하기 때문
Spring 프레임워크 워크북 p.335~347
Controllers
AbstractWizardFormController◦ 마법사 기능을 가진 폼을 구현할 때 사용◦ 개발자는 validatePage(), processFinish() 및 pro-
cessCancel() 메소드를 구현해야 함◦ setPage() 메소드를 이용하여 페이지에 마법사
페이지들을 구성하는 페이지에 대한 String 배열을 전달◦ setCommandName() 과 setCommandClass()
메소드를 이용하여 command 객체를 지정◦ 이 밖에도 필요에 따라 개발자는 referenceData(),
getTargetPage(), onBindAndValidate(), setAl-lowDirtyBack(), setAllowDirtyForward() 등의 메소드를 재정의할 수 있음
◦ 스프링 인 액션 . p.294~300
Controllers
클라이언트 요청에 대한 적절한 핸들러와 맵핑 처리
HandlerExecutionChain◦ 요청 - 핸들러 맵핑 정보 , 요청 - 핸들러 interceptor 목록
유형◦ SimpleUrlHandlerMapping◦ BeanNameUrlHandlerMapping - 기본값
Handler mappings
public interface HandlerMapping { String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE; public HandlerExecutionChain getHandler( HttpServletRequest request) throws Exception;}
Handler mappings
앞의 두 HandlerMapping 클래스 모두 Abstrac-tHandlerMapping 을 확장하며 다음의 프로퍼티를 가짐◦ interceptors : 사용할 인터셉터 목록◦ defaultHandler : 사용할 기본 핸들러◦ order : order 프로퍼티 값 (Ordered 인터페이스 )◦ alwaysUseFullPath : true 일 경우 적절한 핸들러를 찾을
때 현재 서블릿 컨텍스트내의 완전한 경로를 이용 . false이면 현재 경로만 이용 .
◦ urlPathHelper : URL 을 검사시 UrlPathHelper 사용◦ urlDecode : 기본값은 false 이며 , URI decode 여부
결정◦ lazyInitHandlers : 기본값 false. 싱글턴 핸들러에 대한
lazy initialization 허용 여부
Handler mappings
BeanNameUrlHandlerMapping◦ 기본값으로 지정되어 있는 HandlerMapping 클래스◦ 빈 이름과 URL 을 맵핑◦ ANT-Style 의 맵핑 가능
◦ BeanNameUrlHandlerMapping 이 단순하긴 하지만 pre-sentation 계층 URL 과 컨트롤러 이름간의 결합을 발생시키므로 권장하지 않음 스프링 인 액션 , p.281
Handler mappings
SimpleUrlHandlerMapping◦ URL 패턴을 직접적으로 컨트롤러에 맵핑◦ 컨트롤러 빈을 정의하고 맵핑을 별도로 설정하는 불편함이 있기는 하지만 맵핑 정보를 수정할 필요가 있을 시 BeanNameUrlHandlerMapping 에 비해 효율적으로 관리 가능
Handler mappings
Intercepting request - HandlerInterceptor◦ 실제로 핸들러가 실행되기 전 (before) 과 요청에 대한
처리가 완전히 완료되었을 때 (after) 의 필요한 작업을 수행
◦ preHandle() 및 postHandle() 메소드를 사용◦ preHandle() 메소드는 리턴값으로 boolean 값을
리턴하며 , true 일 경우 , 계속 요청 처리를 수행하고 , false 일 경우 요청 처리를 중단
◦ 예제 http://whiteship.tistory.com/841 ^^;
Handler mappings
Intercepting request - HandlerInterceptor
Handler mappings
레퍼런스에 오타 발견 !!!! ㅋㅋ (p.265)
Handler mappings
요렇게 고쳐야 합니다 .
ModelAndView 객체에 부여된 논리적인 뷰 이름으로 사용자에게 결과를 렌더링할 View 빈을 결정
ViewResolve 구현체◦ AbstractCachingViewResolver◦ XmlViewResolver◦ ResourceBundlerViewResolver◦ UrlBasedViewResolver◦ InternalResourceViewResolver◦ VelocityViewResolver, FreeMarkerViewResolver
Views and Resolving them
public interface ViewResolver { public View resolveViewName( String viewName, Locale locale) throws Exception;}
Views and Resolving them
View Resolvers
Views and Resolving them
ViewResolver Description
AbstractCachingViewRe-solver 뷰에 대한 캐싱 지원XmlViewResolver XML 설정파일을 통한 뷰 설정 지원
기본 설정 파일 : /WEB-INF/views.xmlResourceBundleViewRe-solver
ResourceBundle 에 포함되어 있는 빈 정의를 사용하는 뷰에 대한 구현 . 기본값은 views.properties
UrlBasedViewResolver 명시적인 맵핑 정의없이 뷰 이름을 직접적인 URL 로 지정InternalResourceViewRe-solver
UrlBasedViewResolver 의 하위클래스로서 Internal-ResourceView 와 JstlView, TilesView 의 하위클래스를 지원
VelocityViewResolver / FreeMarkerViewResolver
UrlBasedViewResolver 의 하위클래스로서 , Veloci-tyView 나 FreeMarkerView 를 지원
ViewResolver 설정 예제
Views and Resolving them
Chaining ViewResolvers◦ Spring 은 하나 이상의 view resolver 를 사용할 수
있도록 해줌◦특정 상황에 특정한 뷰를 재정의 가능◦ 설정 예
Views and Resolving them
Redirecting to views◦ InternalResourceViewResolver/InternalResourceView
에 의해 처리되는 내부적으로 RequestDispatcher.for-ward() 나 RequestDispatcher.include() 메소드에 의해 처리됨
◦ view 가 렌더링되기 전 클라이언트에 HTTP redirect 를 발생시키고자 할 경우가 있음
◦ redirect 유형 RedirectView redirect: prefix forward: prefix
Views and Resolving them
RedirectView◦ 스프링에서 제공하는 RedirectView 클래스의 인스턴스를
생성하여 리턴 .◦ 이 경우 DispatcherServlet 은 일반적인 view resolution
메커니즘을 사용하지 않고 주어진 redirect 뷰를 사용◦ 내부적으로 HttpServletResponse.sendRedirect() 를 호출
redirect: prefix◦ RedirectView 가 컨트롤러와 강결합 . 컨트롤러는 re-
sponse 가 어떻게 처리되었는지를 알 필요가 없음◦ redirect: prefix 를 사용할 경우 컨트롤러는 redirection 이
일어났는지 알지 못함
Views and Resolving them
forward: prefix◦ forward prefix 를 사용하는 view 는 UrlBasedViewRe-
solver 와 하위클래스에 의해 resolving 됨◦ 내부적으로 RequestDispatcher.forward() 를 사용◦ redirect: prefix 와 마찬가지로 컨트롤러와 약결합
Views and Resolving them
요청이 들어오면 DispatcherServlet 는 locale re-solver 를 탐색하고 적절한 locale 적용을 시도
RequestContext.getLocale() 메소드를 이용하여 locale resolver 에 의해 resolving 된 locale 을 얻을 수 있음
특정 상황에서 locale 을 변경하기 위하여 ( 요청 파라미터에 의해 ) HandlerInterceptor 인터페이스의 구현체를 이용하여 interceptor 를 첨부할 수도 있음
Locale Resolvers◦ AcceptHeaderLocaleResolver◦ CookieLocaleResolver◦ SessionLocaleResolver
Using Locales
Using Locales
LocaleChangeInterceptor
Using Locales
org.springframework.ui.context.ThemeSource를 이용하여 테마 기능을 웹 애플리케이션에 적용가능
WebApplicationContext 인터페이스에서 ThemeSource 인터페이스를 확장하긴 하나 책임은 모두 구현체에 위임
기본적으로 ResourceBundleThemeSource 가 properties 파일을 읽어 테마를 적용
Theme resolvers◦ FixedThemeResolver◦ SessionThemeResolver◦ CookieThemeResolver
Using themes
Using themes
org.springframework.web.multipart MultipartResolver 의 구현체
◦ CommonsMultipartResolver◦ CosMultipartResolver
기본적으로 Spring 에서는 multipart 처리를 하지 않음
Web application context 에 multipart re-solver 를 등록한 다음부터는 request 에 multi-part 가 있는지를 검사하여 , 만약 multipart 가 발견되면 지정한 MultipartResolver 가 요청을 처리
Spring’s multipart sup-port
Using the MultipartResolver
commons-fileupload.jar 나 cos.jar 필요
Spring’s multipart support
Handling a file upload in a form
Spring’s multipart sup-port
Handling a file upload in a form
Spring’s multipart support
Handling a file upload in a form
Spring’s multipart sup-port
*uploadFormFile() 메소드는 Spring 프레임워크 워크북 참조
Spring 2.0 부터 제공 설정 : spring-form.tld, taglib 지시자에 선언
Using Spring’s form tag li-brary
form 태그
Using Spring’s form tag li-brary
input 태그◦ text type 의 input 태그로 렌더링
checkbox 태그◦ Spring 레퍼런스 p.277 의 Preferences class
Using Spring’s form tag li-brary
radiobutton 태그
password 태그◦ showPassword : 기본값은 패스워드가 보이지 않음
Using Spring’s form tag li-brary
select 태그
option 태그
Using Spring’s form tag li-brary
options 태그
textarea 태그
Using Spring’s form tag li-brary
hidden 태그
errors 태그
Using Spring’s form tag li-brary
errors 태그
Using Spring’s form tag li-brary
Spring Framework Rerefence, Interface21 Spring 프레임워크 워크북 , 박재성 , 한빛 미디어 스프링 인 액션 , 크렉 월즈 / 이태상 옮김 , 에이콘백기선님 블로그 , http://whiteship.tistory.com/
References
부족한 예제 , 불충분한 설명을 그저 양으로 때운 발표였습니다 .
경청해 주셔서 감사합니다 . ^^;