반응형

1. STS 다운로드
STS란?

SpringSource Tool Suite™ provides the best Eclipse-based development environment for building Spring-powered enterprise applications. STS supplies all the tools you need for developing with the latest enterprise Java, Spring, Groovy and Grails based technologies.

흠.. 쉽게말해 eclipse기반에 spring 코드작성에 커스터마이징된 IDE라고 생각하면 됨.

2. STS를 이용한 Project 생성
-ctrl+n -> Spring Template Project -> Spring MVC Project


Project name 작성 and top-level package명 작성 ( package명을 3단으로 작성해야 넘어간다.
ex> com.spring.app ) finish! 버튼 클릭



기본구조, tomcat에 붙여서 테스트하기 위해서 2개의 파일을 살짝 수정해야한다.


HomeController.java
노란색 부분을 "/test" 로 변경 (/일경우 동작하지를 않는데 이유아시는분??)



home.jsp
양키 기준이라 한글은 UTF-8로 인코딩해줘야 안깨진다. 노란색부분 추가


브라우져에서 URL을 입력하여 테스트


STS에 깔려있다는 가정하에 10분도 안되서 완료했으리라 생각됨!
이렇게 해서 Spring MVC 기본셋팅 끝

어때요? 참쉽죠?.. =ㅂ=안쉽다고요?..



출처 : http://beans9.tistory.com/99
Posted by 1010
반응형

환경정보

- eclipse indigo
- java1.6
- spring3.0
- tomcat7


1. project 생성


- group id는 도메인으로 입력(본인취향대로)
- artifact id는 프로젝트명


2. 프로젝트 생성후 프로젝트 properties > project facets 변경


- convert to faceted from 클릭

- Dynamic Web Module 체크
- 하단에 노란 박스 Further configuration available 클릭



- content directory 를 webapps로 변경
- Gernerate web.xml deployment descriptor 체크

- 모두 OK후에 webapps 폴더를 src/main/으로 이동

아래처럼 변경



3. 프로젝트 생성후 프로젝트 properties > Deployment Assembly 변경

- add 클릭하여 java build path Entries "Next" 후 maven 고르고 Finish


- 기존에 Deploy Path "/"를 Romove하고 새로 추가

- Folder 선택 후 src/main/webapps 로 선택하여 추가




- 모두 추가되어 완료된 모습.


4. 여기서부터 소스 추가 및 수정

src/main/webapps/WEB-INF/spring 폴더 추가
src/main/webapps/WEB-INF/spring/root-context.xml 파일생성

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- Root Context: defines shared resources visible to all other web components -->

</beans>


src/main/webapps/WEB-INF/spring/appServlet 폴더추가
src/main/webapps/WEB-INF/spring/appServlet/servlet-context.xml 파일생성

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/mvc"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:beans="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

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">


<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->

<annotation-driven />


<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->

<resources mapping="/resources/**" location="/resources/" />


<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<beans:property name="prefix" value="/WEB-INF/views/" />

<beans:property name="suffix" value=".jsp" />

</beans:bean>

<context:component-scan base-package="www.beans9.com" />

</beans:beans>

* 빨간글씨 부분은 본인 프로젝트 도메인 및 폴더명과 동일해야함.

src/main/webapps/WEB-INF/web.xml 파일 변경

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/root-context.xml</param-value>

</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<!-- Processes application requests -->

<servlet>

<servlet-name>appServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>appServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

</web-app>

* 경로가 써져있는부분이 실제 경로와 동일해야함

src/main/java/www/beans9/com/HomeController.java 파일생성

HomeController.java

package www.beans9.com;


import java.text.DateFormat;

import java.util.Date;

import java.util.Locale;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;


@Controller

public class HomeController {

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Locale locale, Model model) {

logger.info("Welcome home! the client locale is "+ locale.toString());

Date date = new Date();

DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

String formattedDate = dateFormat.format(date);

model.addAttribute("serverTime", formattedDate );

return "home";

}

}


