В статье "Приложение на Spring..." была создана программа, с одним контроллером, который отдавал простую html страницу. Этот контроллер являлся потомком AbstractController, и должен был реализовывать методы родительского класса. Также он должен был быть прописан в dispatcher-servlet.xml.

С версии 2.5 framework  предоставляет возможность конфигурирования компонентов mvc с помощью аннотаций. Благодаря этому значительно уменьшается количество конфигурационной информации в XML-файлах. Для использования этой возможности, в dispatcher-servlet.xml необходимо включить бин:

XML:
  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

Класс контроллера должен быть помечен аннотацией @Contrller. Для того, чтобы определял такие контроллеры, необходимо включить соответствующую функцию. Для этого, в dispatcher-servlet.xml добавим строку:

XML:
  1. <context:component-scan base-package="ru.vaniashev.controllers"/>

Где base-package - пакет, в котором находятся контроллеры.

Теперь осталось изменить код HelloController:

JAVA:
  1. package ru.vaniashev.controllers;
  2.  
  3. import java.util.Properties;
  4.  
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.servlet.ModelAndView;
  9.  
  10. @Controller
  11. public class HelloController {
  12.  
  13.     private Properties properties;
  14.  
  15.     @Autowired
  16.     public HelloController(Properties properties) {
  17.         this.properties = properties;
  18.     }
  19.  
  20.     @RequestMapping("/hello.html")
  21.     protected ModelAndView hello(){
  22.         return new ModelAndView("hello", "message", "Hello, world!");
  23.     }
  24.  
  25. }

У контроллера обязательно должен быть конструктор, принимающий хотя бы один аргумент. В данном случае, в него передается бин properties, прописанный в dispatcher-servlet.xml. Метод hello() выполняет те же действия, что и метод HandleRequestInternal(...) из предыдущего примера. Кроме того, метод hello() может принимать и возвращать различные виды объектов. Подробнее об этом написано здесь.

Код dispatcher-servlet тоже изменлся:

XML:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:p="http://www.springframework.org/schema/p"
  5.     xmlns:context="http://www.springframework.org/schema/context"
  6.     xsi:schemaLocation="
  7.         http://www.springframework.org/schema/beans
  8.         http://www.springframework.org/schema/beans/-beans-2.5.xsd
  9.         http://www.springframework.org/schema/context
  10.         http://www.springframework.org/schema/context/-context-2.5.xsd" default-lazy-init="false" default-init-method="init">
  11.  
  12.     <bean
  13.         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
  14.  
  15.     <bean id="properties" class="java.util.Properties"/>
  16.  
  17.     <context:component-scan base-package="ru.vaniashev.controllers" />
  18.  
  19.     <bean id="viewResolver"
  20.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  21.         <property name="prefix" value="/WEB-INF/jsp/" />
  22.         <property name="suffix" value=".jsp" />
  23.     </bean>
  24. </beans>

Обратите внимание на то, что для работы приложения необходимо установить атрибут тэга <beans/> default-init-method="init"

Для быстрого запуска приложения можно использовать maven-jetty-plugin

Связанные записи