agilejava spring study

68
Agilejava.net Spring Study Chapter 13. Web MVC Framework 이이이 이이이

Upload: zach

Post on 23-Feb-2016

77 views

Category:

Documents


1 download

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 Presentation

TRANSCRIPT

Page 1: Agilejava  Spring Study

Agilejava.net Spring Study

Chapter 13. Web MVC Framework

이윤걸이대엽

Page 2: Agilejava  Spring Study

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

목차

Page 3: Agilejava  Spring Study

Model : 비즈니스 영역의 상태정보 표현 View : 비즈니스 영역에 대한 프레젠테이션 뷰 Controller : 입력 및 흐름 제어

개발 방식◦ 모델 1 : 가장 기본적인 개발방식 , JSP 에서 전담◦ 모델 2 : MVC 에 근간

What is MVC?

Page 4: Agilejava  Spring Study

모델 1 개발방식

What is MVC?

브라우저

JSP

자바빈

요청1

응답

4

2

3

애플리케이션 서버 엔터프라이즈 서버 /데이터 소스

Page 5: Agilejava  Spring Study

모델 2 개발방식

What is MVC?

브라우저

뷰 (JSP) 모델( 자바빈 )

요청1

응답

5

3

4

애플리케이션 서버 엔터프라이즈 서버 /데이터 소스

( 컨트롤러 )서블릿

2

Page 6: Agilejava  Spring Study

Spring MVC

What is MVC?

HandlerMapping

ViewResolver

View

1

Controller

ModelAndView

Dispatch-erServlet

요청

23

4

56

Page 7: Agilejava  Spring Study

각 MVC role 간의 명확한 분리 프레임워크 및 애플리케이션에 대한 강력하고

직관적인 설정 Adaptability, non-intrusiveness 재사용 가능한 비즈니스 코드 – 중복 제거 Customizable 바인딩 , 유효성 검사 Customizable 핸들러 맵핑 , 뷰 resolution 유연한 모델 transfer – via name/value sup-

port

Spring Web MVC 의 기능

Page 8: Agilejava  Spring Study

Customizable 로케일 및 테마 resolution, Spring 태그 라이브러리 , JSTL, Velocity 등

단순하지만 강력한 Spring 태그 라이브러리 JSP 폼 태그 라이브러리 (Spring 2.0) 현재 HTTP 요청이나 HTTP Session scope 을

lifecycle 로 가지는 빈 지원

Spring Web MVC 의 기능

Page 9: Agilejava  Spring Study

Spring 역시 다른 웹 MVC 프레임워크와 마찬가지로 request-driven 임

즉 , 요청을 컨트롤러로 디스패치하는 서블릿 중심으로 이루어져 있음

그러나 Spring 의 DispatcherServlet 은 여기에만 그치지 않고 Spring 의 IoC 컨테이너와 기타 Spring 이 제공하는 기능들을 완전히 통합할 수 있도록 해줌

DispatcherServlet

Page 10: Agilejava  Spring Study

Workflow in Spring Web MVC

DispatcherServlet

FrontController Controller

ViewTemplate

요청

응답

요청 위임

Model

응답 렌더링 위임 모델 생성

요청 처리

Model 응답 렌더링제어반환

서블릿 엔진 ( 예 , Tomcat)

Page 11: Agilejava  Spring Study

DispatcherServlet 의 상속구조

DispatcherServlet

HttpServletjavax.servlet.http

DispatcherServletorg.springframework.web.servlet

FrameworkServletorg.springframework.web.servlet

org.springframework.web.servlet HttpServletBean

Page 12: Agilejava  Spring Study

DispatcherServlet 을 등록 (web.xml)

◦ DispatcherServlet 초기화시 WEB-INF 디렉터리에서[servlet-name]-servlet.xml 파일을 탐색

◦ 따라서 여기에서는 /WEB-INF/blog-servlet.xml 파일을 탐색

DispatcherServlet

Page 13: Agilejava  Spring Study

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

Page 14: Agilejava  Spring Study

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 나 복잡한 예외처리 코드로 맵핑

Page 15: Agilejava  Spring Study

기본값은 DispatcherServlet.properties 에 정의

DispatcherServlet

Page 16: Agilejava  Spring Study

컨트롤러는 일반적으로 서비스 인터페이스에 정의된 애플리케이션의 behavior 에 대한 접근을 제공

컨트롤러는 사용자 입력을 해석하고 변환하여 view를 통해 그 입력에 대한 결과를 돌려줌

Spring 에서는 다음과 같은 유형의 컨트롤러를 제공◦ Form-specific controllers◦ Command-based controllers◦ Wizard-style controllers

org.springframework.web.servlet.mvc.Con-troller 인터페이스에 기반

Controllers

Page 17: Agilejava  Spring Study

public interface Controller { ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception;}

