Здесь показано создание простого веб-приложения MVC с помощью инфраструктуры Spring. В приложении пользователь может ввести свое имя в текстовом поле, и после нажатия кнопки "ОК" это имя отображается на второй странице вместе с приветствием.
Инфраструктура Spring – популярная инфраструктура приложений с открытым кодом, предназначенная для упрощения разработки для J2EE. Она состоит из контейнера, инфраструктуры управления элементами и набора интегрируемых служб для веб-интерфейсов пользователя, транзакций и сохранения состояния. В инфраструктуру Spring входит Spring Web MVC – расширяемая инфраструктура MVC для создания веб-приложений.
Среда IDE обеспечивает встроенную поддержку инфраструктуры Spring версий 3.0
и 2.5. Библиотеки инфраструктуры упакованы вместе с IDE и автоматически
добавляются в путь к классам проекта при выборе инфраструктуры. Предоставляются
параметры настройки, например, название и отображение Spring Web MVC
DispatcherServlet
. При создании проекта можно зарегистрировать
библиотеку JSTL. Также предоставляется поддержка файлов настройки компонента
XML, в т.ч. следующие функциональные возможности:
Для получения дополнительных сведений об инфраструктуре Spring посетите веб-сайт http://www.springsource.org/. Более подробное пояснение поведения артефактов инфраструктуры Spring и их взаимодействия с другими объектами в приложении приведено на официальном сайтеSpring Framework Reference Documentation и в документации Spring Framework API.
Содержание
Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные ниже.
Программное обеспечение или ресурс | Требуемая версия |
---|---|
Среда IDE NetBeans | версия Java 6.9 |
Комплект для разработчика на языке Java (JDK) | версия 6 |
GlassFish Server Open Source Edition | 3.0.1 |
Примечания
Начните с создания проекта веб-приложения с поддержкой инфраструктуры Spring.
dispatcher-servlet.xml
, applicationContext.xml
,
redirect.jsp
и index.jsp
.
Перед изменением файлов проекта следует попытаться запустить созданный проект в среде IDE:
BUILD
SUCCESSFUL
. /WEB-INF/jsp/index.jsp
). При выполнении проекта в среде IDE, он компилируется и развертывается на сервере, а затем открывается в обозревателе по умолчанию. Более того, среда IDE предоставляет возможность "Развертывание при сохранении", которая включена по умолчанию для веб-проектов. При сохранении файлов в редакторе проект автоматически компилируется и развертывается на сервере. Для просмотра изменений достаточно просто обновить страницу в обозревателе.
Ключ к пониманию произошедших событий представлен в дескрипторе развертывания
проекта (web.xml
). Чтобы открыть этот файл в редакторе исходных
файлов, щелкните правой кнопкой мыши узел WEB-INF
>
web.xml
в окне "Проекты" и выберите команду "Изменить". Точка входа
для приложения по умолчанию — 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>
Полностью определенное имя сервлета диспетчера сервлета
org.springframework.web.servlet.DispatcherServlet
. Это класс из
библиотеки Spring, которая была добавлена в путь к классам проекта при его
создании. Чтобы проверить это, разверните узел "Библиотеки" в окне "Проекты".
Найдите файл spring-webmvc-3.0.0.RELEASE.jar
, затем разверните его
и найдите org.springframework.web.servlet
>
DispatcherServlet
.
DispatcherServlet
обрабатывает входящие запросы на основе
параметров настройки из файла dispatcher-servlet.xml
. Откройте файл
dispatcher-servlet.xml
, щелкнув его вкладку в редакторе. Обратите
внимание на следующий код.
В этом файле определены три компонента: indexController
,
viewResolver
и urlMapping
. Когда
DispatcherServlet
получает запрос, соответствующий выражению
*.htm
, например, index.htm
, выполняется поиск
контроллера внутри urlMapping
, способного обработать этот запрос.
Выше можно заметить, что существует свойство mappings
, связывающее
/index.htm
с indexController
.
Среда выполнения выполняет поиск определения компонента
indexController
, предоставляемого схемой проекта. Обратите
внимание, что класс indexController
расширяет класс ParameterizableViewController
.
Это еще один класс инфраструктуры Spring, который просто возвращает
представление. Также обратите внимание, что p:viewName="index"
указывает логическое имя представления, которое разрешается с помощью
viewResolver
путем добавления /WEB-INF/jsp/
слева и
добавления .jsp
справа. Это позволяет среде выполнения найти файл в
папке приложения и предоставить в ответ представление страницы приветствия
(/WEB-INF/jsp/index.jsp
).
Создаваемое приложение состоит из двух страниц JSP (которые называются представлениями в терминологии MVC). Первое представление содержит форму HTML с полем, в которое пользователь вводит свое имя. Второе представление — страница, на которой отображается приветственное сообщение с именем пользователя.
Представления управляются контроллером, который получает запросы к
приложению и принимает решение, какие представления вернуть. Также он передает в
представления информацию, которая требуется для их отображения (она называется
моделью). Контроллер этого приложения называется
HelloController
.
В сложном веб-приложении бизнес-логика не размещается непосредственно в
контроллере. Вместо этого контроллером используется другой объект —
служба — при каждом обращении к бизнес-логике. В этом приложении
бизнес-логика ограничена обработкой приветственного сообщения, и для этой цели
создается служба HelloService
.
Теперь, после проверки правильности настроек среды, можно начать расширение
схемы проекта в соответствии с имеющимися требованиями. Начните с создания
класса HelloService
.
Класс HelloService
предоставляет очень простую службу. Он
принимает в качестве параметра имя, и подготавливает и возвращает
строку
, содержащую это имя. Создайте в редакторе следующий метод
sayHello()
для этого класса (изменения помечены полужирным
шрифтом).
public class HelloService { public String sayHello(String name) { return "Hello " + name + "!"; } }
Для обработки пользовательских данных и выбора представления для возврата
можно использовать SimpleFormController
.
AbstractController
и SimpleFormController
.
public HelloController() { setCommandClass(Name.class); setCommandName("name"); setSuccessView("helloView"); setFormView("nameView"); }Параметр
FormView
позволяет задать имя представления,
используемого для отображения формы. Это страница, содержащая текстовое поле
для ввода имени пользователя. Параметр SuccessView
аналогичным
образом позволяет задать имя представления, отображаемого при успешной
передаче данных. Параметр CommandName
задает имя команды в
модели. В данном случае, команда — это объект формы со связанными параметрами
запроса Параметр CommandClass
определяет имя класса команды.
Экземпляр этого класса заполняется и проверяется на допустимость при каждом
запросе. Name
в методе
setCommandClass()
отображается ошибка: Name
в качестве простого компонента, хранящего данные каждого запроса.
Name
будет создан и открыт в
редакторе.
Name
создайте поле value
, затем
создайте методы доступа (т.е. методы получения и установки) для этого поля.
Сначала объявите поле value
: public class Name { private String value; }
Чтобы быстро ввести "private
" можно ввести
"pr
" и затем нажать клавишу TAB. Автоматически добавляется
модификатор доступа "private
". Это пример использования шаблонов
кода редактора. Полный список шаблонов кода можно просмотреть, выбрав в меню
"Справка" пункт "Таблица сочетаний клавиш".
value
и выберите команду "Вставить код" или нажмите сочетание
клавиш ALT+INSERT (CTRL+I в Mac OS). Во всплывающем меню выберите пункт
"Методы получения и установки". value : String
и нажмите
кнопку "ОК". Методы getValue()
и setValue()
добавляются к классу Name
: public String getValue() { return value; } public void setValue(String value) { this.value = value; }
HelloController
,
чтобы переключиться обратно к классу 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
. Для добавления к модели приветственного сообщения
можно использовать метод addObject()
под именем
helloMessage
.
import org.springframework.web.servlet.ModelAndView;Как указано в документации API, этот класс "представляет модель и представление, возвращаемые контроллером для разрешения
DispatcherServlet
.
Представление может принимать форму имени представления String
,
которое должно быть разрешено объектом ViewResolver
; в качестве
альтернативы объект View
может быть указан непосредственно.
Модель — это объект Map
, что позволяет использовать несколько
объектов, выбираемых по имени." HelloService
и использовать его метод
sayHello()
.
HelloController
объявите частное поле
HelloService
: private HelloService helloService;Затем создайте для поля общедоступный метод установки:
public void setHelloService(HelloService helloService) { this.helloService = helloService; }Щелкните правой кнопкой мыши в области редактора и выберите команду "Исправить операторы импорта" (сочетание клавиш ALT+SHIFT+I; &#+SHIFT+I на компьютере Mac). В начало файла добавляется следующий оператор импорта:
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"/>
Для реализации представлений в проекте требуется создать две страницы JSP.
Первая из них, nameView.jsp
, служит страницей приветствия и
позволяет пользователю ввести имя. На второй, helloView.jsp
,
отображается приветственное сообщение с введенным именем. Сначала создайте
helloView.jsp
.
В окне "Проекты" щелкните правой кнопкой мыши узел
проекта "HelloWeb" и выберите "New > JSP".
Откроется мастер "New JSP
File". Введите имя файла helloView.
jsp
и
открывается в редакторе.
Hello
, и измените
выходное сообщение для получения helloMessage
объекта
ModelandView
, созданного в HelloController
. <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Hello</title> </head> <body> <h1>${helloMessage}</h1> </body>
nameView
.
nameView.jsp
. <%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>При этом импортируется библиотека тегов Spring, содержащая полезные теги для реализации представлений как страниц JSP.
<title>
и
<h1>
на Enter Your Name
.
<h1>
введите следующий код: <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:bind
путь к компоненту становится
равным name.value
. Как уже указывалось, имя команды
HelloController
— name
. Поэтому этот путь ссылается
на свойство value
компонента name
в контексте
страницы.
index.htm
, что в соответствии с разделом
Выполнение схемы проекта,
перенаправляется на WEB-INF/jsp/index.jsp
. Можно указать точку
входа для проекта после его развертывания и запуска. В окне "Проекты" щелкните
правой кнопкой мыши узел проекта и выберите "Свойства". Открывается диалоговое
окно "Свойства проекта". В области "Категории" выберите "Выполнить". В поле
"Относительный URL-адрес" введите /hello.htm
и нажмите кнопку
"ОК". 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
. Для них
требуется явное отображение.
hello.htm
как nameView
проекта: 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, не связанных с веб.
Для ознакомления с другими связанными учебными курсами обратитесь к следующим материалам: