Введение в инфраструктуру Spring
В этом документе показан процесс создания простого веб-приложения MVC с помощью инфраструктуры Spring. Рассматриваемое приложение позволяет пользователю ввести свое имя в текстовое поле; после нажатия кнопки "OK" имя возвращается и отображается на второй странице с приветствием.
Инфраструктура Spring – популярная платформа приложений с открытым кодом, предназначенная для упрощения разработки для J2EE. Она состоит из контейнера, инфраструктуры управления элементами и набора интегрируемых служб для веб-интерфейсов пользователя, транзакций и сохранения состояния. В инфраструктуру Spring входит Spring Web MVC – расширяемая инфраструктура MVC для создания веб-приложений.
IDE обеспечивает встроенную поддержку инфраструктуры Spring Framework 2.5. Библиотеки инфраструктуры упакованы вместе с IDE и автоматически добавляются в путь к классам проекта при выборе инфраструктуры. Предоставляются параметры настройки, например, название и отображение DispatcherServlet Spring Web MVC. Библиотека JSTL регистрируется автоматически. Также предоставляется поддержка файлов настройки компонента XML, в т.ч. следующие функциональные возможности:
- Автозавершение кода. Вызывается в файлах настройки XML Spring для классов Java и ссылок на компоненты.
- Переходы. Гиперссылки на классы Java и свойства, указанные в определениях компонентов Spring, а также гиперссылки на описания других компонентов.
- Реорганизация. Переименование ссылок на классы Java в файлах настройки Spring XML.
Для получения дополнительных сведений об инфраструктуре Spring посетите веб-сайт http://www.springframework.org. Более подробное пояснение поведения артефактов инфраструктуры Spring и их взаимодействия с другими объектами в приложении приведено на официальном сайте Spring Framework Reference Documentation и в документе Spring Framework API.
Содержание

Для работы с этим руководством требуется программное обеспечение и ресурсы, перечисленные ниже.
| Среда IDE NetBeans |
Web and Java EE, версия 6.1 |
| Комплект для разработчика на языке Java (JDK) |
версия 6 или версия 5 |
Сервер приложений GlassFish
или
Контейнер сервлетов Tomcat |
V2
версия 6.x |
Примечания:
- Установка Web and Java EE позволяет дополнительно установить сервер приложений GlassFish V2 и контейнер сервлетов Apache Tomcat 6.0.x. Для продолжения работы с этим руководством в среде IDE должен быть зарегистрирован сервер.
- Если необходимо сравнить проект с рабочим решением, можно загрузить демонстрационное приложение.
Создание проекта с поддержкой Spring Web MVC
Создание скелетного проекта Spring Web MVC
Начнем с создания нового проекта веб-приложения с использованием инфраструктуры Spring:
- Выберите в главном меню "File" пункт "New Project" (Ctrl-Shift-N). В области "Categories" выберите "Web". В "Projects" выберите "Web Application". Нажмите кнопку "Next".
- В поле "Project Name" введите HelloSpring. Выберите сервер, с которым планируется работать, из раскрывающегося списка "Server". Оставьте для всех остальных параметров значения по умолчанию и нажмите кнопку "Next". На экране 3 – "Server and Settings" – внесите требуемые изменения для сервера, который предполагается использовать, в остальных случаях примите значения по умолчанию. Нажмите кнопку "Next".
- На экране 4 выберите "Spring Web MVC 2.5" на панели "Frameworks":
При выборе "Spring Web MVC 2.5" обратите внимание, что имя и отображение сервлета обработчика Spring можно настроить на вкладке "Configuration". На вкладке "Libraries" можно заметить, что при создании проекта к пути классов по умолчанию добавляются библиотеки JSTL.
Нажмите кнопку "Finish". В результате создается проект для всего приложения, в т.ч. все метаданные, а также сценарий сборки проекта Ant, с которым можно ознакомиться из окна "Files" (Ctrl-2). Структуру шаблона можно просмотреть в окне "Projects" (Ctrl-1). Также следует отметить, что по умолчанию в редакторе исходного кода среды IDE открываются четыре файла: dispatcher-servlet.xml, applicationContext.xml, redirect.jsp и index.jsp.
Выполнение скелетного проекта
Перед изменением файлов проекта следует попытаться запустить созданный проект в среде IDE:
- В окне "Projects" щелкните правой кнопкой мыши узел проекта и выберите "Run Project" (или нажмите клавишу F6). При этом автоматически запускается сервер, если он еще не запущен, после чего происходит сборка и развертывание приложения на этом сервере. Приложение выполняется с использованием данных настройки из файла dispatcher-servlet.xml. Обратите внимание на данные, выводимые в окне "Output" среды IDE (Ctrl-4). Создаваемые выходные данные должны заканчиваться сообщением BUILD SUCCESSFUL:
Запускается обозреватель, назначенный по умолчанию в среде IDE, и в нем открывается содержимое из представления страницы приветствия (/WEB-INF/jsp/index.jsp):

