Spring 3. JavaConfig на примере Spring MVC

В этом уроке я хочу вам показать, как уйти от использование xml конфигураций, которые так заездились во всех интернет примерах. Вместо них мы будим использовать привычные нам классы.

Пример будет достаточно простым. Мы возьмеем уже готовый проект на Spring MVC и переведем его xml конфигурации на Java классы.

Для начало вам следует просмотреть этот урок Spring 3. MVC — Hello world так как на его основе бы и будем делать наш урок.

 

Шаг 0. Зависимости

Хочу обратить внимание, что мы будем использовать Spring версии 3.2.5.

Вот то содержимое файла pom.xml, которое должно быть у вас:

<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.devcolibri.common</groupId>
	<artifactId>SpringMVC</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>

	<properties>
		<spring.version>3.2.5.RELEASE</spring.version>
        <javax.servlet>3.0.1</javax.servlet>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${javax.servlet}</version>
            <scope>provided</scope>
        </dependency>

	</dependencies>

	<build>
		<finalName>SpringMVC</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

Шаг 1. Первоначальная подготовка

Для начало я скачал проект с урок Spring 3. MVC — Hello world и открыл его в Intellij IDEA.

Структура нашего проекта:

Как вы видите у насесть mvc-dispatcher-servlet.xml именно в нем идут все настройки нашего SpringMVC проекта. Давайте от него избавимся, заменив все конфигурации на JavaConfig.

 

Шаг 2. Избавляемся от web.xml

Теперь давайте создадим пакет config и в нем создаем класс Initializer.java он будет инициализировать наш Dispatcher Servlet:

package com.devcolibri.common.config;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

public class Initializer implements WebApplicationInitializer {

    // Указываем имя нашему Servlet Dispatcher для мапинга
    private static final String DISPATCHER_SERVLET_NAME = "dispatcher";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();

        // Регистрируем в контексте конфигурационный класс, который мы создадим ниже
        ctx.register(WebAppConfig.class);
        servletContext.addListener(new ContextLoaderListener(ctx));

        ctx.setServletContext(servletContext);

        ServletRegistration.Dynamic servlet = servletContext.addServlet(DISPATCHER_SERVLET_NAME, 
                                                                        new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);
    }

}

Данный класс выполняет анналогичную функцию файла web.xml, поэтому заходим в web.xml и свободно удаляем все кроме каркаса:

<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

</web-app>

 

Шаг 3. Избавляемся от mvc-dispatcher-servlet.xml

JavaConfig — это представление инициализации бинов в виде Java класса.

Начнем с того, что посмотрим содержимое mvc-dispatcher-servlet.xml файла:

<context:component-scan base-package="com.devcolibri.common.controller" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix">
		<value>/WEB-INF/pages/</value>
	</property>
	<property name="suffix">
		<value>.jsp</value>
	</property>
</bean>

Теперь давайте создадим в пакете config новый класс WebAppConfig.java:

package com.devcolibri.common.config;

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

@Configuration
@EnableWebMvc
@ComponentScan("com.devcolibri.common")
public class WebAppConfig extends WebMvcConfigurerAdapter {

    // Позволяет видеть все ресурсы в папке pages, такие как картинки, стили и т.п.
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    // а этот бин инициализирует View нашего проекта
    // точно это же мы делали в mvc-dispatcher-servlet.xml
    @Bean
    public InternalResourceViewResolver setupViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/pages/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);

        return resolver;
    }

}

Давайте познакомимся с аннотациями:

@Configuration — (для класса) говорит Spring, что это конфигурационный класс;

@EnableWebMvc — (для класса) указывает, что конфигурация поддерживает Web MVC;

@ComponentScan(«com.devcolibri.common») — (для класса) говорим Spring-у в каком пакете будут лежать controllers и сервисы для их инициализации.

@Bean — (для метода) — указывает, что аннотируемый метод является инициализацией бина требуемого для выполнение вашей логики.

Теперь смело удалейм mvc-dispatcher-servlet.xml, он нам уже ненужен.

И еще переместим папку pages на уровень высше. Сравните структуру всех файлов:

Теперь проект можно собрать и задеплоить на сервер, результат вы получите тот же, что и в первоначальном проекте, но уже с использованием JavaConfig классов.

Урок создан: 09 декабря 2013 | Просмотров: 26907 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 08 февраля 2014 в 12:54

    Арчи

    ошибка
    HTTP Status 500 — Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    type Exception report

    message Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    description The server encountered an internal error that prevented it from fulfilling this request.

    exception

    org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
    org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletionWithError(DispatcherServlet.java:1259)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

    root cause

    • 08 февраля 2014 в 14:31

      Олег Криль

      Если вы используете TomCat, то подключите библиотеку jstl отдельно. Зависимость для Maven: http://mvnrepository.com/artifact/jstl/jstl/1.2

      • 09 февраля 2014 в 12:54

        Арчи

        Спасибо, добавил зависимость, работает. Хорошие статьи. продолжайте тематику Spring.

        • 09 февраля 2014 в 12:57

          Олег Криль

          Спасибо) Работаем над этим)

          • 16 января 2016 в 02:55

            Dima

            Крутые статьи! Если можно напишите еще про настройку проекта с компонентами Spring и JSF с использованием анотаций, без xml.

            • 17 июня 2016 в 15:49

              Анатолий

              Эта статья как раз таки про это :)

  • 14 мая 2015 в 16:32

    Сергей

    Круто!!! Пожалуйста, побольше спринга!!!

  • 27 января 2016 в 17:13

    denisww

    отлично! подскажите , я в jsp странице написал , в логах вижу Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/common_js.js. Что бы изменить\или где положить common_js.js, чтобы избавиться от ошибки?

    • 27 января 2016 в 17:15

      denisww

      написал script type=»text/javascript» src=»common_js.js»>/script

  • 23 января 2017 в 14:58

    Андрей

    Мужик мне реально нравятся твои гайды. Доступно и понятно. Вопрос: как через инициализатор подключить JpaConfig ? Добавляя его в контекст ничего не происходит.