Spring MVC настройка без xml и web.xml

Этой заметкой я хочу начать серию статей по Spring и в частности по Spring MVC. Рассмотрим настройку приложения spring без xml. Поскольку это один из самых популярных фреймворков в современной разработке веб приложений, его знания требуют даже от претендентов на должность младшего java разработчика, не говоря о претендентах на высшую должность. 

Эта статья предназначена для тех, кто уже знаком с данным фреймворком и работал с ним. Для новичков будет цикл статей посвященных разработкой на Spring с нуля. Здесь же, я просто хочу продемонстрировать, как можно избавиться от настройки xml и web.xml и полностью перейти на java классы.

Сейчас мы не будем говорить о самом Spring и его преимуществах. Статья будет полностью посвящена настройке Spring MVC с помощью java классов и аннотаций. Мы не будем учитывать здесь базу данных и другие дополнительные ресурсы. Поняв суть, Вы сможете сами подбирать и добавлять все необходимые бины по примеру. Еще одним преимуществом такой настройки приложения будет то, что мы полностью избавимся от web.xml.

Для начала нужно создать проект для сборки я использую Maven: new -> maven project -> maven-archetype-webapp ->

new maven web project

-> Finish.

В новом проекте может отсутствовать папка java. Ее нужно создать: src -> new -> source folder.

В папке java желательно создать несколько пакетов: для контроллера и для конфигураций.

Далее необходимо открыть pom.xml и добавить зависимости для spring mvc. Не забудьте также добавить javaee-api только в рамках provided:

Код    
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3.     <modelVersion>4.0.0</modelVersion>
  4.     <groupId>com.javamaster</groupId>
  5.     <artifactId>springwithoutxml</artifactId>
  6.     <packaging>war</packaging>
  7.     <version>0.0.1-SNAPSHOT</version>
  8.     <name>springwithoutxml Maven Webapp</name>
  9.     <url>http://maven.apache.org</url>
  10.     <dependencies>
  11.         <dependency>
  12.             <groupId>junit</groupId>
  13.             <artifactId>junit</artifactId>
  14.             <version>3.8.1</version>
  15.             <scope>test</scope>
  16.         </dependency>
  17.         <dependency>
  18.             <groupId>org.springframework</groupId>
  19.             <artifactId>spring-webmvc</artifactId>
  20.             <version>4.2.6.RELEASE</version>
  21.         </dependency>
  22.         <dependency>
  23.             <groupId>javax</groupId>
  24.             <artifactId>javaee-api</artifactId>
  25.             <version>7.0</version>
  26.             <scope>provided</scope>
  27.         </dependency>
  28.     </dependencies>
  29.     <build>
  30.         <finalName>springwithoutxml</finalName>
  31.     </build>
  32. </project>

 

Когда все необходимые зависимости есть, можно приступать к настройке проекта. Создаем класс RootConfig который будет унаследован от WebMvcConfigurerAdapter — этот класс имплементирует интерфейс WebMvcConfigurer, которые имеет очень много методов. Из них самые используемые: настройка ресурсов, валидации, сообщений (messaging), интерцепторы (interceptors) и другие. Больше Вы сможете найти в документации. Не забудьте пометить свой класс аннотацией @Configuration:

Код    
  1. package com.javamaster.config;
  2.  
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  5.  
  6. @Configuration
  7. public class RootConfig extends WebMvcConfigurerAdapter {
  8.  
  9. }

 

Для нашего Hello world приложение использовать этот класс мы не будем. Это для того, чтобы Вы знали где подключать ресурсы.

Далее нужно создать класс: WebConfig в который мы добавим ViewResolver — пропишем наши суффикс и префикс для вьюшек:

Код    
  1. package com.javamaster.config;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.ComponentScan;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.web.servlet.ViewResolver;
  7. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  8. import org.springframework.web.servlet.view.InternalResourceViewResolver;
  9.  
  10. @Configuration
  11. @EnableWebMvc
  12. @ComponentScan(basePackages = "com.javamaster")
  13. public class WebConfig {
  14.  
  15.     @Bean
  16.     ViewResolver viewResolver(){
  17.         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  18.         resolver.setPrefix("/WEB-INF/");
  19.         resolver.setSuffix(".jsp");
  20.         return resolver;
  21.     }
  22. }