src/main/webapps/WEB-INF/views 폴더 생성
src/main/webapps/WEB-INF/views/home.jsp 파일 생성

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

${serverTime }

</body>

</html>


자 이제 was를 기동시켜 Spring MVC가 제대로 동작하는지 확인



이상없이 출력된다면 ^^ 기본 환경 구축 완료.

해당 프로젝트 실제 파일경로들 /

혹 해당파일이 필요하신분들을 위해 프로젝트 Achiev파일을 올려놓으니^^ 사용하셔도 됩니다.


작성자 : beans9 (http://beans9.tistory.com)
다른곳에 기재하실경우 작성자표시를 꼭 해주시기 바랍니다.
Posted by 1010
반응형

 http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Spring_MVC_Architecturing

http://forum.springsource.org/showthread.php?t=21639

 

Mapping 설정

HandlerMapping

.setOrder

SimpleUrlHandlerMapping

<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="...do">contentConroller</prop>
   </props>
  </property>
</bean>


BeanNameUrlHandlerMapping

.setMappings

PropertiesFactoryBean을 이용하면 별도의 파일에서 설정 가능

@RequestMapping

import  org.springframework.web.bind.annotation.RequestMapping


View

ViewResolver

InternalResourceViewResolver

.setViewClass, .setCache, .setPrefix, .setSuffix


Conroller

MultiActionController

.setMethodNameResolver

AbstractCommandController

.setCommandClass

SimpleFormConroller

.setCommandName, .setCommandClass, .formBackingObject, .onSubmit , .showForm,. initBinder, .referenceData

@Controller

import org.springframework.stereotype.Controller


MethodNameResolver

PropertiesMethodNameResolver

.setMappings

ParameterMethodNameResolver

.setParamName, .setDefaultMethodName


Common configuration

ServletRequestUtils

WebUtils 사용하기

Developing a Spring Framework MVC application step-by-step

Spring MVC에서 클라이언트 요청의 처리 과정

Spring MVC에서 사용하는 ApplicationContext와 WebApplicationContext

Critical security issues found in the Spring Framework

 

Model

@ModelAttriutes


Binder

@InitBinder

WebDataBinder

ServletRequestDataBinder

MultipartResolver

ComonsMultipartResolver

.setMaxUploadSize, .setUploadTempDir

파일첨부 처리 방법

  1. Request를 MultipartHttpServletRequest로 casting
  2. PropertyEditorSupport를 상삭, setValue에서 value instaceof MultipartFile 이면 FileUploadUtil.uploadFormFile사용.


커스텀 태그

spring:bind

스프링 MVC form 태그 써 보셨어요?

PropertyEditor 활용 예제

 

HandlerInterceptor



2.5

 http://www.infoq.com/articles/spring-2.5-ii-spring-mvc

스프링 2.5 애노테이션 기반 MVC 예제

http://springtutorial.googlecode.com/svn/trunk/moimApp/src/spring/tutorial/web/MoimController.java

Spring 2.5 Annotation기반 Controller 끄적거림

Annotated Spring MVC Controller !!

Annotation-based controller configuration

Spring Framework 2.5의 Annotation based Controller의 메서드 파라미터에서 주의점

http://dev.anyframejava.org/anyframe/doc/web/3.2.0/webfw/springmvc/basic/annotation_controller.html

 

 

3.0

REST in Spring 3: @MVC

스프링 REST 지원 사용하여 애플리케이션에 Atom 뷰 추가하기

REST in Spring 3: RestTemplate

초간단 CURD, 검색, 페이징, 정렬 구현 완료

Spring3.0 M2 RESTful Client 구현 예제

스프링 3.0의 MVC 간편화

Spring 3.0.1 mvc:annotation-driven 이 몰래 하는 짓

http://toby.epril.com/?p=982 :

Spring 3.0 @MVC 메소드에서 자동으로 리턴 모델에 추가되는 것들

DispatcherServlet의 디폴트 대체(fallback) 전략

InsideSpring (3) 스프링 밖에서 WebApplicationContext에 접근하기

CRUD

http://blog.springsource.com/2010/07/22/spring-mvc-3-showcase/

Spring, Junit 에서 session, request scope bean 을 사용하기

 

Spring Faces

Simplifying JSF Development with Spring Faces

 

보안

Spring framework 보안 취약성 보고와 해결 방안.

 

Json

스프링 JSON view와 jQuery 이용하여 자동완성 기능 만들기 1

스프링 JSON view와 jQuery 이용하여 자동완성 기능 만들기 2

스프링 JSON view와 jQuery 이용하여 자동완성 기능 만들기 3

스프링 JSON view와 jQuery 이용하여 자동완성 기능 만들기 4

 [테스트] 스프링의 MappingJacksonJsonView 초간단 학습 테스트

[봄싹 버그]] JSON 뷰와 하이버가 가져온 Proxy 객체

 