Controllers

Page 18: Agilejava  Spring Study

AbstractController BaseCommandController WebContentGenerator ParameterizableViewController AbstractUrlViewController UrlFilenameViewController MultiActionController AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController CancellableFormController ServletForwardingController ServletWrappingController

Controllers

Page 19: Agilejava  Spring Study

Controllers

Page 20: Agilejava  Spring Study

Spring MVC 가 제공하는 컨트롤러 클래스

Controllers

컨트롤러 유형 클래스 유용한 상황단순 Controller( 인터페이스 )

AbstractController극도로 간단한 컨트롤러를 만들고자 할 때 사용 . 기본적인 자바 서블릿이 제공하는 것보다 기능이 약간 더 많음

일회성 ThrowawayController요청을 명령으로서 처리하는 단순한 방법을 사용하고자 할 때 사용 . WebWork 의 Action 과 유사

다중 액션 MultiActionController 비슷하거나 관련있는 로직을 수행하는 다수의 액션을 가지고 있을 때 사용

명령 BaseCommandControllerAbstractCommandController

요청으로부터 하나 이상의 파라미터를 받아서 다른 객체에 바인딩시켜야 할 떄 사용 . 또한 파라미터의 유효성 검증 기능이 포함됨

폼 AbstractFormControllerSimpleFormController

입력 폼을 사용자에게 보여주며 입력된 데이터를 처리해야 하는 경우에 사용

마법사 AbstractWizardFormController사용자로 하여금 다수의 페이지에 걸친 복잡한 입력 폼들을 거치도록 해야 할 경우에 사용 ( 실질적으로는 하나의 폼으로서 처리됨 )

Page 21: Agilejava  Spring Study

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.

Page 22: Agilejava  Spring Study

AbstractController 를 사용할 경우 hadleRequestInternal() 만 구현해주면 됨

Controllers

컨트롤러 등록

Page 23: Agilejava  Spring Study

Controllers

hello.jsp

Page 24: Agilejava  Spring Study

ParameterizableViewController◦ AbstractController 를 확장◦ 앞서 살펴보았던 AbstractController 와 동일하나 setView-

Name(String) 메서드를 이용하여 View 이름을 지정해줄 수 있음

◦ 뷰 이름을 Java 클래스 내에 하드코딩할 필요가 없어짐

UrlFilenameViewController◦ AbstractUrlViewController 를 확장◦ URL 을 검사하여 요청 파일의 이름을 알아내어 그 이름을 뷰

이름으로 사용함 .◦ Ex) http://www.springframework.org/index.html의 경우

index 가 뷰 이름이 됨 .

Controllers

Page 25: Agilejava  Spring Study

MultiActionController◦ 한 컨트롤러 클래스 내에 여러 여러 action 이 포함◦ 한 컨트롤러 내에 비슷한 공통적인 기능이 다수 포함되어

있으나 각각의 진입점을 가질 필요가 있을 경우 편리하게 사용

◦ MultiActionController 의 기능

Controllers

기 능 설 명delegate MultiActionController 의 하위 클래스를 생성하지 않고 위임 객체를 이용하여

MultiActionController 를 이용할 경우 사용함 .

methodNameRe-solver

클라이언트로부터 들어오는 요청에 기반하여 호출해야할 메소드를 resolving하는 전략이 필요한데 , 이러한 전략이 MethodNameResolver 에 정의됨

Page 26: Agilejava  Spring Study

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)

Page 27: Agilejava  Spring Study

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

Page 28: Agilejava  Spring Study

MultiActionController 예제◦ ParameterMethodNameResolver

Controllers

Page 29: Agilejava  Spring Study

Command controllers◦ 데이터 객체와 HttpServletRequest 객체간의 바인딩 지원◦ 스트러츠의 ActionForm 과 유사하다고 하나 데이터 객체가

Framework-specific 인터페이스를 구현할 필요가 없음◦ 유형

AbstractCommandController AbstractFormController SimpleFormController AbstractWizardFormController

Controllers

Page 30: Agilejava  Spring Study

AbstractCommandController◦ 요청 파라미터를 데이터 객체와 바인딩할 수 있음◦ command object 에 대한 유효성 검증 (validation) 기능

제공

AbstractFormController◦ 폼 전송을 지원하는 컨트롤러◦ 사용자가 폼을 채우면 AbstractFormController 가 필드를

바인딩 하며 command object 에 대한 유효성 검증을 수행한 다음 컨트롤러로 리턴된 객체를 이용하여 적절한 행위를 수행

◦ 개발자는 폼을 나타내는 뷰와 submission 성공시 보여줄 뷰를 결정하는 메소드를 구현해야 함

Controllers

Page 31: Agilejava  Spring Study

