1. 개요 - 실행환경화면처리레이어 (1/3) 화면처리레이어는업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면 구성, 사용자입력정보검증등의기능제공 서비스그룹 설명 Presentation Layer 전자정부개발프레임워크실행환경 Business Logic Layer Persistence Layer Batch Layer Integration Layer Mobile Presentation Layer Layer Mobile Device API Presentation Layer Business Logic Layer Persistence Layer 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Batch Layer 대용량데이터처리를위한기반환경을제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 Page l 4 4
1. 개요 - 실행환경화면처리레이어 (2/3) 화면처리레이어는 MVC, Ajax Support 등총 5 개의서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 배치처리레이어 연계통합레이어 모바일화면처리 모바일디바이스 API Ajax Support MVC UI Adaptor Internationalization Validation Biz. Process Management Exception Handling Data Access ORM Transaction DataSource Batch Core Batch Support Batch Execution Message Service Naming Service Web Service UX/UI Component Device API 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling Server Security String Util XML Manipulation 공통기반레이어살펴보기 Page l 5 5
2. MVC - 개요 (1/2) 서비스개요 MVC(Model-View-Controller) 패턴은코드를기능에따라 Model, View, Controller 3가지요소로분리한다. Model : 어플리케이션의데이터와비지니스로직을담는객체이다. View : Model의정보를사용자에게표시한다. 하나의 Model을다양한 View에서사용할수있다. Controller : Model과 View의중계역할. 사용자의요청을받아 Model에변경된상태를반영하고, 응답을위한 View를선택한다. MVC 패턴은 UI 코드와비지니스코드를분리함으로써종속성을줄이고, 재사용성을높이고, 보다쉬운변경이가능하도록한다. 전자정부프레임워크에서 MVC 서비스 란 MVC 패턴을활용한 Web MVC Framework를의미한다. Page l 7 7
2. MVC - 개요 (1/2) 오픈소스 Web MVC Framework Spring MVC, Struts, Webwork 등이있다. 전자정부프레임워크에서는 Spring MVC를채택하였다. Framework내의특정클래스를상속하거나, 참조, 구현해야하는등의제약사항이비교적적다. IOC Contatiner가 Spring 이라면연계를위한추가설정없이 Spring MVC를사용할수있다. 오픈소스프로젝트가활성화 ( 꾸준한기능추가, 빠른 bug fix와 Q&A) 되어있으며로드맵이신뢰할만하다. 국내커뮤니티활성화정도, 관련참고문서나도서를쉽게구할수있다. Spring MVC DispatcherServlet, HandlerMapping, Controller, Interceptor, ViewResolver, View등각컴포넌트들의역할이명확하게분리된다. HandlerMapping, Controller, View등컴포넌트들에다양한인터페이스및구현클래스를제공한다. Controller(@MVC) 나폼클래스 ( 커맨드클래스 ) 작성시에특정클래스를상속받거나참조할필요없이 POJO 나 POJOstyle의클래스를작성함으로써비지니스로직에집중한코드를작성할수있다. 웹요청파라미터와커맨드클래스간에데이터매핑기능을제공한다. 데이터검증을할수있는, Validator와 Error 처리기능을제공한다. JSP Form을쉽게구성하도록 Tag를제공한다. Page l 8 8
2. MVC - Spring MVC Architecture(1/2) Spring MVC의핵심 Component DispatcherServlet Spring MVC Framework 의 Front Controller, 웹요청과응답의 Life Cycle 을주관한다. HandlerMapping 웹요청시해당 URL 을어떤 Controller 가처리할지결정한다. Controller 비지니스로직을수행하고결과데이터를 ModelAndView 에반영한다. ModelAndView Controller 가수행결과를반영하는 Model 데이터객체와이동할페이지정보 ( 또는 View 객체 ) 로이루어져있다. ViewResolver 어떤 View 를선택할지결정한다. View 결과데이터인 Model 객체를 display 한다. Page l 9 9
2. MVC - Spring MVC Architecture(2/2) Spring MVC 컴포넌트간의관계와흐름 Client의요청이들어오면 DispatchServlet이가장먼저요청을받는다. HandlerMapping이요청에해당하는 Controller를 return한다. Controller는비지니스로직을수행 ( 호출 ) 하고결과데이터를 ModelAndView에반영하여 return한다. ViewResolver는 view name을받아해당하는 View 객체를 return한다. View는 Model 객체를받아 rendering한다. 10 Page l 10
Spring MVC 컴포넌트간의관계와흐름 HandlerMapping 이요청에해당하는 Controller 를 return 한다. Client 의요청이들어오면 DispatchServlet 이가장먼저요청을받는다. Controller 는비지니스로직을수행 ( 호출 ) 하고결과데이터를 ModelAndView 에반영하여 return 한다. View 는 Model 객체를받아 rendering 한다. ViewResolver 는 view name 을받아해당하는 View 객체를 return 한다. 11 Page l 11
2. MVC - DispatcherServlet(1/3) DispatcherServlet Controller 로향하는모든웹요청의진입점이며, 웹요청을처리하며, 결과데이터를 Client 에게응답한다. Spring MVC 의웹요청 Life Cycle 을주관 12 Page l 12
2. MVC DispatcherServlet 상세. Spring MVC 의웹요청 Life Cycle 을주관하는 DispatcherServlet 13 Page l 13
2. MVC DispatcherServlet(2/3) DispatcherServlet, ApplicationContext, WebApplicationContext 하나의빈설정파일에모든빈을등록할수도있지만, 아래와같이 Layer 별로빈파일을나누어등록하고 ApplicationContext, WebApplicationContext 사용하는것을권장. ApplicationContext : ContextLoaderListener에의해생성. persistance, service layer의빈 WebApplicationContext : DispatcherServlet에의해생성. presentation layer의빈 ContextLoaderListener는웹어플리케이션이시작되는시점에 ApplicationContext을만들고, 이 ApplicationContext의빈정보는모든 WebApplicationContext들이참조할수있다. 14 Page l 14
2. MVC DispatcherServlet(3/3) web.xml 에 DispatcherServlet 설정하기 <!-- ApplicationContext 빈설정파일 --> <context-param> <param-name>contextconfiglocation</param-name> <param-value> /WEB-INF/config/service/easycompany-service.xml <!-- 서비스빈정의 --> /WEB-INF/config/service/easycompany-dao.xml <!--Dao 빈정의 --> </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.contextloaderlistener</listener-class> </listener> <!-- WebApplicationContext 빈설정파일 --> <servlet> <servlet-name>servlet</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value> /WEB-INF/config/easycompany-servlet.xml <!--web layer 관련빈선언 --> </param-value> </init-param> </servlet> <!-- WebApplicationContext 빈설정파일 --> <servlet> <servlet-name>webservice</servlet-name> <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class> <init-param> <param-name>contextconfiglocation</param-name> <param-value> /WEB-INF/config/easycompany-webservice.xml </param-value> </init-param> </servlet> 15 Page l 15
2. MVC @MVC(1/2) @MVC 어노테이션을이용한설정 : XML 기반으로설정하던정보들을어노테이션을사용해서정의한다. 유연해진메소드시그니쳐 : Controller 메소드의파라미터와리턴타입을좀더다양하게필요에따라선택할수있다. POJO-Style의 Controller : Controller 개발시에특정인터페이스를구현하거나특정클래스를상속해야할필요가없다. 하지만, 폼처리, 다중액션등기존의계층형 Controller가제공하던기능들을여전히쉽게구현할수있다. Bean 설정파일작성 : @Controller만스캔하도록설정한다. 16 Page l 16
2. MVC @MVC(2/2) <context:component-scan/> 설정 @Component, @Service, @Repository, @Controller 가붙은클래스들을읽어들여 ApplicationContext, WebApplicationContext에빈정보를저장, 관리한다. @Controller만스캔하려면 <context:include-filter> 나 <context:exclude-filter> 를사용해야한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd> <context:component-scan base-package="com.easycompany.controller.annotation"> <context:include-filter type="annotation" expression="org.springframework.stereotype.controller"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.service"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.repository"/> </context:component-scan> </beans> 17 Page l 17
2. MVC HandlerMapping RequestMappingHandlerMapping (DefaultAnnotationHandlerMapping 는 deprecated) @MVC 개발을위한 HandlerMapping. 표준프레임워크 3.0(Spring 3.2.9) 에서사용가능. 기존 DefaultAnnotationHandlerMapping이 deprecated되면서대체됨. @RequestMapping에지정된 url과해당 Controller의메소드매핑 RequestMappingHandlerMapping은기본 HandlerMapping이며, 선언하기위해서는다음과같이세가지방법이있다. 선언하지않는방법 : 기본 HandlerMapping 이므로지정하지않아도사용가능하다. <mvc:annotation-driven/> 을선언하는방법 : @MVC 사용시필요한빈들을등록해주는 <mvc:annotation-driven/> 을설정하 면내부에서 RequestMappingHandlerMapping, RequestMappingHandlerAdapter 이구성된다. RequestMappingHandlerMaping 을직접선언하는방법 : 다른 HandlerMapping 과함께사용할때선언한다. <?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="org.mycode.controller" /> <! 명시적선언 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"/> </beans> 18 Page l 18
2. MVC HandlerMapping SimpleUrlAnnotationHandlerMapping( 표준프레임워크 3.0 부터 deprecated 됨 mvc 태그로변경 ) DefaultAnnotationHandlerMapping 은특정 url 에대해 interceptor 를적용할수없음. -> 확장 HandlerMapping DefaultAnnotationHandlerMapping 과함께사용. (order 프로퍼티를 SimpleUrlAnnotationHandlerMapping 에준다.) 표준프레임워크 2.7 이하 표준프레임워크 3.0 이상 <bean id="selectannotaionmapper class="egovframework.rte.ptl.mvc.handler.simpleurlannotationhandlermapping p:order="1"> <property name="interceptors"> <list> <ref local="authenticinterceptor"/> </list> </property> <property name="urls"> <list> <value>/admin/*.do</value> <value>/user/userinfo.do</value> <value>/development/**/code*.do</value> </list> </property> </bean> <bean id="annotationmapper class="org.springframework.web.servlet.mvc.annotation.defaultannotationhandlerm apping p:order="2"/> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/admin/*.do"/> <mvc:mapping path="/user/userinfo.do"/> <mvc:mapping path="/development/**/code*.do"/> <mvc:mapping path="/egov/**"/> <mvc:exclude-mapping path="/egov/admin/**"/> <bean class="egov.interceptors.authenticinterceptor"/> </mvc:interceptor> </mvc:interceptors> 19 Page l 19
2. MVC @Controller 관련어노테이션 (1/8) 관련어노테이션 @Controller @RequestMapping @RequestParam @ModelAttribute @SessionAttributes @CommandMap 해당클래스가 Controller 임을나타내기위한어노테이션 요청에대해어떤 Controller, 어떤메소드가처리할지를맵핑하기위한어노테이션 Controller 메소드의파라미터와웹요청파라미터와맵핑하기위한어노테이션 Controller 메소드의파라미터나리턴값을 Model 객체와바인딩하기위한어노테이션 Model 객체를세션에저장하고사용하기위한어노테이션 Controller 메소드의파라미터를 Map 형태로받을때웹요청파라미터와맵핑하기위한어노테이션 (egov 3.0 부터추가 ) @Controller @MVC 에서 Controller 를만들기위해서는작성한클래스에 @Controller 를붙여주면된다. 특정클래스를구현하거나상속 할필요가없다. import org.springframework.stereotype.controller; @Controller public class HelloController {... } 20 Page l 20
2. MVC @Controller 관련어노테이션 (2/8) @RequestMapping 요청에대해어떤 Controller, 어떤메소드가처리할지를매핑하기위한어노테이션이다 관련속성 이름타입매핑조건설명 value String[] URL 값 - @RequestMapping(value= /hello.do ) - @RequestMapping(value={ /hello.do, /world.do }) - @RequestMapping( /hello.do ) - Ant-Style 패턴매칭이용 : /mypath/*.do method Request Method[] HTTP Request 메소드값 - @RequestMapping(method = RequestMethod.POST) - 사용가능한메소드 : GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE params String[] HTTP Request 파 라미터 - params= myparam=myvalue : HTTP Request URL 중에 myparam 이라는파라미터가있어야하고값은 myvalue 이어야맵핑 - params= myparam : 파라미터이름만으로조건을부여 -!myparam : myparam 이라는파라미터가없는요청만을맵핑 - @RequestMapping(params={ myparam1=myvalue, myparam2,!myparam3 }) 와같이조건을주었다면, HTTP Request 에는파라미터 myparam1 이 myvalue 값을가지고있고, myparam2 파라미터가있어야하고, myparam3 라는파라미터는없어야함. 21 Page l 21
2. MVC @Controller 관련어노테이션 (3/8) @RequestMapping 설정 @RequestMapping 은클래스단위 (type level) 나메소드단위 (method level) 로설정할수있다. type level /hello.do 요청이오면 HelloController의 hello 메소드가수행된다. type level에서 URL을정의하고 Controller에메소드가하나만있어도요청처리를담당할메소드위에 @RequestMapping 표기를해야제대로맵핑이된다. import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; @Controller @RequestMapping("/hello.do") public class HelloController { } @RequestMapping public String hello(){... } 22 Page l 22
2. MVC @Controller 관련어노테이션 (4/8) method level /hello.do 요청이오면 hello 메소드, /helloform.do 요청은 GET 방식이면 helloget 메소드, POST 방식이면 hellopost 메소드가수행된다. import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; @Controller public class HelloController { @RequestMapping(value="/hello.do") public String hello(){... } @RequestMapping(value="/helloForm.do", method = RequestMethod.GET) public String helloget(){... } } @RequestMapping(value="/helloForm.do", method = RequestMethod.POST) public String hellopost(){... } 23 Page l 23
2. MVC @Controller 관련어노테이션 (5/8) type + method level type level, method level 둘다설정할수도있는데, 이경우엔 type level에설정한 @RequestMapping의 value(url) 를 method level에서재정의할수없다. /hello.do 요청시에 GET 방식이면 helloget 메소드, POST 방식이면 hellopost 메소드가수행된다. @Controller @RequestMapping("/hello.do") public class HelloController { @RequestMapping(method = RequestMethod.GET) public String helloget(){... } } @RequestMapping(method = RequestMethod.POST) public String hellopost(){... } 24 Page l 24
2. MVC @Controller 관련어노테이션 (6/8) @RequestParam @RequestParam 은 Controller 메소드의파라미터와웹요청파라미터와맵핑하기위한어노테이션이다. 관련속성 이름타입설명 value String 파라미터이름 required boolean 해당파라미터가반드시필수인지여부. 기본값은 true 이다. 해당파라미터가 Request 객체안에없을때그냥 null 값을바인드하고싶다면, 아래예제의 pageno 파라미터처럼 required=false 로명시해야한다. name 파라미터는 required 가 true 이므로, 만일 name 파라미터가 null 이면 org.springframework.web.bind.missingservletrequestparameterexception 이발생한다. @Controller public class HelloController { } @RequestMapping("/hello.do") public String hello(@requestparam("name") String name, @RequestParam(value="pageNo", required=false) String pageno){... } 25 Page l 25
2. MVC @Controller 관련어노테이션 (7/8) @ModelAttribute @ModelAttribute은 Controller에서 2가지방법으로사용된다. 1. Model 속성 (attribute) 과메소드파라미터의바인딩. 2. 입력폼에필요한참조데이터 (reference data) 작성. - SimpleFormContrller의 referencedata 메소드와유사한기능. 관련속성 이름타입설명 value String 바인드하려는 Model 속성이름. @SessionAttributes @SessionAttributes는 model attribute를 session에저장, 유지할때사용하는어노테이션이다. @SessionAttributes는클래스레벨 (type level) 에서선언할수있다. 관련속성 이름타입설명 value String[] session 에저장하려는 model attribute 의이름 required Class[] session 에저장하려는 model attribute 의타입 26 Page l 26
2. MVC @Controller 관련어노테이션 (8/8) @CommandMap( 실행환경 3.2 부터 deprecated 됨 @RequestParam 으로대체 ) 실행환경 3.0 부터추가되었으며 Controller 에서 Map 형태로웹요청값을받았을때다른 Map 형태의 argument 와구분해주 기위한어노테이션이다. @CommandMap 은파라미터레벨 (type level) 에서선언할수있다. 사용방법은다음과같다. @RequestMapping("/test.do") public void test(@commandmap Map<String, String> commandmap, HttpServletRequest request){ // 생략 } CommandMap 을이용하기위해서는반드시 EgovRequestMappingHandlerAdapter 와함께 AnnotationCommandMapArgumentResolver 를등록해주어야한다. <bean class="egovframework.rte.ptl.mvc.bind.annotation.egovrequestmappinghandleradapter"> <property name="customargumentresolvers"> <list> <bean class="egovframework.rte.ptl.mvc.bind.annotationcommandmapargumentresolver" /> </list> </property> </bean> 27 Page l 27
2. MVC @Controller 메소드시그니쳐 (1/2) @Controller 메소드시그니쳐 기존의계층형 Controller(SimpleFormController, MultiAction..) 에비해유연한메소드파라미터, 리턴값을갖는다. 메소드파라미터 Servlet API - ServletRequest, HttpServletRequest, HttpServletResponse, HttpSession 같은요청, 응답, 세션관련 Servlet API. org.springframework.web.context.request.webrequest, org.springframework.web.context.request.nativewebrequest java.util.locale java.io.inputstream / java.io.reader java.io.outputstream / java.io.writer @RequestParam - HTTP Request의파라미터와메소드의 argument를바인딩하기위해사용하는어노테이션. java.util.map / org.springframework.ui.model / org.springframework.ui.modelmap - 뷰에전달할모델데이터. Command/form 객체 - HTTP Request로전달된 parameter를바인딩한커맨드객체, @ModelAttribute을사용하면 alias 를줄수있다. org.springframework.validation.errors / org.springframework.validation.bindingresult - 유효성검사후결과데이터를저장한객체. org.springframework.web.bind.support.sessionstatus - 세션폼처리시에해당세션을제거하기위해사용된다. 28 Page l 28
2. MVC @Controller 메소드시그니쳐 (2/2) 메소드리턴타입 ModelAndView - 커맨드객체, @ModelAttribute 적용된메소드의리턴데이터가담긴 Model 객체와 View 정보가담겨있다. Model( 또는 ModelMap) - 커맨드객체, @ModelAttribute 적용된메소드의리턴데이터가 Model 객체에담겨있다. View 이름은 RequestToViewNameTranslator가 URL을이용하여결정한다. Map - 커맨드객체, @ModelAttribute 적용된메소드의리턴데이터가 Map 객체에담겨있으며, View 이름은역시 RequestToViewNameTranslator가결정한다 String - 리턴하는 String 값이곧 View 이름이된다. 커맨드객체, @ModelAttribute 적용된메소드의리턴데이터가 Model( 또는 ModelMap) 에담겨있다. 리턴할 Model( 또는 ModelMap) 객체가해당메소드의 argument에선언되어있어야한다 void - 메소드가 ServletResponse / HttpServletResponse등을사용하여직접응답을처리하는경우이다. View 이름은 RequestToViewNameTranslator가결정한다. 29 Page l 29
2. MVC @MVC 예제 (1/3) @Controller 로폼처리구현하기 부서정보를수정하고저장하는폼페이지를 @Controller 로구현해보자. 메소드의이름은폼처리를담당하는 기존의 Form Controller 인 SimpleFormController 와의비교를위해기능별로동일하게지었다. 화면 & 시나리오 1. 파라미터부서번호의해당부서정보데이터를불러와입력폼을채운다. 2. 상위부서 (selectbox) 는부서정보데이터와는별도로, 상위부서에해당하는부서리스트데이터을구해서참조데이터로구성한다. 3. 사용자가데이터수정을끝내고저장버튼을누르면수정데이터로저장을담당하는서비스 (DB) 를호출한다. 4. 저장이성공하면부서리스트페이지로이동하고에러가있으면다시입력폼페이지로이동한다. 30 Page l 30
2. MVC @MVC 예제 (2/3) Controller 작성하기 package com.easycompany.controller.annotation;... @Controller public class UpdateDepartmentController { @Autowired private DepartmentService departmentservice; // 상위부서 (selectbox) 는부서정보데이터와는별도로, 상위부서에해당하는부서리스트데이터을구해서참조데이터로구성한다. @ModelAttribute("deptInfoOneDepthCategory") public Map<String, String> referencedata() { Map<String, String> param = new HashMap<String, String>(); param.put("depth", "1"); return departmentservice.getdepartmentidnamelist(param); } // 해당부서번호의부서정보데이터를불러와입력폼을채운다 @RequestMapping(value = "/updatedepartment.do", method = RequestMethod.GET) public String formbackingobject(@requestparam("deptid") String deptid, Model model) { Department department = departmentservice.getdepartmentinfobyid(deptid); model.addattribute("department", department); return "modifydepartment"; } } // 사용자가데이터수정을끝내고저장버튼을누르면수정데이터로저장을담당하는서비스 (DB) 를호출한다. // 저장이성공하면부서리스트페이지로이동하고에러가있으면다시입력폼페이지로이동한다. @RequestMapping(value = "/updatedepartment.do", method = RequestMethod.POST) public String onsubmit(@modelattribute("department") Department department) { try { departmentservice.updatedepartment(department); return "redirect:/departmentlist.do?depth=1"; } catch (Exception e) { return "modifydepartment"; } } 31 Page l 31
2. MVC @MVC 예제 (3/3) JSP 폼필드와모델데이터의편리한데이터바인딩을위해스프링폼태그를사용한다. commandname 에는 model attribute 를적어주면된다. department... <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>... <form:form commandname="department"> <table> <tr> <th> 부서번호 </th><td><c:out value="${department.deptid}"/></td> </tr> <tr> <th> 부서이름 </th><td><form:input path="deptname" size="20"/></td> </tr> <tr> <th> 상위부서 </th> <td> <form:select path="superdeptid"> <option value=""> 상위부서를선택하세요.</option> <form:options items="${deptinfoonedepthcategory}" /> </form:select> </td> </tr> <tr> <th> 설명 </th><td><form:textarea path="description" rows="10" cols="40"/></td> </tr> </table>... <input type="submit" value=" 저장 "/> <input type="button" value=" 리스트페이지 " onclick="location.href='/easycompany/departmentlist.do?depth=1'"/>... </form:form> 32 Page l 32
2. MVC - 참고자료 Spring Framework API http://docs.spring.io/spring/docs/3.2.x/javadoc-api/ 이전버전참조 http://static.springsource.org/spring/docs/2.5.x/api/index.html http://static.springsource.org/spring/docs/3.0.x/javadoc-api/ The Spring Framework - Reference Documentation http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/spring-web.html 이전버전참조 http://static.springsource.org/spring/docs/2.5.x/reference/spring-web.html http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/spring-web.html 33 Page l 33
3. Internationalization( 국제화 ) 개요 (1/8) 서비스개요 전자정부표준프레임워크에서는 Spring MVC 에서제공하는 LocaleResolver를이용한다. Spring MVC 는다국어를지원하기위하여아래와같은종류의 LocaleResolver 를제공하고있다. CookieLocaleResolver : 쿠키를이용한 locale정보사용 SessionLocaleResolver : 세션을이용한 locale정보사용 AcceptHeaderLocaleResolver : 클라이언트의브라우져에설정된 locale정보사용 * Bean 설정파일에정의하지않을경우 AcceptHeaderLocaleResolver 가 default 로적용된다. 35 Page l 35
3. Internationalization( 국제화 ) 설명 (2/8) CookieLocaleResolver CookieLocaleResolver 를설정하는경우사용자의쿠키에설정된 Locale 을읽어들인다. Bean 설정정보 (xx-servlet.xml) <bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver" > <property name="cookiename" value="clientlanguage"/> <property name="cookiemaxage" value="100000"/> <property name="cookiepath" value="web/cookie"/> </bean> Property 속성 36 Page l 36
3. Internationalization( 국제화 ) 설명 (3/8) SessionLocaleResolver requst 가가지고있는 Session 으로부터 locale 정보를가져온다. Bean 설정정보 (xx-servlet.xml) <bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" /> AcceptHeaderLocaleResolver 사용자의브라우저에서보내진 request 의헤더에 accept-language 부분에서 Locale 을읽어들인다. 사용자 브라우저의 Locale 을나타낸다. Bean 설정정보 (xx-servlet.xml) <bean id="localeresolver" class="org.springframework.web.servlet.i18n.acceptheaderlocaleresolver" /> 37 Page l 37
3. Internationalization( 국제화 ) 설명 (4/8) 샘플예제 (SessionLocaleResolver ) Web Configuration Filter 설정 Web 을통해들어오는요청을 Charset UTF-8 적용 1. CharacterEncodingFilter 을이용하여 encoding 할수이도록아래와같이세팅 (Web.xml) <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> 38 Page l 38
3. Internationalization( 국제화 ) 설명 (5/8) Spring Configuration (xx-servlet.xml) 아래와같이 localeresover 와 localechangeinterceptor 를등록하고 Annotation 기반에서동작할수있도록 RequestMappingHandlerMapping 에 interceptor 로등록을해준다. ( 표준프레임워크 3.0 에서사용가능 - 기존 DefaultAnnotationHandlerMapping 이 deprecated 됨 ) SessionLocaleResolver 를이용하여위와같이하였을경우 Locale 결정은 language Request Parameter 로넘기게된다. <bean id="localeresolver" class="org.springframework.web.servlet.i18n.sessionlocaleresolver" /> <!-- 쿠키를이용한 Locale 이용시 <bean id="localeresolver" class="org.springframework.web.servlet.i18n.cookielocaleresolver"/> --> <bean id="localechangeinterceptor" class="org.springframework.web.servlet.i18n.localechangeinterceptor"> <property name="paramname" value="language" /> </bean> <bean id="annotationmapper" class="org.springframework.web.servlet.mvc.method.annotation.requestmappinghandlermapping"> <property name="interceptors"> <list> <ref bean="localechangeinterceptor" /> </list> </property> </bean> 39 Page l 39
3. Internationalization( 국제화 ) 설명 (6/8) Message Source 설정 먼저다국어를지원해야하므로메시지를 MessageSource 로추출하여구현해야한다. 자세한 MessageSource 내용은 Resource 를참고하길바란다. messagesource는아래와같이설정하였다. <bean id="messagesource" class="org.springframework.context.support.resourcebundlemessagesource"> <property name="basenames"> <list> <value>classpath:/message/message</value> </list> </property> </bean> message properties 파일은아래와같다. locale에따라 ko, en 으로구분하였다. message_ko.properties 파일 : view.category= 카테고리 message_en.properties 파일 : view.category=category 40 Page l 40
3. Internationalization( 국제화 ) 설명 (7/8) JSP Spring Message Tag 이용 : <spring:message code="view.category" /> <%@ taglib prefix="spring" uri=http://www.springframework.org/tags %> <form:form commandname="message" >... <table border="1" cellspacing="0" class="boardlist" summary="list of Category"> <thead> <tr> <th scope="col">no.</th> <th scope="col"> <input name="checkall" type="checkbox" class="inputcheck" title="check All" onclick="javascript:fnccheckall();"/> </th> <th scope="col"><spring:message code="view.category" /> ID</th> <th scope="col"><spring:message code="view.category" /> 명 </th> <th scope="col"> 사용여부 </th> <th scope="col">description</th> <th scope="col"> 등록자 </th> </tr> </thead>... 41 Page l 41
3. Internationalization( 국제화 ) 설명 (8/8) 결과 화면상으로해당페이지를실행해보면아래와같다. 42 Page l 42
3. Internationalization( 국제화 ) 참고자료 The Spring Framework - Reference Documentation http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/ 이전버전참조 http://static.springsourceorg/spring/docs/2.5.x/reference/ http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/ 43 Page l 43
4. Ajax Support - 개요및설정 jquery Ajax jquery는브라우저호환성을제공하는자바스크립트라이브러리. jquery는자바스크립트프레임워크로서간결한문장의표현으로 front-end( 화면 ) 개발시생산성향상. 다양한오픈소스라이브러리들을통해 java script로 ajax, json parser, css selector, dom seletor, event 등... 다양한 ui 기능등을제공하고 front-end( 화면 ) 을동적으로제어가능 jquery 설정 - jquery java script 추가 jquery url을직접명시 <script src="https://code.jquery.com/jquery-1.11.0.min.js"></script> jquery script 를직접추가하여참조 <script type="text/javascript" src="jquery 파일경로 "></script> * jquery-버전.js를다운받아프로젝트하위경로에추가한후, 저장한경로를설정. * jquery는 MIT 라이센스를사용함. 45 Page l 45
4. Ajax Support - 기본기능 jquery.ajax(url[,settings]) 함수 jquery Ajax 기능을위해서는기본적으로 jquery.ajax(url[,settings]) 함수를이용 설정설명 default type type http 요청방식설정 (POST, GET, PUT.DELETE ) GET type string url request 를전달할 url 명 N/A url string data request 에담아전달할 data 명과 data 값 N/A String/Plain Object/Array contenttype datatype server 로데이터를전달할때 contenttype 서버로부터전달받을데이터타입 'application/x-www-for m-urlencoded; charset =UTF-8' xml, json, script, or ht ml contenttype String xml/html/script/json/jsonp/multiple, space-separated values statuscode HTTP 상태코드에따라분기처리되는함수 N/A 상태코드로분리되는함수 beforesend request 가서버로전달되기전에호출되는콜백함수 N/A error 요청을실패할경우호출되는함수 N/A success 요청에성공할경우호출되는함수 N/A crossdomain crossdomain request(jsonp 와같은 ) 를강제할때설정 (cross-domain request 설정필요 ) same-domain request 에서 false, cross-dom ain request 에서는 true Function( jqxhr jqxhr, PlainObj ect settings ) Function( jqxhr jqxhr, String te xtstatus, String errorthrown ) Function( PlainObject data, String textstatus, jqxhr jqxhr ) Boolean 46 Page l 46
4. Ajax Support - 기본예제 기본예제 하나의파라미터를 Ajax request 로전달하는예제. $.ajax({ type : "POST", url : "<c:url value='/example01.do'/>", contenttype: "application/x-www-form-urlennocoded; charset=utf-8", datatype:'json', data : { sampleinput : "sampledata" }, success : function(data, status, jqxhr) { // 통신이정상적일때해당함수실행 }, error : function(request, status, error){ // 통신이비정상적일때해당함수실행 }, complete : function(jqxhr, status) { // 통신의성공과실패시해당함수실행 } }); Http 요청동기Ajax Post Method 방식으로 example01.do로호출 contenttype을 application/x-www-form-urlennocoded 방식으로 charset을 UTF-8 으로설정. sampleinput이란데이터명으로 sampledata String을전달 통신의요청이성공할경우 success 함수호출 통신이비정상적일때 error 함수호출 통신의성공과실패시 complete 함수호출 47 Page l 47
4. Ajax Support - ajax 함수의 jqxhr 기능 ajax함수의 jqxhr(xmlhttprquest) jquery 1.5부터 jquery의모든 ajax함수는 XMLHttpRequest객체의상위집합을리턴받을수있다. 이객체를 jquery에서는 jqxhr( 응답값, 통신 status, readystatus) 이라부르며, jqxhr의함수로콜백함수를정의한다. jqxhr(xmlhttprquest) 의 callback 함수 사용자정의에의해순차적으로실행 Ajax에서 request를리턴받아호출가능 함수명 jqxhr.done(function( data, textstatus, jqxhr ) {}); jqxhr.fail(function( jqxhr, textstatus, errorthrown ) {}); jqxhr.always(function( data jqxhr, textstatus, jqxhr' errorthrown ) { }); 설명 성공시호출되는콜백함수실패시호출되는콜백함수항상호출되는콜백함수 Ajax 내부 callback 과 jqxhr(xmlhttprquest) callback 의실행순서 성공 : success( 내부 ) > complete ( 내부 ) > done(jqxhr) > always(jqxhr) 실패 : error ( 내부 ) > complete ( 내부 ) > fail(jqxhr) > always(jqxhr) 48 Page l 48
4. Ajax Support - callback 함수예제 jqxhr(xmlhttprquest) callback 함수예제 1 여러개의데이터를전달하며호출후 콜백함수로서버에서값을받는예제. $.ajax({ url : "<c:url value='/example02.do'/>", data : { name : "gil-dong", location : "seoul" }, }).done(function( data ) { if ( console && console.log ) { console.log( "Sample of data:", data.slice( 0, 100 ) ); } }); example02.do 을호출하며 name, location 을요청데이터로전달 성공시에 done 콜백함수를호출 jqxhr(xmlhttprquest) callback 함수예제 2 example03.do 를호출하며 성공시 done 콜백함수, 실패시 fail 콜백함수호출. var jqxhr = $.ajax( "<c:url value='/example03.do'/>", ).done(function() { alert( "success" ); }).fail(function() { alert( "error" ); }).always(function() { alert( "complete" ); }); jqxhr.always(function() { alert( "second complete" ); }); 성공, 실패여부에상관없이 always 콜백함수는 항상호출 done, fail, always 콜백함수는 ajax 함수를통해 리턴되어 request 로호출가능 49 Page l 49
4. Ajax Support - 응용. Auto complete Auto complete jquery에서는 input창에서예상되는텍스트값을보여주는자동완성기능을쉽게구현할수있도록 autocomplete() 을제공 autocomplete의설정구분설정설명 Type Options source 하단에뜨는자동완성리스트 ( 필수값 ) Array, String, function Options minlength 자동완성이동작하는최소문자열수 Integer Options disabled disable 여부 Boolean Events change(event, ui) 값변경시발생하는이벤트함수 autocompletechange Events focus( event, ui ) 값이포커스될때발생하는이벤트함수 autocompletefocus Events select( event, ui ) 값이선택될때발생하는이벤트함수 autocompleteselect * jquery UI script 를직접추가하여참조하는경우는 jquery-ui.js 와 jquery-ui.css 를다운받아 프로젝트하위경로에추가한후, 저장한경로를지정 50 Page l 50
4. Ajax Support - 응용. Auto complete 예제 autocomplete 기본예제 autocomplete 예제결과 <html lang="en"> <head> <meta charset="utf-8"> <title>jquery UI Autocomplete - Default functionality</title> <link rel="stylesheet" href="//code.jquery.com/ui/1.11.0/themes/smoothness/jquery-ui.css"> <script src="//code.jquery.com/jquery-1.10.2.js"></script> <script src="//code.jquery.com/ui/1.11.0/jquery-ui.js"></script> <link rel="stylesheet" href="/resources/demos/style.css"> <script> $(function() { var availabletags = [ "ActionScript", "AppleScript", "Asp", "BASIC", "C", "C++", "Clojure", "COBOL", "ColdFusion", "Erlang", "Fortran", "Groovy", "Haskell", "Java", "JavaScript", "Lisp", "Perl", "PHP", "Python", "Ruby", "Scala", "Scheme" ]; $( "#tags" ).autocomplete({ source: availabletags }); }); </script> </head> <body> <div class="ui-widget"> <label for="tags">tags: </label> <input id="tags"> </div> </body> </html> * minlength 는 default 값이 1 - input 에 1 개이상의문자를입력했을때 source 의 String 배열들이자동문자리스트로표시됨. 51 Page l 51
5. Validation - 개요 Validation 서비스 화면처리레이어의 Validation 서비스는입력값유효성검증기능을제공한다. 유효성검증후, 잘못된유효성이있을경우오류메시지를표시한다. 유효성검사규칙 (validation rules) 을템플릿형태로제공하여쉽게적용이가능하다. 입력값유효성검증 (validation) 을위한기능은 Valang, Jakarta Commons, Spring 등에서제공한다. 기반오픈소스로 Jakarta Commons Validator를선택. MVC 프레임워크인 Spring MVC와 Jakarta Commons Validator의연계와활용방안을제공한다. 53 Page l 53
5. Validation - Jakarta Commons Validator Jakarta Commons Validator Jakarta Commons Validator는필수값, 각종 primitive type (int,long,float ), 최대-최소길이, 이메일, 신용카드번호등의값체크등을할수있도록 Template이제공된다. Template은 Java 뿐아니라 Javascript로도제공되어 client-side, server-side의검증을함께할수있으며, Configuration과에러메시지를 client-side, server-side 별로따로하지않고한곳에같이쓰는관리상의장점이있다. 54 Page l 54
5. Validation - Spring+Commons Validator Spring Framework + Jakarta Commons Validator Struts에서는 Commons Validator를사용하기위한 org.apache.struts.validator.validatorplugin 같은플러그인클래스를제공하는데, Spring에서는 Spring Modules(https://springmodules.dev.java.net/) 프로젝트에서연계모듈을제공한다. 필요라이브러리 commons-validator : Ver 1.4.0 아래 4개의파일에대한 dependency가있다. 1. commons-beanutils : Ver 1.8.3 2. commons-digester : Ver 1.8 3. commons-logging : Ver 1.1.1 4. junit : Ver 3.8.2 spring modules : Ver 0.9 다운받고압축을풀어보면여러파일들이있으나여기서필요한건 spring-modulesvalidation.jar 뿐이다. 예제를보려면 \samples\sources\spring-modules-validation-commons-samples-src.zip도필요하다. 위에서언급한라이브러리들을설치한다. 55 Page l 55
5. Validation - DefaultValidatorFactory, DefaultBeanValidator DefaultValidatorFactory, DefaultBeanValidator 설정 DefaultValidatorFactory 프로퍼티 'validationconfiglocationsapache' 에정의된 Validation rule을기반으로 Commons Validator들의인스턴스를얻는다. DefaultBeanValidator DefaultBeanValidator는 org.springframework.validation.validator를 implements하고있지만, DefaultValidatorFactory가가져온 Commons Validator의인스턴스를이용해 validation을수행한다. Controller의 validation을수행할때이 DefaultBeanValidator를참조하면된다. 빈정의파일에아래와같이 DefaultValidatorFactory, DefaultBeanValidator 를선언한다. <!-- Integrated Apache Commons Validator by Spring Modules --> <bean id="beanvalidator" class="org.springmodules.validation.commons.defaultbeanvalidator"> <property name="validatorfactory" ref="validatorfactory"/> </bean> <bean id="validatorfactory" class="org.springmodules.validation.commons.defaultvalidatorfactory"> <property name="validationconfiglocations"> <list> <value>/web-inf/config/validator-rules.xml</value> <value>/web-inf/config/validator.xml</value> </list> </property> </bean> 56 Page l 56
5. Validation - validator-rules.xml validator-rules.xml 설정 validator-rules.xml 은 application 에서사용하는모든 validation rule 에대해정의하는파일이다. <validator> 태그를구성하는주요요소는아래와같다. name : validation rule(required,mask,integer,email ) classname : validation check 를수행하는클래스명 (org.springmodules.validation.commons.fieldchecks) method : validation check 를수행하는클래스의메소드명 (validaterequired,validatemask ) methodparams : validation check 를수행하는클래스의메소드의파라미터 msg : 에러메시지 key. (message 프로퍼티에서설정한다.) javascript : client-side validation 을위한자바스크립트코드 <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd"> <form-validation> <global> <validator name="required" classname="org.springmodules.validation.commons.fieldchecks" method="validaterequired" methodparams="java.lang.object, org.apache.commons.validator.validatoraction, org.apache.commons.validator.field, org.springframework.validation.errors" msg="errors.required > <javascript><![cdata[... ]]> </javascript> </validator> </form-validation> 57 Page l 57
5. Validation - Validation Rule Validation Rule name(validation rule) FieldCheck 클래스 FieldCheck 메소드기능 required org.springmodules.validation.commons.fieldchecks validaterequired 필수값체크 minlength org.springmodules.validation.commons.fieldchecks validateminlength 최소길이체크 maxlength org.springmodules.validation.commons.fieldchecks validatemaxlength 최대길이체크 mask org.springmodules.validation.commons.fieldchecks validatemask 정규식체크 byte org.springmodules.validation.commons.fieldchecks validatebyte Byte형체크 short org.springmodules.validation.commons.fieldchecks validateshort Short형체크 integer org.springmodules.validation.commons.fieldchecks validateinteger Integer 형체크 long org.springmodules.validation.commons.fieldchecks validatelong Long 형체크 Spring Modules float org.springmodules.validation.commons.fieldchecks validatefloat Float형체크 double org.springmodules.validation.commons.fieldchecks validatedouble Double형체크 date org.springmodules.validation.commons.fieldchecks validatedate Date형체크 range org.springmodules.validation.commons.fieldchecks validateintrange 범위체크 intrange org.springmodules.validation.commons.fieldchecks validateintrange int형범위체크 floatrange org.springmodules.validation.commons.fieldchecks validatefloatrange Float형범위체크 creditcard org.springmodules.validation.commons.fieldchecks validatecreditcard 신용카드번호체크 email org.springmodules.validation.commons.fieldchecks validateemail 이메일체크 ihidnum egovframework.rte.ptl.mvc.validation.rtefieldchecks validateihidnum 주민등록번호체크 korean egovframework.rte.ptl.mvc.validation.rtefieldchecks validatekorean 한글체크 htmltag egovframework.rte.ptl.mvc.validation.rtefieldchecks validatehtmltag <,> 태그정보체크 egovframework 58 Page l 58
5. Validation - validator.xml(1/2) validator.xml 설정 validator.xml 은 validation rule 과 validation 할 Form 을매핑한다. form name 과 field property 의 name-rule 은 Server-side 와 Client-side 인경우에따라다르다. Server-side validation 의경우 form name 과 field property 는 validation 할폼클래스의이름, 필드가각각매핑된다.(camel case) 폼클래스가 Employee 면 employee, DepartmentForm 이면 departmentform 을 form name 으로지정한다. Client-side 의경우 form name 은 JSP 에서설정한 <validator:javascript formname= employee /> 태그의 formname 과매핑되고, field property 는각각의폼필드의이름과일치하면된다. 따라서, Server-side, Client-side 둘다수행하려면, JSP 의 <validator:javascript formname= employee /> 태그의 formname 은폼클래스의이름이되어야하고, JSP 의폼 필드들은폼클래스의필드와일치해야한다. 59 Page l 59
5. Validation - validator.xml(2/2) depends는해당필드에적용할 (validator-rules.xml에정의된 rule name) validator를의미한다. <arg key > 는메시지출력시파라미터를지정하는값이다. 아래와같이작성했다면, Employee 클래스의 name 필드에대해서필수값체크를, age 필드에대해서 integer 체크를, email 필드에대해선필수값과 email 유효값체크를하겠다는의미이다. <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN" http://jakarta.apache.org/commons/dtds/validator_1_1.dtd> <form-validation> <formset> <form name="employee"> <field property="name" depends="required,korean"> <arg0 key="employee.name" /> </field> <field property="age" depends="integer"> <arg0 key="employee.age" /> </field> <field property="email" depends="email,htmltag"> <arg0 key="employee.email" /> </field> <field property="ihidnum" depends="ihidnum"/> </form> </formset> </form-validation> 60 Page l 60
5. Validation - Server-Side Validation(1/4) Server-Side Validation Controller Server-Side Validation 을위해 Controller 에 validation 로직을추가. package com.easycompany.controller.annotation;... import org.springmodules.validation.commons.defaultbeanvalidator;... @Controller public class UpdateEmployeeController { @Autowired private DefaultBeanValidator beanvalidator;... @RequestMapping(value = "/updateemployee.do", method = RequestMethod.POST) public String updateemployee(@modelattribute("employee") Employee employee, BindingResult bindingresult, Model model) { beanvalidator.validate(employee, bindingresult); //validation 수행 if (bindingresult.haserrors()) { // 만일 validation 에러가있으면...... return "modifyemployee"; } } } employeemanageservice.updateemployee(employee); return "changenotify"; 61 Page l 61
5. Validation - Server-Side Validation(2/4) JSP form submit을하면이름, 나이, 이메일등의입력값이 Employee 클래스에바인딩이되어서 Controller에전달이되고, Controller에 validation 수행로직이있으면 validator.xml 내용에따라 validation이이루어진다. 만일에러가발생하면 <form:error /> 에해당에러메시지를출력한다. <form:form commandname="employee"> <table> <tr> <th> 이름 </th><td><form:input path="name" size="20"/><form:errors path="name" /></td> </tr> <tr> <th> 비밀번호 </th><td><form:input path="password" size="10"/></td> </tr> <tr> <th> 나이 </th><td><form:input path="age" size="10"/><form:errors path="age" /></td> </tr> <tr> <th> 이메일 </th><td><form:input path="email" size="50"/><form:errors path="email" /></td> </tr> </table> <table width="80%" border="1"> <tr> <td><input type="submit"/> <input type="button" value="list" onclick="location.href='/easycompany/employeelist.do'"/> </td> </tr> </table> </form:form> 62 Page l 62
5. Validation - Server-Side Validation(3/4) 에러메시지등록 메시지파일 (message.properties) 에에러메시지를등록한다. validation 에러가발생하면 validator-rules.xml에서정의했던 msg값으로에러메시지의 key값을찾아해당하는메시지를출력해준다. 예를들어, email validation에서에러가발생하면 msg값이 errors.email 이므로, 유효하지않은이메일주소입니다. 라는에러메시지를 JSP에있는 <form:errors path= email /> 부분에출력하게된다. employee.name= 이름 employee.email= 이메일 employee.age= 나이 employee.password= 비밀번호 # -- validator errors -- errors.required={0} 은필수입력값입니다. errors.minlength={0} 은 {1} 자이상입력해야합니다. errors.maxlength={0} 은 {1} 자이상입력할수없습니다. errors.invalid={0} 은유효하지않은값입니다. errors.byte={0} 은 byte 타입이어야합니다. errors.short={0} 은 short 타입이어야합니다. errors.integer={0} 은 integer 타입이어야합니다.... errors.email= 유효하지않은이메일주소입니다. 63 Page l 63
5. Validation - Server-Side Validation(4/4) TEST 이름필드에값을비우고 submit 하면, name 에필수값 (required) validation rule 이설정되어있으므로 아래와같이이름필드옆에에러메시지가출력된다. 64 Page l 64
5. Validation - Client-Side Validation(1/3) Client-Side Validation validator.jsp 추가 <%@ page language="java" contenttype="javascript/x-javascript" %> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> <validator:javascript dynamicjavascript="false" staticjavascript="true"/> /validator.do 로호출하도록 Controller 에서메소드를추가하고 requestmapping 한다. validator.jsp 를 http://localhost:8080/easycompany/validator.do 브라우져에서호출해보면, validator-rules.xml 에서정의한 javascript 함수들이다운로드되거나화면에 print 되는걸확인할수있다. validator.jsp 는 client-validation 을위해 validator-rules.xml 에서정의한 javascript 함수들을로딩한다. 따라서 client-validation 을할페이지에서는이 validator.jsp 를 <script type= text/javascript src= <c:url value= /validator.do /> ></script> 같이호출한다. JSP 설정 (taglib,javascript) 추가 client-validation 을위해서는해당 JSP 에아래와같은작업이추가되어야한다. commons-validator taglib 를선언한다. <%@ taglib prefix= validator uri= http://www.springmodules.org/tags/commons-validator %> 필요한자바스크립트함수를 generate 하기위한코드를추가한다. validation-rules.xml 에서선언한함수를불러오기위 해, 위에서작성한 validator.jsp 를아래와같이호출한다. <script type= text/javascript src= <c:url value= /validator.do /> ></script> 65 Page l 65
5. Validation - Client-Side Validation(2/3) 위의자바스크립트함수를이용해필요한 validation 과메시지처리를위한자바스크립트를 generate 하기위한코드를 추가한다. formname 에는 validator.xml 에서정의한 form 의이름을써준다. <validator:javascript formname= employee staticjavascript= false xhtml= true cdata= false /> form submit 시에 validatevo 클래스명 () 함수를호출한다. onsubmit= return validateemployee(this) > 따라서앞의 server-side validation 에서작성한 modifyemployee.jsp 은아래와같이변경된다. <!-- commons-validator tag lib 선언 --> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> <!--for including generated Javascript Code(in validation-rules.xml)--> <script type="text/javascript" src="<c:url value="/validator.do"/>"></script> <!--for including generated JavascriptCode(validateEmployee(),formName:validator.xml 에서정의한 form 의이름 )--> <validator:javascript formname="employee" staticjavascript="false" xhtml="true" cdata="false"/> <script type="text/javascript"> function save(form){ if(!validateemployee(form)){ return; }else{ form.submit(); } } </script> <form:form commandname="employee"> <!--<input type="submit"/>--> <input type="button" value="save" onclick="save(this.form)"/> <!-- client-validation 을위해바로 submit 하지않고먼저 validateemployee 함수를호출 --> <input type="button" value="list" onclick="location.href='/easycompany/employeelist.do'"/> </td></tr> </table> </form:form> 66 Page l 66
5. Validation - Client-Side Validation(3/3) TEST 이름필드의값을지우고저장버튼을누르면아래와같은 alert 메시지가보인다. 67 Page l 67
5. Validation - 참고자료 Spring Modules Reference Documentation v 0.9 68 Page l 68