View

Spring MVC에서 jexcel 모듈을 활용한 엑셀 파일 다운로드 기능 구현하기

 

Validation

 http://blog.inflinx.com/2010/03/10/jsr-303-bean-validation-using-spring-3/

 http://blog.openframework.or.kr/141

 

Test

어노테이션 기반 스프링 컨트롤러 단위테스트

Spring, Junit 에서 session, request scope bean 을 사용하기

[스프링 테스트] 웹 테스트용 WebApplicationContext에 request, session 스코프 빈 등록하기

 

Formatter

http://chanwook.tistory.com/867

 

Converter

http://chanwook.tistory.com/866

Spring 3 MVC HttpMessageConverter 기능으로 RESTful 웹 서비스 빌드

Posted by 1010
반응형

Spring MVC Annotation

From JCFWiKi

Jump to: navigation , search 

그림:check.gif 

  • 산출물: Spring MVC Annotation
  • 작성자: 나윤주
  • 최초작성일 : 2008/06/24
  • 최종작성일 : 2008/06/24

Copyright © 2008 Daewoo Information Systems Co., Ltd.

그림:information.gif 

  • 이 문서는 Java 5+환경을 사용하는 Spring Web MVC Framework에서 적용할 수 있는 Annotation에 관한 것이다.


[편집 ] Spring MVC Annotation

  • Spring Web MVC Framework는 Java 5+ 부터 annotation을 제공한다. annotation의 사용으로 설정파일을 간결화하고, View 페이지와 객체 또는 메소드의 맵핑을 명확하게 할 수 있다.

[편집 ] @Controller

  • Controller annotation으로 Controller interface 및 class의 기능을 간단하게 사용할 수 있다.
    • Annotation을 사용하지 않고, Controller를 직접 상속받아 쓰는 경우 필요한 xml 설정을 생략할 수 있다.
    • SimpleFormController, MultiActionController 등 Controller의 종류를 명시하지 않고 @Controller 설정만으로 사용할 수 있다.
  • xxx-servlet.xml 파일에서 component-scan 으로 web controller가 있는 패키지를 명시해 줌으로써, 별도의 bean 설정을 하지 않아도 @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.
    • Controller로 사용하고자 하는 클래스에 @Controller 지정해주면 component-scan으로 자동 등록된다.
<!-- blog-servlet.xml -->
<context:component-scan base-package="blog.web" />
/* BlogController.java */
package blog.web;
 
/* 기타 package import .. */
import org.springframework.stereotype.Controller;
 
@Controller
public class BlogController {
}

[편집 ] @RequestMapping

  • RequestMapping annotation은 url을 클래스 또는 메소드와 맵핑시켜주는 역할을 한다.
    • Annotation을 쓰지 않을때 지정했던 Controller 등록을 위한 url bean 설정을 생략할 수 있다.
  • class에 하나의 url 맵핑을 할 경우, 클래스 위에 @RequestMapping("/url")을 지정하며, GET 또는 POST 방식 등의 옵션을 줄 수 있다.
    • 해당되는 메소드가 실행된 후, return 페이지가 따로 정의되어 있지 않으면 @RequestMapping("/url")에서 설정된 url로 다시 돌아간다.