SimpleFormController 입력폼을 구현하기 위하여 제공되는 컨트롤러 하나의 컨트롤러로 입력이나 수정에 대한 작업을 처리 가능

GET 방식과 POST 방식에 대한 처리 과정이 서로 상이하기 때문

Spring 프레임워크 워크북 p.335~347

Controllers

Page 32: Agilejava  Spring Study

AbstractWizardFormController◦ 마법사 기능을 가진 폼을 구현할 때 사용◦ 개발자는 validatePage(), processFinish() 및 pro-

cessCancel() 메소드를 구현해야 함◦ setPage() 메소드를 이용하여 페이지에 마법사

페이지들을 구성하는 페이지에 대한 String 배열을 전달◦ setCommandName() 과 setCommandClass()

메소드를 이용하여 command 객체를 지정◦ 이 밖에도 필요에 따라 개발자는 referenceData(),

getTargetPage(), onBindAndValidate(), setAl-lowDirtyBack(), setAllowDirtyForward() 등의 메소드를 재정의할 수 있음

◦ 스프링 인 액션 . p.294~300

Controllers

Page 33: Agilejava  Spring Study

클라이언트 요청에 대한 적절한 핸들러와 맵핑 처리

HandlerExecutionChain◦ 요청 - 핸들러 맵핑 정보 , 요청 - 핸들러 interceptor 목록

유형◦ SimpleUrlHandlerMapping◦ BeanNameUrlHandlerMapping - 기본값

Handler mappings

public interface HandlerMapping { String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE; public HandlerExecutionChain getHandler( HttpServletRequest request) throws Exception;}

Page 34: Agilejava  Spring Study

Handler mappings

Page 35: Agilejava  Spring Study

앞의 두 HandlerMapping 클래스 모두 Abstrac-tHandlerMapping 을 확장하며 다음의 프로퍼티를 가짐◦ interceptors : 사용할 인터셉터 목록◦ defaultHandler : 사용할 기본 핸들러◦ order : order 프로퍼티 값 (Ordered 인터페이스 )◦ alwaysUseFullPath : true 일 경우 적절한 핸들러를 찾을

때 현재 서블릿 컨텍스트내의 완전한 경로를 이용 . false이면 현재 경로만 이용 .

◦ urlPathHelper : URL 을 검사시 UrlPathHelper 사용◦ urlDecode : 기본값은 false 이며 , URI decode 여부

결정◦ lazyInitHandlers : 기본값 false. 싱글턴 핸들러에 대한

lazy initialization 허용 여부

Handler mappings

Page 36: Agilejava  Spring Study

BeanNameUrlHandlerMapping◦ 기본값으로 지정되어 있는 HandlerMapping 클래스◦ 빈 이름과 URL 을 맵핑◦ ANT-Style 의 맵핑 가능

◦ BeanNameUrlHandlerMapping 이 단순하긴 하지만 pre-sentation 계층 URL 과 컨트롤러 이름간의 결합을 발생시키므로 권장하지 않음 스프링 인 액션 , p.281

Handler mappings

Page 37: Agilejava  Spring Study

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

Handler mappings

Page 38: Agilejava  Spring Study

Intercepting request - HandlerInterceptor◦ 실제로 핸들러가 실행되기 전 (before) 과 요청에 대한

처리가 완전히 완료되었을 때 (after) 의 필요한 작업을 수행

◦ preHandle() 및 postHandle() 메소드를 사용◦ preHandle() 메소드는 리턴값으로 boolean 값을

리턴하며 , true 일 경우 , 계속 요청 처리를 수행하고 , false 일 경우 요청 처리를 중단

◦ 예제 http://whiteship.tistory.com/841 ^^;

Handler mappings

Page 39: Agilejava  Spring Study

Intercepting request - HandlerInterceptor

Handler mappings

Page 40: Agilejava  Spring Study

레퍼런스에 오타 발견 !!!! ㅋㅋ (p.265)

Handler mappings

요렇게 고쳐야 합니다 .

Page 41: Agilejava  Spring Study

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;}

Page 42: Agilejava  Spring Study

Views and Resolving them

Page 43: Agilejava  Spring Study

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 를 지원

Page 44: Agilejava  Spring Study

ViewResolver 설정 예제

Views and Resolving them

Page 45: Agilejava  Spring Study

Chaining ViewResolvers◦ Spring 은 하나 이상의 view resolver 를 사용할 수

있도록 해줌◦특정 상황에 특정한 뷰를 재정의 가능◦ 설정 예

Views and Resolving them

Page 46: Agilejava  Spring Study

Redirecting to views◦ InternalResourceViewResolver/InternalResourceView

에 의해 처리되는 내부적으로 RequestDispatcher.for-ward() 나 RequestDispatcher.include() 메소드에 의해 처리됨

◦ view 가 렌더링되기 전 클라이언트에 HTTP redirect 를 발생시키고자 할 경우가 있음

