본문 바로가기

SPRING

Spring4 MVC-Annotation/JavaConfig Example

스프링 환경설정을 위한 방법은 자바와 XML이 있다. 전 게시글은 XML이고 이번은 자바소스를 사용한 환경설정이다.

 

Step 1. Update pom.xml with Spring and Servlet dependency

 

maven-war-plugin 선언을 주의해서 보자. web.xml 파일을 완전히 제거할 거기 떄문에,

war package를 build하기 위한 maven 실패를 피하기 위해서, 우리는 이 환경설정이 필요하다.

두번째 변화는 JSP/Servlet/Jstl dependencies의 포함이다. 이것은 우리가 servlet api’s and jstl view 를 우리 코드에서

사용하기 위해선 필요하다. (일반적으로 컨테이너는 이미 이 라이브러리를 포함하고 있음)

추가적으로  maven-compiler-plugin은 우리가 사용하려는  jdk-version 을 추가(이 예제는 1.6 사용)

이것이 존재하지 않으면 이클립스 내에서 mvn_update를 해야함( 이클립스는 기본적으로 1.5)

 

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.websystique.springmvc</groupId> <artifactId>Spring4MVCHelloWorldNoXMLDemo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>Spring4MVCHelloWorldNoXMLDemo Maven Webapp</name> <properties> <springframework.version>4.0.6.RELEASE</springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> <warName>Spring4MVCHelloWorldNoXMLDemo</warName> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </pluginManagement> <finalName>Spring4MVCHelloWorldNoXMLDemo</finalName> </build> </project

 

 

 

 

Step 2: Add Controller 

ModelMap: [request.getAttribute()/request.setAttribute()]를 대체

String return 값 메소드는 view resolver(see spring-servlet.xml above에 있는 suffix and prefix 값과 조합된다.

 

 

 

package com.websystique.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/")
public class HelloWorldController {
	
	
    @RequestMapping(method = RequestMethod.GET)//value 값 생략 시, 클래스 위의 url 값 상속
    public String sayHello(ModelMap model) {
        model.addAttribute("greeting", "Hello World from Spring 4 MVC");
        return "welcome";
    }
 
    @RequestMapping(value = "/helloagain", method = RequestMethod.GET)
    public String sayHelloAgain(ModelMap model) {
        model.addAttribute("greeting", "Hello World Again, from Spring 4 MVC");
        return "welcome";
    }

 

}

 

 

Step 3: Add View

welcome.jsp (WEB-INF/views/welcome.jsp)에 컨트롤러에서 보내지는 model 값이 접근된다.

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">

 

<title>HelloWorld page</title> </head> <body> Greeting : ${greeting} </body> </html>

 

Step 4: Add Configuration Class

 

configuration class는 spring-servlet.xml 포함하고 있는 정보를 대체해 줄 수있는 자바소스

@Configuration:이 클래스가  @Bean으로 된 하나 이상의 bean methods를 스프링 컨테이너에 의해 관리받는 곳

@EnableWebMvc = mvc:annotation-driven in XML :@Controller anotation을 지원할 수 있게 해줌

@ComponentScan = xml에서 context:component-scan base-package="..."

 

package com.websystique.springmvc.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration {
	@Bean
	public ViewResolver viewResolver(){
		InternalResourceViewResolver viewResolver =new InternalResourceViewResolver();
		viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
 
        return viewResolver;

	}
}

 

 

Step 5: Add Initialization class 
WebApplicationInitializer 부분은 web.xml에 정의되는 spring configuration 부분을 대체해주는 역할을 합니다.Servlet 3.0 Container startup 되는 동안, 이 클래스가 로드되고, onStartUp 메소드가 서블릿 컨테이너에 의해서 호출됩니다.

 

 

 

 

 

 

 

 

package com.websystique.springmvc.configuration; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; public class HelloWorldInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(HelloWorldConfiguration.class); ctx.setServletContext(container); ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(ctx)); servlet.setLoadOnStartup(1); servlet.addMapping("/"); } }

 

위의 내용은 web.xml의 내용(spring-servlet.xml의 경로를 제공하고 있는)가 유사합니다.

[update: 위의 class를 더 간결하게 사용할 수 있는 AbstractAnnotationConfigDispatcherServletInitializer]

 

 

 

package com.websystique.springmvc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
    @Override
    protected Class[] getRootConfigClasses() {
        return new Class[] { HelloWorldConfiguration.class };
    }
  
    @Override
    protected Class[] getServletConfigClasses() {
        return null;
    }
  
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
 
}

 


Step 6: Build and Deploy the application

명심해야 할 것은 Servlet 3.0 containers에 의존하는 WebApplicationInitializer와 같은  Spring java Configuration은 3.0이하의 servlet 선언을 사용하는 web.xml은 사용할 수 없기 때문에 우리의 application에서 web.xml을 제거해야함

 

 

번역:http://websystique.com/springmvc/spring-4-mvc-helloworld-tutorial-annotation-javaconfig-full-example/