/* 중간생략 */
 
@Controller
@RequestMapping("/helloWorld")
public class helloController {
	/* 중간생략 */
	
	@RequestMapping(method=RequestMethod.GET)
	public returntype getController() {
		/* .... */
	}
 
	@RequestMapping(method=RequestMethod.POST)
	public returntype postController() {
		/* .... */
	}
 
	/* 중간생략 */
}
  • 메소드별로 url 맵핑을 할 경우는 메소드 위에 @RequestMapping("/url")로 지정한다.
  • return 페이지가 지정되지 않은 경우 원래의 맵핑되었던 url로 돌아간다.
    • return type을 String으로 하여 redirect:url또는 forward:url을 사용하여 다른 페이지로 넘길 수 있다.
/* BlogController.java */
package blog.web;
 
/* 중간생략 */
 
@Controller
public class BlogController {
	/* 중간생략 */
	
	@RequestMapping("/createBlog")
	public ModelMap createBlogHandler() {
		blog = new Blog();
		return new ModelMap(blog);
	}
 
	/* 중간생략 */
}

[편집 ] @RequestParam

  • RequestParam annotation은 key=value 형태로 화면에서 넘어오는 파라미터를 맵핑된 메소드의 파라미터로 지정해준다.
  • 주로 get 방식으로 들어오는 request에서 사용한다.
    • 아래 예제코드에서 xxx/editBlog.do?blogId=3 과 같이 접근할 때, editBlogHandler 메소드의 파라미터인 blogId에는 3이 셋팅된다.
    • 필수 요건이 아닐 경우, @RequestParam(value="id", required="false")와 같이 옵션을 주고 사용할 수 있다.
/* BlogController.java */
package blog.web;
 
/* 중간생략 */
 
@Controller
public class BlogController {
	/* 중간생략 */
	
	@RequestMapping("/editBlog")
	public ModelMap editBlogHandler(@RequestParam("blogId") int blogId) {
		blog = blogService.findBlog(blogId); 
		return new ModelMap(blog);
	}
 
	/* 중간생략 */
}

[편집 ] @ModelAttribute

  • ModelAttribute annotation은 화면의 form 속성으로 넘어온 model을 맵핑된 메소드의 파라미터로 지정해주는 역할을 한다.
  • 주로 POST 타입으로 넘어오는 form 속성의 model 값을 받아올 때 사용된다.
/* BlogController.java */
package blog.web;
 
/* 중간생략 */
 
@Controller
public class BlogController {
	/* 중간생략 */
	
	@RequestMapping("/updateBlog")
	public String updateBlogHandler(@ModelAttribute("blog") Blog blog) {
		blogService.updateBlog(blog);
		return "redirect:findBlogs.do";
	}
 
	/* 중간생략 */
}

[편집 ] @SessionAttributes

  • SessionAttributes annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용할 수 있다.
/* BlogController.java */
package blog.web;
 
/* 중간생략 */
 
@Controller
@SessionAttributes("blog")
public class BlogController {
	/* 중간생략 */
 
	@RequestMapping("/createBlog")
	public ModelMap createBlogHandler() {
		blog = new Blog();
		blog.setRegDate(new Date());
		return new ModelMap(blog);
	}
 
	/* 중간생략 */
}

[편집 ] @InitBinder

@InitBinder annotation은 WebDataBinder를 초기화하는 메소드를 지정할 수 있는 설정을 제공한다. 일반적으로 WebDataBinder는 annotated handler 메소드의 command와 form 객체 인자를 조작하는데 사용된다. Initbinder 메소드는 command/form 객체와 validation result 객체와 대응하는 것을 제외하고 RequestMapping을 지원하는 모든 인자를 지원한다. Initbinder 메소드가 필수적으로 반환값을 가질 필요는 없으며, 일반적으로 이런 경우에 void를 선언한다. 특별한 인자는 WebDataBinder와 WebRequest 또는 Locale의 조합으로 이루어지며, 이러한 조건이 만족되면 context-specific editors를 등록하는 것이 허용된다.

  • WebDataBinder : WebDataBinder는 web request parameter를 JavaBean 객체에 바인딩하는 특정한 DataBinder이다. WebDataBinder는 웹 환경이 필요하지만, Servlet API에 의존적이지 않다. Servlet API에 의존적인 ServletRequestDataBinder와 같이 특정한 DataBinder를 위한 더 많은 base classs를 제공한다.
  • RequestMapping : RequestMapping annotation은 web request를 특정한 handler class와/나 handler method에 매핑하는 역할을 수행한다. 대응하는 HandlerMapping (for type level annotations)과/이나 HandlerAdapter (for method level annotations)가 dispatcher에 존재한다면, @RequestMapping이 처리될 것이다.
  • WebRequest : WebRequest는 웹 요청에 대한 Generic interface이다. 주로 일반 request metadata에 generic web request interceptors의 접근을 허용하여 metadata에 대한 처리를 하기 위한 것이지 request 자체를 처리하기 위한 것은 아니다.
  • @InitBinder 예제

다음의 InitBinder는 Request에 포함된 JSON 데이터를 binding하여 처리하는 역할을 수행한다.

......
@InitBinder
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
 
		if (logger.isDebugEnabled()) {
			logger.debug("entering 'initBinder' method...");
		}
 
		JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request);
		registry.registerConfiguratorTemplate(new JsonlibJsonWriterConfiguratorTemplate() {
			@Override
			public JsonConfig getJsonConfig() {
				JsonConfig config = new JsonConfig();
 
				// Exclude all date properties
				config.setJsonPropertyFilter(new PropertyFilter() {
					public boolean apply(Object source, String name, Object value) {
						if (value != null && Date.class.isAssignableFrom(value.getClass())) {
							return true;
						}
						return false;
					}
				});
				return config;
			}
		});
	}
......

[편집 ] Spring MVC Annotation의 장점과 단점

[편집 ] 장점

  • XML 설정파일에 대한 설정을 최소화할 수 있다.
  • 설정방법이 단순하다.
  • 관리해야 하는 XML 설정파일의 개수가 감소한다.
  • 대상 클래스에서 Auto Completion을 통한 구현이 가능하다.
  • 개발자가 설정되는 대상 클래스와 메소드에 대한 정확한 이해(매핑, 파라미터, 모델, 폼 등) 후 적용하므로 유지보수 및 관리가 용이해 진다.
  • 개발자적 입장에서 보았을 때, 보기 명확하며 편안하다.

[편집 ] 단점

  • Java1.5 이상의 환경에서 지원된다.
  • XML 설정파일에서 제공되는 다양한 property 설정이 불가능하다.
  • Annotation의 적절한 사용을 위한 진입장벽이 발생한다. (Learning Curve: 일정 기간의 학습이 필요함)
  • Annotation의 내부 구조 이해가 어렵다.
  • 현재까지 Annotation 사용을 위한 Reference가 부족하다.

[편집 ] Spring MVC Blog 예제 다운로드

  • SpringMVC + springframework + Hibernate3으로 이루어진 예제이다.
  • Spring MVC Blog 예제 다운로드 
  • 데이터베이스는 hsql을 사용하였다. 예제를 실행시키기 전에 data 폴더안의 server.bat 파일을 먼저 실행시켜 데이터베이스를 띄워야한다.

그림:information.gif 

  • 예제 실행을 위해서는 JDK, 이클립스, 톰캣 등의 개발환경이 필요하다. (개인 개발환경  참고)

그림:information.gif 

[편집 ] 참고자료


출처 : http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Spring_MVC_Annotation

Posted by 1010
반응형
설정 간편화

스프링 3은 mvc 네임스페이스를 도입하여 스프링 MVC 설정을 대폭 간편화했다. 지금까지 다른 개선사항들은 스프링 MVC 애플리케이션을 구성하고 실행하는것을 간편화 시켜주지는 않았다. mvc-basic 예제를 통해 살펴보도록 하자.