◦ redirect 유형 RedirectView redirect: prefix forward: prefix

Views and Resolving them

Page 47: Agilejava  Spring Study

RedirectView◦ 스프링에서 제공하는 RedirectView 클래스의 인스턴스를

생성하여 리턴 .◦ 이 경우 DispatcherServlet 은 일반적인 view resolution

메커니즘을 사용하지 않고 주어진 redirect 뷰를 사용◦ 내부적으로 HttpServletResponse.sendRedirect() 를 호출

redirect: prefix◦ RedirectView 가 컨트롤러와 강결합 . 컨트롤러는 re-

sponse 가 어떻게 처리되었는지를 알 필요가 없음◦ redirect: prefix 를 사용할 경우 컨트롤러는 redirection 이

일어났는지 알지 못함

Views and Resolving them

Page 48: Agilejava  Spring Study

forward: prefix◦ forward prefix 를 사용하는 view 는 UrlBasedViewRe-

solver 와 하위클래스에 의해 resolving 됨◦ 내부적으로 RequestDispatcher.forward() 를 사용◦ redirect: prefix 와 마찬가지로 컨트롤러와 약결합

Views and Resolving them

Page 49: Agilejava  Spring Study

요청이 들어오면 DispatcherServlet 는 locale re-solver 를 탐색하고 적절한 locale 적용을 시도

RequestContext.getLocale() 메소드를 이용하여 locale resolver 에 의해 resolving 된 locale 을 얻을 수 있음

특정 상황에서 locale 을 변경하기 위하여 ( 요청 파라미터에 의해 ) HandlerInterceptor 인터페이스의 구현체를 이용하여 interceptor 를 첨부할 수도 있음

Locale Resolvers◦ AcceptHeaderLocaleResolver◦ CookieLocaleResolver◦ SessionLocaleResolver

Using Locales

Page 50: Agilejava  Spring Study

Using Locales

Page 51: Agilejava  Spring Study

LocaleChangeInterceptor

Using Locales

Page 52: Agilejava  Spring Study

org.springframework.ui.context.ThemeSource를 이용하여 테마 기능을 웹 애플리케이션에 적용가능

WebApplicationContext 인터페이스에서 ThemeSource 인터페이스를 확장하긴 하나 책임은 모두 구현체에 위임

기본적으로 ResourceBundleThemeSource 가 properties 파일을 읽어 테마를 적용

Theme resolvers◦ FixedThemeResolver◦ SessionThemeResolver◦ CookieThemeResolver

Using themes

Page 53: Agilejava  Spring Study

Using themes

Page 54: Agilejava  Spring Study

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

Page 55: Agilejava  Spring Study

Using the MultipartResolver

commons-fileupload.jar 나 cos.jar 필요

Spring’s multipart support

Page 56: Agilejava  Spring Study

Handling a file upload in a form

Spring’s multipart sup-port

Page 57: Agilejava  Spring Study

Handling a file upload in a form

Spring’s multipart support

Page 58: Agilejava  Spring Study

Handling a file upload in a form

Spring’s multipart sup-port

*uploadFormFile() 메소드는 Spring 프레임워크 워크북 참조

Page 59: Agilejava  Spring Study

Spring 2.0 부터 제공 설정 : spring-form.tld, taglib 지시자에 선언

Using Spring’s form tag li-brary

Page 60: Agilejava  Spring Study

form 태그

Using Spring’s form tag li-brary

Page 61: Agilejava  Spring Study

input 태그◦ text type 의 input 태그로 렌더링

checkbox 태그◦ Spring 레퍼런스 p.277 의 Preferences class

Using Spring’s form tag li-brary

Page 62: Agilejava  Spring Study

radiobutton 태그

password 태그◦ showPassword : 기본값은 패스워드가 보이지 않음

Using Spring’s form tag li-brary

Page 63: Agilejava  Spring Study

select 태그

option 태그

Using Spring’s form tag li-brary

Page 64: Agilejava  Spring Study

options 태그

textarea 태그

Using Spring’s form tag li-brary

Page 65: Agilejava  Spring Study

hidden 태그

errors 태그

Using Spring’s form tag li-brary

Page 66: Agilejava  Spring Study

errors 태그

Using Spring’s form tag li-brary

Page 67: Agilejava  Spring Study

Spring Framework Rerefence, Interface21 Spring 프레임워크 워크북 , 박재성 , 한빛 미디어 스프링 인 액션 , 크렉 월즈 / 이태상 옮김 , 에이콘백기선님 블로그 , http://whiteship.tistory.com/

References

Page 68: Agilejava  Spring Study

부족한 예제 , 불충분한 설명을 그저 양으로 때운 발표였습니다 .

경청해 주셔서 감사합니다 . ^^;