Как видите, данный класс мы тоже пометили как @Configuration и еще добавили @EnableWebMvc — добавление этой аннотации к классу импортирует конфигурацию Spring MVC из WebMvcConfigurationSupport. Мы также добавили @ComponentScan и прописали наши пакеты.

Теперь, так как мы хотим использовать класс вместо web.xml нужно создать WebAppInitialiser который мы унаследуем от AbstractAnnotationConfigDispatcherServletInitializer. В нем есть три метода, которые нужно имплементировать и добавить в них наши классы настроек:

Код    
  1. package com.javamaster.config;
  2.  
  3. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  4.  
  5. public class WebAppInitialiser extends AbstractAnnotationConfigDispatcherServletInitializer {
  6.  
  7.     @Override
  8.     protected Class<?>[] getRootConfigClasses() {
  9.         // TODO Auto-generated method stub
  10.         return new Class[]{RootConfig.class};
  11.     }
  12.  
  13.     @Override
  14.     protected Class<?>[] getServletConfigClasses() {
  15.         // TODO Auto-generated method stub
  16.         return new Class[]{WebConfig.class};
  17.     }
  18.  
  19.     @Override
  20.     protected String[] getServletMappings() {
  21.         // TODO Auto-generated method stub
  22.         return new String[]{"/"};
  23.     }
  24.  
  25. }

На этом конфигурация закончена. Теперь можно создавать контроллеры и jsp страницы:

Код    
  1. package com.javamaster.controller;
  2.  
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5.  
  6. @Controller
  7. public class HomeController {
  8.  
  9.     @RequestMapping("/")
  10.     public String getIndex(){
  11.         return "index";
  12.     }
  13.    
  14.     @RequestMapping("/welcome")
  15.     public String getWelcome(){
  16.         return "welcome";
  17.     }
  18. }

index.jsp:

Код    
  1. <h2>Hello World!</h2>
  2. </body>
  3. </html>

welcome.jsp:

Код    
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2.    pageEncoding="ISO-8859-1"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Insert title here</title>
  6. </head>
  7. <h1>Welcome to my page</h1>
  8. </body>
  9. </html>

Теперь можно запустить проект.

настройка без xml и web.xml

Нужно сказать, что это не единственный вариант настройки Spring MVC без xml. Почитав документацию, Вы найдете, что можно пробовать и другие способы.

Ссылка на код: https://github.com/caligula95/springwithoutxml

Я также записал видео где можно посмотреть, настройку Spring:

4 thoughts on “Spring MVC настройка без xml и web.xml

  1. У меня не работает. Уже с десяток таких проектов-примеров по интернету перепробовал, в том числе и ваш. То есть проекты, где есть web.xml — все ок. Тут — пробовал и в Интелиж Идее и в Эклипсе — 404-я ошибка и все. Сервлет даже ничего не пишет. Никаких ошибок диспатчеров и прочего… просто не отрабатывает ничего и все… (((((

  2. Решилось. Для тех, у кого не получается в Идее:

    1. Надо в pom.xml в раздел build добавить:

    org.apache.maven.plugins
    maven-war-plugin
    2.6

    false

    2. Перезайти в Идее в модуль Сеттингс и перевыбрать папку в раздели Модули / Вэб…. указав в Web Resource Derictories (внизу) что-то типа «D:\Learning\springwithoutxml-master\src\main\webapp\WEB-INF». Короче Ваш путь к папке именно вебинфа…..

  3. мой предыдущий камент не прошел полность. Короче в пом надо добавить…. гуглите на тему false…. У Мкионга есть статья об этом.

    И вопрос к автору — как сделать тоже самое не для чистого спринга а для спрингбута?

    • Добрый день. Я не знаю почему у Вас не поднимается проект. Возможно это связано с версией томката.
      Для спринг бута уже не нужно никаких xml файлов. Там даже не нужно ничего «колдовать». Он по умолчанию запускается без web.xm. Единственное что нужно подшаманить это спринг бут для jsp файлов. Он их не очень любит. Вот почитайте статью
      Spring Boot простое приложение

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