mvc-basic 예제는 스프링 MVC 기능의 기본 구성을 보여주도록 만들었다. 프로젝트는 spring-samples SVN 저장소에서 얻을 수 있으며 메이븐으로 빌드하고 이클립스로 import할 수 있다. web.xml 부터 시작하여 거기에 있는 설정부터 살펴보자. 주목할 것은 DispatcherServlet이 단일 마스터 스프링 설정 파일로 설정되어 있고 그 안에서 모든 애플리케이션 구성요소를 초기화한다. URL Rewrite를 설정하여 모든 요청을 깔끔하고 REST-스러운 URL로 DispatcherServlet에 보낸다.

마스터 설정 app-config.xml에 서 일반적인 구성을 살펴볼 수 있다. 컴포넌트 스캔으로 클래스패스에서 애플리케이션 구성요소를 찾는다. MessageSource를 설정하여 지역화된 리소스 번들을 설정한다. 마지막으로 애플리케이션의 스프링 MVC 설정을 import한다.

mvc-config.xml 안에서 스프링 3의 첫번째 새 기능을 볼 수 있다.

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

이 태그는 요청을 @Controller로 디스패치할 때 필요한 HadlerMapping과 HandlerAdapter를 등록한다. 또한 클래스패스에 무엇이 있는지에 따른 감각적인 기본값(sensible defaults)을 제공한다. 그러한 기본값은 다음과 같다.

- 자바빈 PropertyEditor 보다 더 견고한 대체제인 스프링 3 타입 ConversionService 사용하기
- @NumberFormat으로 숫자 필드 포매팅 지원
- @DateTimeFormat을 사용하여 Date, Calendar 포매팅 지원. Joda Time이 클래스패스에 있다면 Joda Time도 포매팅 지원.
- JSR-303 공급자가 클래스패스에 있다면 @Controller 입력값을 @Valid를 사용하여 검증
- JAXB가 클래스패스에 있다면 XML 읽기/쓰기 지원
- Jackson이 클래스패스에 있다면 JSON 읽기/쓰기 지원

꽤 멋지지 않은가? 훗

계속해서 mvc-config.xml 다음 줄에서 또다른 새로운 기능을 살펴보자.

<!-- Forwards requests to the "/" resource to the "welcome" view -->
<mvc:view-controller path="/" view-name="welcome" />

mvc:view-controller는 랜더링할 뷰를 선택하는 ParameterizableViewController를 등록한다. "/"를 요청하면 welcome 뷰를 랜더링하도록 설정했다. 실제 뷰 템플릿은 /WEB-INF/views 디렉토리의 .jsp가 랜더링 된다.

계속해서 mvc-config에서 살펴보지 않은 새로운 기능을 보도록 하자.

<!-- Configures Handler Interceptors -->
<mvc:interceptors>
   <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de -->
   <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

mvc:interceptors 태그는 모든 컨트롤러에 적용할 HandlerInterceptor를 등록하게 해준다. 이전에는 반복적으로 모든 HandlerMapping 빈에 interceptor들을 등록했었다. 또한 이 태그를 사용하여 인터셉터를 적용할 URL 경로를 제한할 수 있다.

자 지금까지 살펴본 것을 종합하여, 예제를 배포하면 다음과 같은 welcome 뷰가 랜더링 될 것이다.


다른 지역 링크를 클릭하여 LocaleChangeInterceptor가 사용자 지역을 교체하도록 해보자.

데이터 바인딩 간편화

다음으로 설명할 새 기능은 @Controller 바인딩과 검증이다. 몇주 전에 글을 올렸다시피 이 부분에 새로운 기능이 많이 있다.

예제에서, @Controller Example 링크를 클릭하면 다음과 같은 폼이 랜더링 된다.


이 폼은 지역 정보 변경에 따라 국체화 필드 포매팅이 적용된다. 예를 들어, en에서 de로 바꾸면 날짜 형식을 12/21/10에서 12.12.10으로 바꾼다. 이런 동작과 폼 검증 규칙은 모델 애노테이션을 기반으로 한다.

public class Account {

    @NotNull
   @Size(min=1, max=25)
   private String name;

    @NotNull
   @NumberFormat(style=Style.CURRENCY)
   private BigDecimal balance = new BigDecimal("1000");

    @NotNull
   @NumberFormat(style=Style.PERCENT)
   private BigDecimal equityAllocation = new BigDecimal(".60");

    @DateTimeFormat(style="S-")
   @Future
   private Date renewalDate = new Date(new Date().getTime() + 31536000000L);

}

폼 서브밋은 다음의 AccountController 메서드가 처리한다.

@RequestMapping(method=RequestMethod.POST)
public String create(@Valid Account account, BindingResult result) {
   if (result.hasErrors()) {
       return "account/createForm";
   }
   this.accounts.put(account.assignId(), account);
   return "redirect:/account/" + account.getId();
}

이 메소드는 바인딩과 검증 작업 이후에 호출되며, Account 검증은 @Valid 애노테이션에 의해 수행된다. 만약 어떠한 검증 에러라도 존재한다면 createForm을 다시 랜더링 한다. 그렇지 않을 경우 Account는 저장되고 사용자는 http://localhost:8080/mvc-basic/account/1로 리다이렉트 된다.

또 다른 멋진 기능을 사용해보려면 /account/99 같이 존재하지 않는 계정을 요청해보기 바란다.

요약

스프링 3은 다양한 새 기능과 여러 기존 분야에 대한 간편화를 제공한다. 이 글을 통해 여러분에게 유용한 새로운 스프링 MVC 개선 사항들을 파악했기를 바란다. 맨 처음에 언급했듯이 더 많은 "스프링 3 간편화" 시리즈를 통해 계속해서 스프링 최신 버전의 새롭고 흥미로운 기능들을 소개할테니 기대하기 바란다.

출처 : http://whiteship.me/2517
Posted by 1010
반응형

Developing a Spring Framework MVC application step-by-step

Authors

Thomas Risberg, Rick Evans, Portia Tung

2.5

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

Table of Contents

Overview
1. What's covered
2. Prerequisite software
3. The application we are building
1. Basic Application and Environment Setup
1.1. Create the project directory structure
1.2. Create 'index.jsp'
1.3. Deploy the application to Tomcat
1.4. Check the application works
1.5. Download the Spring Framework
1.6. Modify 'web.xml' in the 'WEB-INF' directory
1.7. Copy libraries to 'WEB-INF/lib'
1.8. Create the Controller
1.9. Write a test for the Controller
1.10. Create the View
1.11. Compile and deploy the application
1.12. Try out the application
1.13. Summary
2. Developing and Configuring the Views and the Controller
2.1. Configure JSTL and add JSP header file
2.2. Improve the controller
2.3. Decouple the view from the controller
2.4. Summary
3. Developing the Business Logic
3.1. Review the business case of the Inventory Management System
3.2. Add some classes for business logic
3.3. Summary
4. Developing the Web Interface
4.1. Add reference to business logic in the controller
4.2. Modify the view to display business data and add support for message bundle
4.3. Add some test data to automatically populate some business objects
4.4. Add the message bundle and a 'clean' target to 'build.xml'
4.5. Adding a form
4.6. Adding a form controller
4.7. Summary
5. Implementing Database Persistence
5.1. Create database startup script
5.2. Create table and test data scripts
5.3. Add Ant tasks to run scripts and load test data
5.4. Create a Data Access Object (DAO) implementation for JDBC
5.5. Implement tests for JDBC DAO implementation
5.6. Summary
6. Integrating the Web Application with the Persistence Layer
6.1. Modify service layer
6.2. Fix the failing tests
6.3. Create new application context for service layer configuration
6.4. Add transaction and connection pool configuration to application context
6.5. Final test of the complete application
6.6. Summary
A. Build Scripts
Posted by 1010