// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Введение в веб-модель MVC Spring
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Введение в веб-модель MVC Spring - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Введение в веб-модель MVC Spring

В этом документе показано создание простого веб-приложения link:http://www.oracle.com/technetwork/articles/javase/index-142890.html[+MVC+] с помощью link:http://www.springframework.org/[+платформы Spring+]. В приложении пользователь может ввести свое имя в текстовом поле, и после нажатия кнопки "ОК" это имя отображается на второй странице вместе с приветствием.

Платформа Spring – популярная платформа приложений с открытым кодом, предназначенная для упрощения разработки для J2EE. Она состоит из контейнера, платформы управления элементами и набора интегрируемых служб для веб-интерфейсов пользователя, транзакций и сохранения состояния. В состав платформы Spring входит Spring Web MVC – расширяемая платформа MVC для создания веб-приложений.

В IDE реализована встроенная поддержка платформ Spring 4.x и 3.x. Библиотеки платформ упакованы в IDE и автоматически добавляются в путь к классу при выборе платформы. Предоставляются параметры настройки, например название и сопоставление Spring Web MVC `DispatcherServlet`. При создании проекта можно зарегистрировать библиотеку JSTL. Также предоставляется поддержка файлов настройки XML компонента, в том числе следующие функциональные возможности:

* *Автозавершение кода*. Вызывается в файлах настройки XML Spring для классов Java и ссылок на компоненты.
* *Переходы*. Гиперссылки на классы Java и свойства, указанные в определениях компонентов Spring, а также гиперссылки на описания других компонентов.
* *Реорганизация кода*. Переименование ссылок на классы Java в файлах настройки XML Spring.

Для получения дополнительных сведений об платформе Spring посетите веб-сайт link:http://www.springsource.org/[+http://www.springsource.org/+]. Более подробное пояснение поведения артефактов платформы Spring и их взаимодействия с другими объектами в приложении приведено на официальном сайтеlink:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/[+Spring Framework Reference Documentation+] и в документации link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/[+Spring Framework API+].


image::images/netbeans-stamp-80-74-73.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"]


*Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные ниже.*

|===
|Программное обеспечение или материал |Требуемая версия 

|link:https://netbeans.org/downloads/index.html[+IDE NetBeans+] |7.2, 7.3, 7.4, 8.0, Java EE 

|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Комплект для разработчика на языке Java (JDK)+] |версия 7 или 8 

|link:http://glassfish.dev.java.net/public/downloadsindex.html[+Сервер GlassFish+] |3.x, 4.x 
|===

*Примечания:*

* При установке среды IDE Java позволяет дополнительно установить сервер GlassFish и зарегистрировать его в среде IDE.
* Если необходимо сравнить проект с работающим решением, можно link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FHelloSpring69.zip[+загрузить демонстрационное приложение+].


[[setting]]
== Создание проекта с поддержкой веб-модели MVC Spring

* <<creating,Создание схемы проекта с поддержкой веб-модели MVC Spring>>
* <<running,Выполнение схемы проекта>>


[[creating]]
=== Создание схемы проекта с поддержкой веб-модели MVC Spring

Начните с создания проекта веб-приложения с поддержкой платформы Spring.

1. Выберите New Project ("Создать проект") (Ctrl-Shift-N; &amp;#8984-Shift-N на Mac) из меню File ("Файл") среды IDE. Выберите категорию "Java Web", затем выберите проект "Веб-приложение". Нажмите кнопку "Далее".
2. В поле "Имя проекта" введите *HelloSpring*. Нажмите кнопку "Далее".
3. На третьем экране "Сервер и параметры настройки" отключите параметр "Enable Contexts and Dependency Injection", поскольку в данном учебном курсе не используется спецификация link:http://jcp.org/en/jsr/detail?id=299[+JSR-299+].
4. Убедитесь, что в разворачивающемся списке 'Сервер' выбран сервер GlassFish. Нажмите кнопку "Далее".

Версия Java EE зависит от версии выбранного сервера. Если выбран сервер GlassFish Server 4.0, в качестве версии Java EE по умолчанию указывается Java EE 7 Web.


[start=5]
. На четвертом экране мастера на панели "Frameworks" выберите "Spring Web MVC".

[start=6]
. Выберите *Spring Framework 3.x* в списке "Библиотека Spring". 

image::images/frameworks-window.png[title="Spring Web MVC отображается на панели палтформы"]

Обратите внимание, что IDE позволяет добавить библиотеку Spring 4.x в проект, но в данном учебном курсе используется компонент SimpleFormController, не поддерживаемый на платформе Spring 4.x. Кроме того, если выбран вариант Spring Web MVC, следует помнить, что во время создания проекта в путь к классу по умолчанию добавляется библиотека JSTL (JavaServer Pages Standard Tag Library). Отключите этот параметр (как показано на снимке экрана), поскольку в этом учебном курсе не требуется JSTL.


[start=7]
. Выберите вкладку "Настройка" и обратите внимание, что в мастере можно настроить имя и отображение сервлета обработчика Spring. 

image::images/spring-configuration.png[title="Укажите имя и сопоставление сервлета Spring Dispatcher на вкладке 'Конфигурация'"]

[start=8]
. Нажмите кнопку "Завершить". В результате создается проект для всего приложения, в т.ч. все метаданные, а также сценарий сборки проекта Ant, с которым можно ознакомиться в окне "Файлы" (сочетание клавиш CTRL+2; &amp;#8984+2 в Mac OS). Структуру шаблона можно просмотреть в окне "Проекты" (сочетание клавиш CTRL+1; &amp;#8984+1 в Mac OS). Также следует отметить, что по умолчанию в редакторе среды IDE открываются четыре файла: `dispatcher-servlet.xml`, `applicationContext.xml`, `redirect.jsp` и `index.jsp`.

[start=9]
. В окне 'Проекты' разверните узел 'Библиотеки' нового проекта и обратите внимание, что файлы JAR Spring включены в путь к классу проекта. 

image::images/spring-libraries.png[title="Файлы JAR Spring указаны в узле 'Библиотеки' проекта"]


[[running]]
=== Выполнение схемы проекта

Перед изменением файлов проекта следует попытаться запустить созданный проект в среде IDE:

1. Нажмите кнопку 'Запустить проект' (image:images/run-project-btn.png[]) на главной панели инструментов IDE. В среде IDE автоматически запускается сервер GlassFish, если он не был запущен, проект компилируется и развертывается на сервере. Обратите внимание на данные, отображаемые в окне "Вывод" среды IDE (сочетание клавиш CTRL+4; &amp;#8984+4 в Mac OS). В конце этих данных отображается сообщение `BUILD SUCCESSFUL`. 

image::images/output.png[title="В окне вывода отображаются сведения при запуске проекта"] 

В среде IDE запускается браузер по умолчанию, и отображается содержимое представления страницы приветствия (`/WEB-INF/jsp/index.jsp`). 

image::images/browser-output.png[title="Выходные данные страницы приветствия отображаются в браузере"]

При выполнении проекта в среде IDE он компилируется и развертывается на сервере, а затем открывается в браузере по умолчанию. Более того, среда IDE предоставляет возможность "Развертывание при сохранении", которая включена по умолчанию для веб-проектов. При сохранении файлов в редакторе проект автоматически компилируется и развертывается на сервере. Для просмотра изменений достаточно просто обновить страницу в браузере.

Ключ к пониманию произошедших событий представлен в дескрипторе развертывания проекта (`web.xml`). Чтобы открыть этот файл в редакторе исходного кода щелкните правой кнопкой мыши узел `WEB-INF` > `web.xml` в окне 'Проекты' и выберите 'Правка'. Точка входа для приложения по умолчанию — `redirect.jsp`:


[source,xml]
----

<welcome-file-list>
    <welcome-file>redirect.jsp</welcome-file>
</welcome-file-list>
----

В файле `redirect.jsp` содержится оператор перенаправления, направляющий все запросы в `index.htm`:


[source,java]
----

<% response.sendRedirect("index.htm"); %>
----

Обратите внимание, что в дескрипторе развертывания все шаблоны URL-адресов, соответствующие выражению `*.htm` отображаются на link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/DispatcherServlet.html[+`DispatcherServlet`+] Spring.


[source,xml]
----

<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.1.1.RELEASE.jar`, затем разверните его и найдите `org.springframework.web.servlet` > `DispatcherServlet`.

`DispatcherServlet` обрабатывает входящие запросы на основе параметров настройки из файла `dispatcher-servlet.xml`. Откройте файл `dispatcher-servlet.xml`, щелкнув его вкладку в редакторе. Обратите внимание на следующий код.


[source,xml]
----

<bean id="urlMapping" class="org.springframework.web.servlet.handler.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/handler/SimpleUrlHandlerMapping.html[+SimpleUrlHandlerMapping+]">
    <property name="mappings">
        <props>
            <prop key="/index.htm">indexController</prop>
        </props>
    </property>
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/view/InternalResourceViewResolver.html[+InternalResourceViewResolver+]"
      p:prefix="/WEB-INF/jsp/"
      p:suffix=".jsp" />

<bean name="indexController"
      class="org.springframework.web.servlet.mvc.link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html[+ParameterizableViewController+]"
      p:viewName="index" />
----

В этом файле определены три компонента: `indexController`, `viewResolver` и `urlMapping`. Когда `DispatcherServlet` получает запрос, соответствующий выражению `*.htm`, например, `index.htm`, выполняется поиск контроллера внутри `urlMapping`, способного обработать этот запрос. Выше можно заметить, что существует свойство `mappings`, связывающее `/index.htm` с `indexController`.

Среда выполнения выполняет поиск определения компонента `indexController`, предоставляемого схемой проекта. Обратите внимание, что класс `indexController` расширяет класс link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/ParameterizableViewController.html[+`ParameterizableViewController`+]. Это еще один класс инфраструктуры Spring, который просто возвращает представление. Также обратите внимание, что `p:viewName="index"` указывает логическое имя представления, которое разрешается с помощью `viewResolver` путем добавления `/WEB-INF/jsp/` слева и добавления `.jsp` справа. Это позволяет среде выполнения найти файл в папке приложения и предоставить в ответ представление страницы приветствия (`/WEB-INF/jsp/index.jsp`).


[[overview]]
== Обзор приложения

Создаваемое приложение состоит из двух страниц JSP (которые называются _представлениями_ в терминологии link:http://www.oracle.com/technetwork/articles/javase/index-142890.html[+MVC+]). Первое представление содержит форму HTML с полем, в которое пользователь вводит свое имя. Второе представление — страница, на которой отображается приветственное сообщение с именем пользователя.

Представления управляются _контроллером_, который получает запросы к приложению и принимает решение, какие представления вернуть. Также он передает в представления информацию, которая требуется для их отображения (она называется _моделью_). Контроллер этого приложения называется `HelloController`.

В сложном веб-приложении бизнес-логика не размещается непосредственно в контроллере. Вместо этого контроллером используется другой объект — _служба_ — при каждом обращении к бизнес-логике. В этом приложении бизнес-логика ограничена обработкой приветственного сообщения, и для этой цели создается служба `HelloService`. 


== Реализация службы

Теперь, после проверки правильности настроек среды, можно начать расширение схемы проекта в соответствии с имеющимися требованиями. Начните с создания класса `HelloService`.

1. Нажмите кнопку 'Создать файл' (image:images/new-file-btn.png[]) на панели инструментов IDE. (В качестве альтернативы нажмите Ctrl-N; ⌘-N в Mac.)
2. Выберите категорию *Java*, затем *Класс Java* и нажмите кнопку "Далее".
3. В мастере создания класса Java введите имя класса *HelloService*, затем введите имя пакета *service*, чтобы создать для класса новый пакет.
4. Нажмите кнопку "Завершить". В среде IDE создается и открывается в редакторе новый класс.

Класс `HelloService` предоставляет очень простую службу. Он принимает в качестве параметра имя и подготавливает и возвращает `строку String`, содержащую это имя. Создайте в редакторе следующий метод `sayHello()` для этого класса (изменения помечены *полужирным шрифтом*).


[source,java]
----

public class HelloService {

    *public static String sayHello(String name) {
        return "Hello " + name + "!";
    }*
}
----


[[controller]]
== Реализация контроллера и модели

Для обработки пользовательских данных и выбора представления для возврата можно использовать link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html[+`SimpleFormController`+].

*Примечание: * SimpleFormController устарел в Spring 3.x. Он используется в этом учебном руководстве для выполнения задач демонстрации. Однако следует использовать контроллер с аннотациями вместо файлов XML.

1. Откройте мастер создания файлов, нажав Ctrl-N (⌘-N в Mac). Выберите категорию *Spring Framework* и тип файла *Simple Form Controller*. 

image::images/simple-form-controller.png[title="IDE NetBeans обеспечивает шаблоны для различных артефактов Spring"] 

[tips]#IDE NetBeans обеспечивает шаблоны для различных артефактов Spring, включая файл конфигурации Spring XML, link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/AbstractController.html[+`AbstractController`+] и link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html[+`SimpleFormController`+].#

[start=2]
. Нажмите кнопку "Далее".

[start=3]
. Назовите класс *HelloController* и создайте для него новый пакет, для этого введите в поле "Package" текст *controller*. Нажмите кнопку "Завершить". В среде IDE создается и открывается в редакторе новый класс.

[start=4]
. Укажите свойства контроллера, раскомментировав методы установки, отображаемые шаблоном класса по умолчанию. Чтобы раскомментировать фрагмент кода, выделите его, как показано на рисунке, и нажмите сочетание клавиш CTRL+/ (&amp;#8984+/ в Mac OS). 

image::images/comment-out.png[title="Выделите фрагменты кода, затем нажмите Ctrl-/ для переключения комментариев"] 

[tips]#Нажатие сочетания клавиш CTRL+/ (&amp;#8984+/ в Mac OS) переключает комментарии в редакторе.#

[start=5]
. Внесите следующие изменения (показаны *полужирным шрифтом*).

[source,java]
----

public HelloController() {
    link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandClass(java.lang.Class)[+setCommandClass+](*Name*.class);
    link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/BaseCommandController.html#setCommandName(java.lang.String)[+setCommandName+]("*name*");
    link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setSuccessView(java.lang.String)[+setSuccessView+]("*hello*View");
    link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)[+setFormView+]("*name*View");
}
----

Параметр `FormView` позволяет задать имя представления, используемого для отображения формы. Это страница, содержащая текстовое поле для ввода имени пользователя. Параметр `SuccessView` аналогичным образом позволяет задать имя представления, отображаемого при успешной передаче данных. Параметр `CommandName` задает имя команды в модели. В данном случае, команда — это объект формы со связанными параметрами запроса Параметр `CommandClass` определяет имя класса команды. Экземпляр этого класса заполняется и проверяется на допустимость при каждом запросе.

Обратите внимание, что для `Name` в методе `setCommandClass()` отображается ошибка:

image::images/set-command-class.png[title="Метка ошибки отображается для setCommandClass()"]

Требуется создать класс `Name` в качестве простого компонента, хранящего данные каждого запроса.


[start=6]
. В окне 'Проекты', щелкните правой кнопкой мыши узел проекта и выберите 'Создать' > 'Класс Java'. Отображается мастер создания класса Java.

[start=7]
. Введите имя класса *Name* и выберите в выпадающем списке пакет *controller*.

[start=8]
. Нажмите кнопку "Завершить". Класс `Name` будет создан и открыт в редакторе.

[start=9]
. В классе `Name` создайте поле `value`, затем создайте методы доступа (т.е. методы получения и установки) для этого поля. Сначала объявите поле `value`:

[source,java]
----

public class Name {

    *private String value;*

}
----

Чтобы быстро ввести "`private`", можно ввести "`pr`" и затем нажать клавишу TAB. Автоматически добавляется модификатор доступа "`private`". Это пример использования шаблонов кода редактора. Полный список шаблонов кода можно просмотреть, выбрав в меню "Справка" пункт "Таблица сочетаний клавиш".


 В среде IDE предусмотрена возможность автоматического создания методов доступа. В редакторе щелкните правой кнопкой мыши в `value` и выберите 'Вставить код' (или нажмите Alt-Insert; Ctrl-I в Mac). Во всплывающем меню выберите пункт "Методы получения и установки". 

image::images/generate-code.png[title="Всплывающее меню создания кода позволяет настроить методы доступа"]

[start=10]
. В диалоговом окне выберите параметр `value : String` и нажмите кнопку "ОК". Методы `getValue()` и `setValue()` добавляются к классу `Name`:

[source,java]
----

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}
----

[start=11]
. Нажмите сочетание клавиш CTRL+TAB и выберите `HelloController`, чтобы переключиться обратно к классу `HelloController`. Обратите внимание, что значок ошибки исчез, поскольку класс `Name` теперь существует.

[start=12]
. Удалите метод `doSubmitAction()` и раскомментируйте метод link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/mvc/SimpleFormController.html#setFormView(java.lang.String)[+`onSubmit()`+]. Метод `onSubmit()` позволяет создать собственный `ModelAndView`, что требуется здесь. Внесите следующие изменения:

[source,java]
----

@Override
protected ModelAndView onSubmit(
            HttpServletRequest request,
            HttpServletResponse response,
            Object command,
            BindException errors) 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`.

[start=13]
. Исправьте ошибки импорта, щелкнув правой кнопкой мыши в редакторе и выбрав 'Исправить ошибки' (Ctrl-Shift-I; ⌘-Shift-I в Mac). 

image::images/fix-imports70.png[title="Нажмите Ctrl-Shift-I, чтобы исправить выражения импорта в файле"]

*Примечание.* Убедитесь, что * ``org.springframework.validation.BindException`` * и * ``org.springframework.web.servlet.ModelAndView`` * выбраны в диалоговом окне 'Исправить все выражения импорта'.


[start=14]
. Нажмите кнопку "ОК". В начало файла добавляется следующий оператор импорта:

[source,java]
----

import link:http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/servlet/ModelAndView.html[+org.springframework.web.servlet.ModelAndView+];
----
Как указано в документации API, этот класс "представляет модель и представление, возвращаемые контроллером для разрешения `DispatcherServlet`. Представление может принимать форму имени представления `String`, которое должно быть разрешено объектом `ViewResolver`; в качестве альтернативы объект `View` может быть указан непосредственно. Модель — это объект `Map`, что позволяет использовать несколько объектов, выбираемых по имени." 

Обратите внимание, что на данном этапе исправлены не все ошибки, поскольку класс по-прежнему не может определить класс `HelloService` и использовать его метод `sayHello()`.

[start=15]
. Внутри `HelloController` объявите частное поле `HelloService`:

[source,java]
----

private HelloService helloService;
----
Затем создайте для поля общедоступный метод установки:

[source,java]
----

public void setHelloService(HelloService helloService) {
    this.helloService = helloService;
}
----
Наконец, щелкните правой кнопкой мыши в редакторе и выберите 'Исправить выражения импорта' (Ctrl-Shift-I; ⌘-Shift-I в Mac). В начало файла добавляется следующий оператор импорта:

[source,java]
----

import service.HelloService;
----
Все ошибки исправлены.

[start=16]
. Зарегистрируйте `HelloService` в файле `applicationContext.xml`. Откройте в редакторе файл `applicationContext.xml` и введите следующее определение компонента:

[source,java]
----

<bean name="helloService" class="service.HelloService" />
----
В состав поддержки Spring в среде IDE входит автозавершение кода в файлах настройки XML для классов Java и ссылок на компоненты. Для вызова автозавершения кода нажмите сочетание клавиш CTRL+ПРОБЕЛ в редакторе: 

image::images/code-completion.png[title="Автозавершение кода вызывается при нажатии Ctrl-Space"]

[start=17]
. Зарегистрируйте `HelloController` в файле `dispatcher-servlet.xml`. Откройте в редакторе файл `dispatcher-servlet.xml` и введите следующее определение компонента:

[source,java]
----

<bean class="controller.HelloController" p:helloService-ref="helloService"/>
----


[[view]]
== Реализация представлений

Для реализации представлений в проекте требуется создать две страницы JSP. Первая из них, `nameView.jsp`, служит страницей приветствия и позволяет пользователю ввести имя. На второй, `helloView.jsp`, отображается приветственное сообщение с введенным именем. Сначала создайте `helloView.jsp`.

1. В окне 'Проекты' щелкните правой кнопкой мыши узел WEB-INF > `jsp` и выберите 'Создать' > JSP. Откроется мастер "New JSP File". Введите имя файла *helloView*.
2. Нажмите кнопку "Завершить". Страница JSP создается в папке `jsp` и открывается в редакторе.
3. В редакторе измените заголовок файла на `Hello` и измените выходное сообщение для получения `helloMessage` объекта `ModelandView`, созданного в `HelloController`.

[source,xml]
----

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>*Hello*</title>
</head>
<body>
    <h1>*${helloMessage}*</h1>
</body>

----

[start=4]
. <<create-jsp,Тем же способом>> создайте вторую страницу JSP и назовите ее `nameView`.

[start=5]
. В редакторе добавьте следующее определение библиотеки тегов Spring к `nameView.jsp`.

[source,java]
----

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
----
При этом импортируется link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html[+библиотека тегов Spring+], содержащая полезные теги для реализации представлений как страниц JSP.

[start=6]
. Измените содержимое тегов `<title>` и `<h1>` на `Enter Your Name`.

[start=7]
. После тега `<h1>` введите следующий код:

[source,xml]
----

<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>

----
link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.bind[+spring:bind+] позволяет привязать свойство компонента. Тег привязки обеспечивает состояние и значение привязки, которые используются в качестве имени и значения поля ввода. Таким образом, при передаче формы платформе Spring будет известен способ извлечения переданного значения. Здесь командный класс (`controller.Name`) имеет свойство `value`, поэтому нужно установить `path` равным `value`. 

link:http://static.springframework.org/spring/docs/2.5.x/reference/spring.tld.html#spring.tld.nestedPath[+spring:nestedPath+] позволяет добавить к компоненту слева определенный путь. Поэтому при использовании вместе с `spring:bind` путь к компоненту становится равным `name.value`. Как уже указывалось, имя команды `HelloController` — `name`. Поэтому этот путь ссылается на свойство `value` компонента `name` в контексте страницы.

[start=8]
. Измените относительную точку входа для приложения. В настоящий момент точка входа по-прежнему `index.htm`, что в соответствии с разделом <<running,Выполнение схемы проекта>> перенаправляется на `WEB-INF/jsp/index.jsp`. Можно указать точку входа для проекта после его развертывания и запуска. В окне 'Проекты', щелкните правой кнопкой мыши узел проекта и выберите 'Свойства'. Открывается диалоговое окно "Свойства проекта". В области "Категории" выберите "Выполнить". В поле "Относительный URL-адрес" введите `/hello.htm` и нажмите кнопку "ОК". 

Возникает вопрос: где же располагается отображение `hello.htm` на `HelloController`? Отображение не добавлялось к компоненту `urlMapping`, как в случае страницы приветствия схемы проекта `index.htm`. Такая возможность обеспечивается средствами автоматизации платформы Spring, предоставляемыми следующим определением компонента `dispatcher-servlet.xml`:

[source,java]
----

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
----
Этот компонент отвечает за автоматическое создание отображения URL-адресов для всех зарегистрированных в файле контроллеров. Из полностью определенного имени контроллера (в данном случае `controller.HelloController`) удаляется имя пакета и суффикс `Controller`, и затем результат используется как образец URL-адреса. Таким образом, для `HelloController` создается отображение `hello.htm`. Это средство, однако, не срабатывает для контроллеров, включенных в платформу Spring, например, `ParameterizableViewController`. Для них требуется явное отображение.

[start=9]
. В окне 'Проекты' щелкните правой кнопкой мыши узел проекта и выберите 'Выполнить'. Проект компилируется, развертывается и выполняется. Открывается браузер по умолчанию и отображается `hello.htm` как `nameView` проекта: 

image::images/name-view.png[title="nameView отображается в браузере"] 

Введите имя в текстовом поле и нажмите ENTER. Отображается `helloView` с приветственным сообщением: 

image::images/hello-view.png[title="helloView отображается в браузере"]

link:/about/contact_form.html?to=3&subject=Feedback:%20Introduction%20to%20Spring[+Мы ждем ваших отзывов+]



[[seeAlso]]
== Дополнительные сведения

На этом завершается введение в платформу Spring в IDE NetBeans. В этом документе описывается создание простого веб-приложения MVC в IDE NetBeans с помощью платформы Spring и описывается интерфейс IDE для разработки веб-приложений.

Пользователям рекомендуется продолжить изучение платформы Spring путем изучения других учебных курсов в IDE NetBeans, таких как link:http://sites.google.com/site/springmvcnetbeans/step-by-step/[+Пошаговая разработка приложения MVC платформы Spring с помощью NetBeans и сервера GlassFish+]. Это официальный link:http://static.springframework.org/docs/Spring-MVC-step-by-step/[+учебный курс по платформе Spring+], разработанный Томасом Рисбергом (Thomas Risberg), адаптированный для IDE NetBeans Арулази Дхесиасилан (Arulazi Dhesiaseelan).

Многие возможности модуля Spring среды NetBeans могут применяться и в приложениях платформы Spring, не связанных с Интернетом.

Для ознакомления с другими связанными учебными курсами воспользуйтесь следующими материалами:

* link:../../docs/web/framework-adding-support.html[+Добавление поддержки веб-платформы+]. Базовое руководство, в котором описан процесс добавления поддержки путем установки подключаемого модуля платформы с помощью центра обновления NetBeans.
* link:jsf20-intro.html[+Введение в JavaServer Faces 2.0+]. Показано добавление поддержки JSF 2.0 к существующему проекту, связывание управляемых компонентов и использование шаблонов фейслетов.