Ключ к пониманию произошедших событий представлен в дескрипторе развертывания проекта (web.xml). Откройте этот файл в редакторе исходного кода, щелкнув правой кнопкой мыши узел WEB-INF > web.xml в окне "Projects" и выбрав "Edit". Точка входа по умолчанию для приложения – redirect.jsp:
<welcome-file-list>
<welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
Внутри redirect.jsp содержится оператор перенаправления, направляющий все запросы в index.htm:
<% response.sendRedirect("index.htm"); %>
В дескрипторе развертывания обратите внимание на то, что все запросы шаблонов URL, соответствующие выражению *.htm, отображаются на DispatcherServlet Spring:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
Класс сервлета dispatcher, как показано выше, – org.springframework.web.servlet.DispatcherServlet. Этот класс содержится в библиотеках Spring, добавленных в путь классов проекта при создании. Для проверки этого разверните следующие подузлы узла "Libraries":

DispatcherServlet обрабатывает входящие запросы, руководствуясь параметрами настройки из файла dispatcher-servlet.xml. Откройте файл dispatcher-servlet.xml, щелкнув соответствующую вкладку в редакторе исходного кода. Обратите внимание на следующий код:
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
В файле определены три компонента: indexController, viewResolver и urlMapping. Если DispatcherServlet получает запрос, соответствующий выражению *.htm, например index.htm, выполняется поиск контроллера внутри urlMapping, способного обработать этот запрос. Выше можно заметить, что существует свойство mappings, связывающее /index.htm с indexController.
В дальнейшем среда выполнения выполняет поиск определения компонента indexController, предоставляемого скелетным проектом. Следует отметить, что indexController расширяет ParameterizableViewController. Это еще один класс, предоставляемый инфраструктурой Spring, который просто возвращает представление. Обратите внимание на рисунках выше, что p:viewName="index" указывает логическое имя представления, разрешаемое с помощью viewResolver путем добавления /WEB-INF/jsp/ слева и .jsp справа. Таким образом становится возможным обнаружение файла в файле WAR приложения и ответ представлением страницы приветствия (/WEB-INF/jsp/index.jsp).
Обзор приложения
Создаваемое приложение состоит из двух страниц JSP, в терминологии Web MVC Spring называемых представлениями (views). В первом представлении содержится форма HTML с полем ввода, запрашивающим имя пользователя. Второе представление – это страница, на которой просто выводится на экран приветственное сообщение, содержащее имя пользователя.
Управление представлениями осуществляется с помощью контроллера, который получает запросы приложения и определяет, какие представления необходимо возвратить. Контроллер также передает представлениям все данные, требуемые для вывода (это называется моделью). Контроллер нашего приложения называется HelloController.
В сложном веб-приложении рабочая логика не размещается непосредственно в контроллере. Вместо этого при каждом обращении к рабочей логике контроллером используется другой объект, называемый службой. В нашем приложении рабочая логика заключается в вычислении приветственного сообщения; для выполнения этой задачи создадим службу HelloService.
Реализация службы
Теперь, когда среда настроена правильно, скелетный проект можно расширить в соответствии с имеющимся требованиями. Начнем с создания класса HelloService.
- В окне "Projects" щелкните правой кнопкой мыши узел проекта и выберите "New > Java Class".
- В открывшемся мастере "New Java Class" введите HelloService в поле "Class Name", введите service в поле "Package Name" и создайте новый пакет для класса. Нажмите кнопку "Finish". В результате создается новый класс, который открывается в редакторе исходного кода. Также следует отметить, что окно "Projects" автоматически обновляется в соответствии с внесенными изменениями.
Действия, выполняемые классом HelloService, очень просты. Он принимает параметр (имя), а затем подготавливает и возвращает значение String, имеющее в своем составе это имя. Создайте следующий метод sayHello() для класса в редакторе исходного кода (изменения выделены полужирным шрифтом):
public class HelloService {
public String sayHello(String name) {
return "Hello " + name + "!";
}
}
Реализация контроллера и модели
Для обработки пользовательских данных и определения возвращаемого представления можно использовать SimpleFormController.
- Откройте мастер создания файла путем нажатия комбинации клавиш Ctrl-N. Выберите "Spring Framework" в поле "Categories" и Simple Form Controller в поле "File Types". Нажмите кнопку "Next".
- Назовите класс HelloController и создайте для него новый пакет, для чего введите controller в текстовом поле "Package". Нажмите кнопку "Finish". В результате создается новый класс, который открывается в редакторе исходного кода.
- Укажите свойства контроллера, для чего раскомментируйте методы установки, отображаемые по умолчанию в шаблоне класса. Внесите следующие изменения (показаны полужирным шрифтом):
public HelloController() {
setCommandClass(Name.class);
setCommandName("name");
setSuccessView("helloView");
setFormView("nameView");
}
Параметр FormView позволяет установить имя представления, используемого для отображения формы. Это страница, содержащая текстовое поле, позволяющее пользователю вводить свое имя. Параметр SuccessView аналогичным образом позволяет установить имя представления, выводимого при успешной передаче. Параметр CommandName определяет имя команды в модели. В нашем случае команда – это объект формы со связанными параметрами запроса. Параметр CommandClass позволяет установить имя класса команды. Экземпляр этого класса наполняется и проверяется на допустимость при каждом запросе.
Следует отметить, что для Name в методе setCommandClass() выставлен флаг ошибки:
Необходимо также создать класс Name в качестве простого компонента для хранения данных каждого запроса.
- В окне "Projects" щелкните правой кнопкой мыши узел проекта и выберите "New > Java Class". Открывается мастер создания класса Java. Введите Name в поле "Class Name" и controller в раскрывающемся списке "Package". Нажмите кнопку "Finish". В результате создается класс Name, который открывается в редакторе исходного кода.
- Создайте поле value для класса Name, а затем создайте для этого поля методы доступа. Введите следующий код (изменения показаны полужирным шрифтом):
public class Name {
private String value;
Методы доступа также можно создать автоматически. Щелкните правой кнопкой мыши поле value в редакторе исходного кода и выберите "Refactor > Encapsulate Fields". Откроется диалоговое окно "Encapsulate Fields"
Следует отметить, что методы getValue() и setValue() создаются с видимостью public. Нажмите кнопку "Refactor". Оба метода добавляются в класс Name:
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
- Перейдите обратно к HelloController в редакторе исходного кода и обратите внимание на исчезновение значка ошибки, который выводился ранее, в результате создания класса Name. Удалите метод doSubmitAction() и раскомментируйте метод onSubmit(). Метод onSubmit() позволяет создать собственный ModelAndView, который необходим в нашем случае. Внесите следующие изменения:
@Override
protected ModelAndView onSubmit(Object command) throws Exception {
Name name = (Name)command;
ModelAndView mv = new ModelAndView(getSuccessView());
mv.addObject("helloMessage", helloService.sayHello(name.getValue()));
return mv;
}
Как указывалось выше, command приводится к объекту Name. Создается экземпляр ModelAndView, и с помощью метода получения в SimpleFormController создается представление. Наконец, модель наполняется данными. Единственный элемент в нашей модели – приветственное сообщение, полученное из HelloService, созданного ранее. Для добавления к модели приветственного сообщения под именем helloMessage используется метод addObject.
- Для исправления ошибок импорта щелкните правой кнопкой мыши в редакторе исходного кода и выберите "Fix Imports" (Ctrl-Shift-I). В начало файла добавляется следующий оператор импорта:
import org.springframework.web.servlet.ModelAndView;
Исправлены не все ошибки, поскольку класс по-прежнему не может идентифицировать класс HelloService; также невозможно использование метода sayHello().
- Объявите закрытое поле HelloService внутри HelloController:
private HelloService helloService;
Затем создайте для поля общедоступный метод установки:
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
Наконец, щелкните правой кнопкой мыши в редакторе исходного кода и выберите "Fix Imports". Обратите внимание, что в начало файла добавляется следующее выражение:
import service.HelloService;
На этом все ошибки должны быть исправлены.
- Зарегистрируйте HelloService в файле applicationContext.xml. Откройте файл applicationContext.xml в редакторе исходного кода и введите следующее объявление компонента:
<bean name="helloService" class="service.HelloService" />
- Зарегистрируйте HelloController в файле dispatcher-servlet.xml. Откройте файл dispatcher-servlet.xml в редакторе исходного кода и введите следующее объявление компонента:
<bean class="controller.HelloController" p:helloService-ref="helloService"/>
Поддержка Spring в среде IDE включает в себя автозавершение кода в файлах настройки XML для классов Java и ссылок на компоненты. Для вызова автозавершения кода нажмите комбинацию клавиш Ctrl-Space в редакторе исходного кода.

Реализация представлений
Для реализации представления этого проекта необходимо создать два класса JSP. Первый класс – nameView.jsp – служит страницей приветствия и позволяет пользователю ввести имя. На другой странице – helloView.jsp – выводится на экран приветственное сообщение, включающее в себя введенное имя.
- В окне "Projects" щелкните правой кнопкой мыши узел "WEB-INF > jsp" и выберите "New > JSP". Откроется мастер "New JSP File". Присвойте файлу имя helloView. Нажмите кнопку "Finish". В результате новый файл JSP создается в папке "jsp" и открывается в редакторе исходного кода.
- Измените заголовок файла на Hello в редакторе исходного кода и измените выходное сообщение, которое должно извлекать helloMessage объекта ModelandView, созданного в HelloController:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello</title>
</head>
<body>
<h2>${helloMessage}</h2>
</body>
- Создайте еще один файл JSP способом, приведенным выше, но назовите его nameView.
- Добавьте к файлу nameView.JSP в редакторе исходного кода следующее объявление библиотеки тегов:
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
Этот код служит для импорта библиотеки тегов Spring, в которой содержатся теги, используемые при реализации страниц JSP.
- Измените содержимое тегов <title> и <h2> на текст "Enter your name".
- Введите следующий код под тегами h2:
<spring:nestedPath path="name">
<form action="" method="post">
Name:
<spring:bind path="value">
<input type="text" name="${status.expression}" value="${status.value}">
</spring:bind>
<input type="submit" value="OK">
</form>
</spring:nestedPath>
spring:bind позволяет осуществлять привязку свойства компонента. Тег привязки обеспечивает состояние и значение привязки, которые используются в качестве имени и значения поля ввода. Таким образом, при передаче формы инфраструктуре Spring будет известен способ извлечения переданного значения. Здесь наш класс команды (controller.Name) обладает свойством value, поскольку в path установлено value.
spring:nestedPath добавляет указанный путь слева от компонента. Так, при использовании с spring:bind как показано выше, путь к компоненту становится следующим: name.value. Как уже указывалось, имя команды HelloController – "name". Поэтому данный путь относится к свойству value компонента name в контексте страницы.
- Измените относительную точку входа приложения. На данный момент точкой входа проекта продолжает служить index.htm, который, как указывалось в разделе Запуск скелетного проекта выше, перенаправляется в WEB-INF/jsp/index.jsp. Точку входа для проекта можно указать при развертывании и запуске. В окне "Projects" щелкните правой кнопкой мыши узел проекта и выберите "Properties". Откроется диалоговое окно "Project Properties". В области "Categories" выберите "Run". В поле "Relative URL" введите /hello.htm и нажмите кнопку "OK".
Возникает вопрос: где же располагается отображение hello.htm на HelloController? Отображение не добавлялось к компоненту urlMapping, как в случае страницы приветствия скелетного проекта index.htm. Такая возможность обеспечивается средствами автоматизации инфраструктуры Spring, предоставляемыми следующим определением компонента dispatcher-servlet.xml:
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
Этот компонент отвечает за автоматическое создание отображения URL-адреса для всех контроллеров, зарегистрированных в файле. На входе в него передается полностью определенное имя класса контроллера (в нашем случае – controller.HelloController), от которого отбрасывается имя пакета и суффикс Controller, а результат используется для отображения URL. Таким образом, для HelloController создается отображение hello.htm. Это средство, однако, не срабатывает для контроллеров, включенных в инфраструктуру Spring, например ParameterizableViewController. Для них требуется явное отображение.
- В окне "Projects" щелкните правой кнопкой мыши узел проекта и выберите "Run" (F6). В результате проект компилируется, развертывается и запускается. После этого открывается обозреватель по умолчанию с открытой страницей hello.htm в качестве nameView проекта:
Введите имя в текстовом поле и нажмите клавишу Enter. На экран выводится helloView с сообщением приветствия:

Дополнительная информация
На этом введение в инфраструктуру Spring в среде IDE NetBeans завершено. В документе было показано создание простого веб-приложения MVC в среде IDE NetBeans с использованием инфраструктуры Spring. Также читатель был ознакомлен с интерфейсом среды IDE для разработки веб-приложений.
Рекомендуем продолжить изучение инфраструктуры Spring и выполнить другие руководства среды IDE NetBeans, например Поэтапная разработка приложения MVC инфраструктуры Spring с помощью NetBeans и GlassFish. Это официальное Руководство по инфраструктуре Spring Томаса Рисберга (Thomas Risberg), адаптированное для среды IDE NetBeans Арулази Десиасиланом (Arulazi Dhesiaseelan).
Многие возможности модуля Spring среды NetBeans могут применяться и в приложениях инфраструктуры Spring, не связанных с веб.
Для ознакомления с другими связанными руководствами см. следующие материалы: