| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <meta name="description" content="A brief guide to creating a web application |
| using the Struts framework in NetBeans IDE"> |
| |
| <meta name="keywords" content="NetBeans, IDE, integrated development environment, |
| Struts, web framework, open source"> |
| |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| <link rel="stylesheet" type="text/css" href="../../../lytebox.css" media="screen"> |
| <script type="text/javascript" src="../../../images_www/js/lytebox-compressed.js"></script> |
| |
| <title>Введение в веб-платформу Struts - учебный курс по IDE NetBeans</title> |
| </head> |
| |
| <body> |
| |
| <!-- Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved. --> |
| |
| <h1>Введение в веб-платформу Struts</h1> |
| |
| <p>Этот документ содержит пошаговое описание основ использования IDE NetBeans для разработки веб-приложений с помощью веб-платформы Struts. Struts — это платформа с открытым исходным кодом, которая расширяет интерфейс API сервлетов Java и использует архитектуру "Модель-представление-контроллер" (MVC). Она позволяет создавать поддерживаемые, расширяемые и гибкие веб-приложения, основанные на стандартных технологиях, таких как страницы JSP, компоненты JavaBeans, пакеты ресурсов и XML.</p> |
| |
| <p>Данный курс призван научить сборке простого приложения MVC, которое отображает страницу ввода имени пользователя и возвращает страницу успешного входа после проверки правильности введенных данных. Вы изучите несколько основных функций, которые предлагает платформа Struts, а также способы внедрения этих функций с помощью среды IDE. В частности, будут использованы теги Struts на страницах JSP, данные пользователей будут поддерживаться компонентом Struts <code>ActionForm</code>, а логика пересылки будет реализована с помощью объекта Struts <code>Action</code>. Кроме того, будет показано, как внедрять в приложение простую проверку правильности, в том числе вывод предупреждения при неудачной попытке входа в систему.</p> |
| |
| <p>Более подробное введение в платформу Struts приведено в статье <a href="http://struts.apache.org/struts-action/faqs/works.html">Как работает Struts?</a> на официальном веб-сайте <a href="http://struts.apache.org/">Struts</a>. Также можно воспользоваться поиском по указателю документации Javadoc среды IDE (Справка > Поиск в документации Javadoc по указателю) для просмотра <a href="http://struts.apache.org/release/1.3.x/apidocs/index.html">интерфейса API платформы Struts</a>, который поставляется вместе с библиотеками Struts.</p> |
| |
| <p><strong>Содержание</strong></p> |
| |
| <img alt="Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0" class="stamp" src="../../../images_www/articles/73/netbeans-stamp-80-74-73.png" title="Содержимое этой страницы применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0"> |
| |
| <ul class="toc"> |
| <li><a href="#overview">Обзор приложения</a></li> |
| <li><a href="#set">Настройка приложения Struts</a></li> |
| <li><a href="#jsp">Создание страниц JSP</a> |
| <ul> |
| <li><a href="#login">Создание страницы входа</a></li> |
| <li><a href="#success">Создание страницы успешного входа</a></li> |
| </ul></li> |
| <li><a href="#actionForm">Создание компонента <code>ActionForm</code></a></li> |
| <li><a href="#actionClass">Создание класса<code>Action</code></a></li> |
| <li><a href="#validate">Внедрение проверки правильности</a> |
| <ul> |
| <li><a href="#beanData">Доступ к данным компонента и подготовка условий пересылки</a></li> |
| <li><a href="#errorMsg">Настройка сообщения об ошибке</a></li> |
| </ul></li> |
| <li><a href="#forward">Добавление записей <code>forward</code> к файлу <code>struts-config.xml</code></a></li> |
| <li><a href="#configure">Настройка и выполнение приложения</a> |
| <ul> |
| <li><a href="#welcome">Настройка страницы приветствия</a></li> |
| <li><a href="#style">Присоединение таблицы стилей</a></li> |
| <li><a href="#run">Выполнение приложения</a></li> |
| </ul></li> |
| <li><a href="#seeAlso">Дополнительные сведения</a></li> |
| </ul> |
| |
| <p><strong>Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные ниже.</strong></p> |
| |
| <table> |
| <tbody> |
| <tr> |
| <th class="tblheader" scope="col">Программное обеспечение или материал</th> |
| <th class="tblheader" scope="col">Требуемая версия</th> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">IDE NetBeans</a></td> |
| <td class="tbltd1">7.2, 7.3, 7.4, 8.0, Java EE</td> |
| </tr> |
| <tr> |
| <td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Комплект для разработчика на языке Java (JDK)</a></td> |
| <td class="tbltd1">7 или 8</td> |
| </tr> |
| <tr> |
| <td class="tbltd1">Сервер GlassFish <br><em class="indent margin-around">или</em> <br>Контейнер сервлетов Tomcat</td> |
| <td class="tbltd1">Open Source Edition 3.x или 4.0 <br><em class="margin-around indent"> </em> <br>версия 7.x или 8.x</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p><strong class="notes">Примечания:</strong></p> |
| |
| <ul> |
| <li>Установка среды IDE для Java позволяет при желании установить сервер GlassFish и контейнер сервлетов Apache Tomcat. Необходимо установить один из них (или зарегистрировать другой сервер в среде IDE), чтобы работать далее с этим учебным курсом.</li> |
| <li>Если необходимо сравнить проект с работающим решением, можно <a href="https://netbeans.org/projects/samples/downloads/download/Samples%252FJava%2520Web%252FMyStrutsApp.zip">загрузить демонстрационное приложение</a>.</li> |
| </ul> |
| |
| <a name="overview"></a> |
| <h2>Обзор приложения</h2> |
| |
| <p>При использовании Struts платформа предоставляет сервлет контроллера <code>ActionServlet</code>, который определяется в библиотеках Struts, входящих в среду IDE, и который автоматически регистрируется в дескрипторе развертывания <code>web.xml</code>, как <a href="#controllerServlet">указано ниже</a>. Сервлет контроллера использует файл <code>struts-config.xml</code> для сопоставления входящих запросов с объектами Struts <code>Action</code> и использования любых объектов <code>ActionForm</code>, связанных с действием для временного хранения данных формы. Объект действия <code>Action</code> обрабатывает запросы с помощью метода <code>execute</code>, используя данные, хранящиеся в компоненте формы. После обработки запроса объектом действия <code>Action</code> объект обрабатывает запрос, сохраняет любые новые данные (например, в форме компонента или в отдельном компоненте результата) и пересылает результат в соответствующее представление.</p> |
| |
| <div class="indent"> |
| <img alt="Последовательность действий Struts" class="margin-around" src="../../../images_www/articles/72/web/struts/workflow.png" title="Последовательность действий Struts"> |
| </div> |
| |
| <p>Разработка приложения Struts схожа с разработкой любого другого типа веб-приложений в IDE NetBeans. Однако можно дополнить набор инструментов веб-разработки, воспользовавшись поддержкой платформы Struts в среде IDE. Например, можно использовать шаблоны в среде IDE для создания объектов действия <code>Action</code> Struts и компонентов <code>ActionForm</code>. При создании среда IDE автоматически регистрирует эти классы в файле <code>struts-config.xml</code> и позволяет пользователю расширить этот файл без особых усилий с помощью элементов контекстного меню редактора исходного кода. Поскольку многие веб-приложения используют для представления страницы JSP, платформа Struts также предоставляет пользовательские библиотеки тегов, которые облегчают взаимодействие с формами HTML. В редакторе исходного кода среды IDE можно вызывать автозавершение кода и поддержку Javadoc, что помогает эффективно работать с такими библиотеками.</p> |
| |
| <p>В следующих действиях показано, как создать простую форму, собирающую данные пользователя, выполняющую простую проверку правильности и выводящую данные на страницу успешного входа.</p> |
| |
| <a name="set"></a> |
| <h2>Настройка приложения Struts</h2> |
| |
| <p>В среде IDE приложение Struts является всего лишь обычным веб-приложением, которое сопровождается библиотеками Struts и файлами настройки. Приложение Struts создается точно так же, как и любые другие веб-приложения в среде IDE — с помощью мастера "Создать веб-приложение" с указанием в дополнительном действии, что в приложение нужно включить библиотеки Struts и файлы настройки.</p> |
| |
| <ol> |
| <li>Выберите "Файл > Новый проект" (CTRL+SHIFT+N; &#8984+SHIFT+N в Mac ОС) в главном меню. В списке 'Категории' выберите Java Web, затем выберите 'Веб-приложение' в списке проектов. Нажмите кнопку "Далее".</li> |
| <li>На панели выбора имени и расположения в поле "Имя проекта" введите <code>MyStrutsApp</code> и нажмите кнопку "Далее".</li> |
| <li>На панели "Сервер и параметры" выберите сервер, на котором нужно развернуть приложение. В списке представлены только те серверы, которые зарегистрированы в среде IDE. (Чтобы зарегистрировать сервер, нажмите кнопку "Добавить" рядом с раскрывающимся списком серверов.) Кроме того, обратите внимание, что контекстный путь к вашему развернутому приложению становится вида <code>/MyStrutsApp</code>. Нажмите кнопку "Далее".</li> |
| <li>На панели 'Платформы' выберите 'Struts'. <br> <img alt="Параметр Struts отображается на панели 'Платформы' мастера создания веб-приложений" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/new-project-wizard.png" title="Параметр Struts отображается на панели 'Платформы' мастера создания веб-приложений"> |
| |
| <p>Поскольку это учебный проект, не меняйте никакие значения в нижней части панели. В мастере отображаются следующие параметры конфигурации.</p> |
| |
| <ul> |
| <li><strong>Имя сервлета действия</strong>: Имя сервлета действия Struts, который используется в приложении. Дескриптор развертывания <code>web.xml</code> содержит запись для сервлета действия и указывает соответствующие параметры Struts, например, путь к классу сервлетов в библиотеке Struts и к файлу настройки <code>struts-config.xml</code> в приложении.</li> |
| <li><strong>Шаблон URL-адреса действия </strong>: Указывает шаблоны входящих запросов, которые сопоставляются с контроллером действий Struts. Так создается запись сопоставления в дескрипторе развертывания. По умолчанию сопоставляется только шаблон <code>*.do</code>.</li> |
| <li><strong>Ресурс приложения</strong>: Позволяет указать набор ресурсов, который будет использоваться в файле <code>struts-config.xml</code> для локализации сообщений. По умолчанию это <code>com.myapp.struts.ApplicationResource</code>.</li> |
| <li><strong>Добавить файлы TLD Struts </strong>: Позволяет создавать дескрипторы библиотеки тегов для библиотек тегов Struts. Дескриптор библиотеки тегов -- это документ XML, содержащий дополнительные сведения обо всей библиотеке тегов, а также о каждом отдельном теге. В целом это не является необходимым, поскольку можно сослаться на оперативные идентификаторы URI, а не на локальные файлы TLD.</li> |
| </ul></li> |
| |
| <li>Нажмите кнопку "Завершить". Среда IDE создает папку проекта в вашей файловой системе. Как и в случае любого веб-приложения в среде IDE, папка проекта содержит все исходные коды и метаданные проекта среды IDE, например сценарий сборки Ant. Однако у веб-приложения, кроме того, в пути к классам есть все библиотеки Struts. Они не только есть в пути к классам приложения, но они также входят в проект и будут пакетированы с ним позднее при сборке проекта.</li> |
| </ol> |
| |
| <p>Проект откроется в среде IDE. Окно "Проекты" является основной точкой входа исходных файлов проекта. Показано логическое представление важного содержимого проекта. Например, если раскрыть несколько узлов в новом проекте, они могут выглядеть следующим образом:</p> |
| |
| <div class="indent"> |
| <img alt="В окне 'Проекты' содержится новый созданный проект" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/proj-window-init.png" title="В окне 'Проекты' отображается проект MyStrutsApp"> |
| </div> |
| |
| <p><strong class="notes">Примечание. </strong>Используйте окно 'Файлы' (Window> 'Файлы'), чтобы просмотреть все содержимое проекта в представлении на основе каталогов.</p> |
| |
| <p><a name="controllerServlet"></a>Файлы настройки Struts, а также дескриптор развертывания приложения удобно расположены в папке файлов настройки. Откройте дескриптор развертывания (двойным щелчком узла файла <code>web.xml</code>, чтобы отобразить его в редакторе исходного кода). Для выполнения обработки в среде Struts для сервлета контроллера Struts предусмотрено сопоставление.</p> |
| |
| <pre class="examplecode"> |
| <servlet> |
| <servlet-name>action</servlet-name> |
| <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> |
| <init-param> |
| <param-name>config</param-name> |
| <param-value>/WEB-INF/struts-config.xml</param-value> |
| </init-param> |
| <init-param> |
| <param-name>debug</param-name> |
| <param-value>2</param-value> |
| </init-param> |
| <init-param> |
| <param-name>detail</param-name> |
| <param-value>2</param-value> |
| </init-param> |
| <load-on-startup>2</load-on-startup> |
| </servlet> |
| <servlet-mapping> |
| <servlet-name>action</servlet-name> |
| <url-pattern>*.do</url-pattern> |
| </servlet-mapping></pre> |
| |
| <p>В приведенном выше примере контроллер Struts называется <code>action</code> и определяется в библиотеке Struts (<code>org.apache.struts.action.ActionServlet</code>). Он настроен на обработку всех запросов, которые удовлетворяют сопоставлению <code>*.do</code>. Кроме того, параметры инициализации сервлета указаны с помощью файла <code>struts-config.xml</code>, который также содержится в папке <code>WEB-INF</code>.</p> |
| |
| <a name="jsp"></a> |
| <h2>Создание страниц JSP</h2> |
| |
| <p>Для начала создайте две страницы JSP для приложения. Первая отображает форму. Вторая — это представление, которое возвращается при успешном входе в систему.</p> |
| |
| <ul> |
| <li><a href="#login">Создание страницы входа</a></li> |
| <li><a href="#success">Создание страницы успешного входа</a></li> |
| </ul> |
| |
| <div class="indent"> |
| <a name="login"></a> |
| <h3>Создание страницы входа в систему</h3> |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши узел проекта <code>MyStrutsApp</code>, выберите пункт "Создать" > "JSP" и назовите новый файл <code>login</code> Нажмите кнопку "Завершить". Файл <code>login.jsp</code> откроется в редакторе исходного кода.</li> |
| <li>В редакторе исходного кода измените содержимое тегов <code><title></code> и <code><h1></code> (или <code><h2></code>, в зависимости от используемой версии среды IDE) на <code>Форма входа в систему</code>.</li> |
| <li>Добавьте следующие две директивы библиотеки тегов к началу файла: |
| |
| <pre class="examplecode"> |
| <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> |
| <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %></pre> |
| |
| <p>Многие веб-приложения используют страницы JSP для представлений в парадигме MVC, поэтому платформа Struts предоставляет пользовательские библиотеки тегов, которые помогают взаимодействовать с формами HTML. Их можно легко применить к файлу JSP при помощи поддержки автозавершения кода в среде IDE. При вводе текста в редактор исходного кода среда IDE предлагает автозавершение кода для тегов Struts, а также документацию Javadoc по Struts. Автозавершение кода можно также инициировать вручную с помощью сочетания клавиш Ctrl-Space:</p> |
| |
| <img alt="Автозавершение кода и Javadoc для тегов Struts предоставлены в редакторе исходного кода" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/code-completion.png" title="Функция автозавершения кода и Javadoc предоставлены для тегов Struts"> |
| |
| <p>Библиотека тегов компонента <a href="http://struts.apache.org/release/1.3.x/struts-taglib/dev_bean.html">bean taglib</a> содержит различные теги, которые можно использовать при ассоциировании компонента формы (например, компонента <code>ActionForm</code>) с данными, получаемыми с формы. <a href="http://struts.apache.org/release/1.3.x/struts-taglib/dev_html.html">Библиотека тегов html</a> предлагает интерфейс между представлением и другими компонентами, необходимыми в веб-приложении. Например, ниже можно заменить обычные теги HTML <code>form</code> тегами Struts <code><html:form></code>. Благодаря этому, например, сервер ищет или создает объект компонента, соответствующий значению, указанному для элемента <code>action</code> в <code>html:form</code>.</p></li> |
| |
| <li>Ниже тегов <code><h1></code> или <code><h2></code> добавьте следующее: |
| |
| <pre class="examplecode"> |
| <html:form action="/login"> |
| |
| <html:submit value="Login" /> |
| |
| </html:form></pre> |
| |
| <p class="tips">При завершении ввода текста в редакторе исходного кода можно дополнительно упорядочить код, щелкнув правой кнопкой мыши и выбрав 'Формат' (Alt-Shift-F).</p></li> |
| |
| <li>В окне "Палитра" ("Окно" > "Палитра") в правой области среды IDE перетащите элемент "Таблица" из раздела HTML в точку чуть выше строки <code><html:submit value="Login" /></code>. Отобразится диалоговое окно вставки таблицы. Укажите число строк — <code>3</code>, столбцов — <code>2</code> и оставьте все остальные значения — <code>0</code>. Позднее в этом учебном курсе вы сможете добавить <a href="#style">таблицу стилей</a> для изменения отображения таблицы. <br> <img alt="Диалоговое окно 'Создать таблицу' отображается в редакторе исходного кода" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/insert-table.png" title="На палитре предоставлено диалоговое окно для простых в использовании шаблонов кода"> <br> Нажмите кнопку "ОК", а затем при желании переформатируйте код (Alt-Shift-F). Форма в файле <code>login.jsp</code> теперь выглядит таким образом: |
| |
| <pre class="examplecode"> |
| <html:form action="/login"> |
| <table border="0"> |
| <thead> |
| <tr> |
| <th></th> |
| <th></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td></td> |
| <td></td> |
| </tr> |
| <tr> |
| <td></td> |
| <td></td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <html:submit value="Login" /> |
| |
| </html:form></pre> |
| |
| <p><strong class="notes">Примечание. </strong>Строку таблицы <code><thead></code> можно безопасно удалить, поскольку она не используется в этом учебном курсе.</p></li> |
| |
| <li>В первой строке таблицы введите следующее (изменения указаны <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <tr> |
| <td><strong>Enter your name:</strong></td> |
| <td><strong><html:text property="name" /></strong></td> |
| </tr></pre></li> |
| |
| <li>Во второй строке таблицы введите следующее (изменения указаны <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <tr> |
| <td><strong>Enter your email:</strong></td> |
| <td><strong><html:text property="email" /></strong></td> |
| </tr></pre> |
| |
| Элемент <code>html:text</code> позволяет соотносить поля ввода из формы со свойствами в компоненте формы, который будет создан на следующем шаге. Так, например, значение элемента <code>property</code> должно соответствовать полю, объявленному в компоненте формы, связанном с этой формой.</li> |
| |
| <li>Переместите элемент <html:submit value="Login" /> во второй столбец третьей строки таблицы, чтобы третья строка таблицы выглядела следующим образом (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <tr> |
| <td></td> |
| <td><strong><html:submit value="Login" /></strong></td> |
| </tr></pre> |
| </li> |
| </ol> |
| |
| <p>На этом этапе форма входа в систему должна выглядеть следующим образом:</p> |
| |
| <pre class="examplecode"> |
| <html:form action="/login"> |
| <table border="0"> |
| <tbody> |
| <tr> |
| <td>Enter your name:</td> |
| <td><html:text property="name" /></td> |
| </tr> |
| <tr> |
| <td>Enter your email:</td> |
| <td><html:text property="email" /></td> |
| </tr> |
| <tr> |
| <td></td> |
| <td><html:submit value="Login" /></td> |
| </tr> |
| </tbody> |
| </table> |
| </html:form></pre> |
| |
| <a name="success"></a> |
| <h3>Создание страницы успешного входа</h3> |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши узел проекта <code>MyStrutsApp</code>, выберите пункт "Создать" > "JSP" и назовите новый файл <code>success</code>. В поле "Папка" щелкните соответствующую кнопку "Обзор" и выберите в диалоговом окне пункт <code>WEB-INF</code>. Нажмите кнопку "Выбрать папку", чтобы в поле "Папка" появилось значение WEB-INF. Любые файлы, содержащиеся в папке WEB-INF, не доступны напрямую для клиентских запросов. Чтобы файл <code>success.jsp</code> отображался надлежащим образом, он должен содержать обработанные данные. Нажмите кнопку "Завершить".</li> |
| <li>В редакторе исходного кода измените содержание вновь созданной страницы на следующее: |
| |
| <pre class="examplecode"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>Login Success</title> |
| </head> |
| <body> |
| <h1>Congratulations!</h1> |
| |
| <p>You have successfully logged in.</p> |
| |
| <p>Your name is: .</p> |
| |
| <p>Your email address is: .</p> |
| </body></pre></li> |
| |
| <li>Добавьте директиву <a href="http://struts.apache.org/release/1.3.x/struts-taglib/dev_bean.html">bean taglib</a> к верхней части файла: |
| |
| <pre class="examplecode"> |
| <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> |
| </pre></li> |
| <li>Добавьте следующие теги <code><bean:write></code> (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <p>Your name is: <strong><bean:write name="LoginForm" property="name" /></strong>.</p> |
| |
| <p>Your email address is: <strong><bean:write name="LoginForm" property="email" /></strong>.</p> |
| </pre> |
| |
| Задействовав теги <code><bean:write></code>, вы используете библиотеку тегов компонента для поиска компонента <code>ActionForm</code>, который нужно создать, и для отображения данных пользователя, сохраненных в <code>name</code> и <code>email</code>.</li> |
| </ol> |
| </div> |
| |
| <a name="actionForm"></a> |
| <h2>Создание компонента <code>ActionForm</code></h2> |
| |
| <p>Компонент Struts <code>ActionForm</code> используется для сохранения данных между запросами. Например, если пользователь отправляет форму, то данные временно сохраняются в компоненте формы, чтобы они могли быть либо заново отображены в странице формы (если данные введены в неправильном формате или если вход в систему выполнен неуспешно) или отображаются на странице успешного входа в систему (если данные проходят проверку правильности).</p> |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши проект <code>MyStrutsApp</code> и выберите пункт "Создать" > "Другое". В разделе "Категории" выберите пункт Struts, а затем в поле "Типы файлов" выберите "Компонент Struts ActionForm". Нажмите кнопку "Далее".</li> |
| <li>Введите <code>LoginForm</code> в поле имени класса. Затем выберите <code>com.myapp.struts</code> в раскрывающемся списке "Пакет" и нажмите кнопку "Готово". |
| |
| <p> |
| Среда IDE создает компонент <code>LoginForm</code> и открывает его в редакторе исходного кода. По умолчанию среда IDE создает его со строкой <code>String</code> с именем <code>name</code> и целым числом <code>int</code> с именем <code>number</code>. Для обоих полей есть определенные методы доступа. Также среда IDE добавляет объявление компонента к файлу <code>struts-config.xml</code>. Если открыть файл <code>struts-config.xml</code> в редакторе исходного кода, то можно увидеть следующее объявление, добавленное мастером:</p> |
| |
| <pre class="examplecode"> |
| <form-beans> |
| <strong><form-bean name="LoginForm" type="com.myapp.struts.LoginForm" /></strong> |
| </form-beans> |
| </pre> |
| |
| <p>Среда IDE обеспечивает поддержку переходов в файле <code>struts-config.xml</code>. Удерживая клавишу Ctrl, наведите указатель мыши на полное имя класса компонента <code>LoginForm</code>. Имя становится ссылкой, что позволяет перейти прямо к классу в редакторе исходного кода.</p> |
| |
| <img alt="Поддержка переходов отображается в файле конфигурации Struts" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/navigation-support.png" title="Поддержка переходов предоставлена в struts-config.xml"></li> |
| |
| <li>В компоненте <code>LoginForm</code> в редакторе исходного кода создайте поля и сопутствующие методы доступа, соответствующие полям текстового ввода <code>name</code> и <code>email</code>, созданным в файле <code>login.jsp</code>. Поскольку поле <code>name</code> уже создано в скелете <code>LoginForm</code>, нужно реализовать только поле <code>email</code>. |
| |
| <p> |
| Добавьте следующее объявление ниже поля <code>name</code> (изменения выделены <strong>жирным шрифтом</strong>):</p> |
| |
| <pre class="examplecode"> |
| private String name; |
| <strong>private String email;</strong></pre> |
| |
| <a name="accessors"></a> |
| <p>Чтобы создать методы доступа, наведите курсор на <code>email</code> и нажмите сочетание клавиш Alt-Insert.</p> |
| |
| <img alt="Меню 'Вставить код' отображается в редакторе исходного кода" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/create-accessors.png" title="Меню 'Вставить код' отображается при нажатии Ctrl-I в редакторе исходного кода"> |
| |
| <p> |
| Выберите пункт "Методы получения и установки", а затем в появившемся диалоговом окне выберите <code>email : String</code> и нажмите кнопку "Создать". Для поля <code>email</code> создаются методы доступа.</p> |
| |
| <p class="notes"><strong>Примечание </strong>. Можно удалить методы declaration и accessor для <code>number</code>, поскольку они не используются в этом учебном курсе.</p></li> |
| </ol> |
| |
| <a name="actionClass"></a> |
| <h2>Создание класса действия <code>Action</code></h2> |
| |
| <p>Класс действия <code>Action</code> содержит бизнес-логику в приложении. При получении данных из формы именно метод <code>execute</code> в объекте <code>Action</code> обрабатывает данные и определяет, в какое представление переслать обработанные данные. Поскольку класс <code>Action</code> входит в состав платформы Struts, IDE NetBeans содержит мастер.</p> |
| |
| <ol> |
| <li>В окне 'Проекты' щелкните правой кнопкой мыши узел проекта <code>MyStrutsApp</code> и выберите 'Создать' > 'Другие'. Из категории Struts выберите пункт Struts Action и нажмите кнопку "Далее".</li> |
| <li>На панели "Имя и расположение" измените имя на <code>LoginAction</code>.</li> |
| <li>Выберите <code>com.myapp.struts</code> в раскрывающемся списке "Пакет".</li> |
| <li>Введите <code>/login</code> в пути действия. Значение должно соответствовать значению, указанному для атрибута <code>action</code> в тегах <code><html:form></code> в файле <code>login.jsp</code>. Выставьте параметры, как указано на снимке экрана ниже, а затем нажмите кнопку "Далее". <br> <img alt="Мастер создания действий Struts" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/new-struts-action.png" title="Мастер создания действий Struts"></li> |
| |
| <li>В третьем действии этого мастера предоставляется возможность ассоциировать класс <code>Action</code> с компонентом формы. Обратите внимание, что ранее созданный компонент <code>LoginForm</code> указан как вариант для пункта "Имя компонента ActionForm". Внесите на панель следующие изменения: |
| |
| <ul> |
| <li>Удалите прямую косую черту из поля "Входной ресурс"</li> |
| <li>Укажите область запроса (Сеанс — это область запроса по умолчанию в платформе Struts.)</li> |
| <li>Снимите флажок "Проверить компонент ActionForm"</li> |
| </ul> |
| |
| Нажмите кнопку "Завершить". Создается класс <code>LoginAction</code>, и файл открывается в редакторе исходного кода. Также обратите внимание, что следующая запись <code>action</code> добавляется к файлу <code>struts-config.xml</code>: |
| |
| <pre class="examplecode"> |
| <action-mappings> |
| <strong><action name="LoginForm" path="/login" scope="request" type="com.myapp.struts.LoginAction" validate="false"/></strong> |
| <action path="/Welcome" forward="/welcomeStruts.jsp"/> |
| </action-mappings></pre> |
| |
| Атрибуты <code>name</code> и <code>scope</code> относятся к компоненту формы, связанному с действием. В частности, когда входящий запрос соответствует выражению <code>/login</code>, платформа Struts автоматически создает объект <code>LoginForm</code> и населяет его данными формы, которые были отправлены в запросе. Для <code>validate</code> устанавливается по умолчанию значение <code>true</code>. Благодаря этому платформа вызывает метод <code>validate</code> из компонента формы. Но соответствующий флажок в мастере снят, поскольку в следующем действии будет вручную написан код простой проверки, для которого не требуется метод <code>validate</code>.</li> |
| </ol> |
| |
| <a name="validate"></a> |
| <h2>Реализация проверки правильности</h2> |
| |
| <p>В редакторе исходного кода пройдите по классу <code>LoginAction</code> и посмотрите на метод выполнения <code>execute</code>:</p> |
| |
| <pre class="examplecode"> |
| public ActionForward execute(ActionMapping mapping, ActionForm form, |
| HttpServletRequest request, HttpServletResponse response) |
| throws Exception { |
| |
| return mapping.findForward(SUCCESS); |
| }</pre> |
| |
| <p>Обратите внимание на определение <code>SUCCESS</code>, указанное под объявлением класса <code>LoginAction</code>:</p> |
| |
| <pre class="examplecode">private final static String SUCCESS = "success";</pre> |
| |
| <p>Сейчас метод <code>mapping.findForward</code> настроен на безусловную пересылку любого запроса в представление вывода под названием <code>success</code>. Это не очень желательно, ведь лучше сперва провести некоторую проверку входящих данных, чтобы определить, отправлять ли представление <code>success</code> или какое-то другое представление.</p> |
| |
| <ul> |
| <li><a href="#beanData">Доступ к данным компонента и подготовка условий пересылки</a></li> |
| <li><a href="#errorMsg">Настройка сообщения об ошибке</a></li> |
| </ul> |
| |
| <div class="indent"> |
| <a name="beanData"></a> |
| <h3>Доступ к данным компонента и подготовка условия пересылки</h3> |
| |
| <ol> |
| <li>Введите следующий код в тело метода <code>execute</code>: |
| |
| <pre class="examplecode"> |
| // extract user data |
| LoginForm formBean = (LoginForm)form; |
| String name = formBean.getName(); |
| String email = formBean.getEmail();</pre> |
| |
| Чтобы использовать входящие данные формы, необходимо взять аргумент <code>ActionForm</code> из <code>execute</code>и привести его к <code>LoginForm</code>, затем применить методы получения, которые уже созданы ранее.</li> |
| |
| <li>Введите следующее условие для выполнения проверки входящих данных: |
| |
| <pre class="examplecode"> |
| // perform validation |
| if ((name == null) || // name parameter does not exist |
| email == null || // email parameter does not exist |
| name.equals("") || // name parameter is empty |
| email.indexOf("@") == -1) { // email lacks '@' |
| |
| return mapping.findForward(FAILURE); |
| }</pre> |
| |
| На этом этапе метод <code>execute</code> должен выглядеть так: |
| |
| <pre class="examplecode">public ActionForward execute(ActionMapping mapping, ActionForm form, |
| HttpServletRequest request, HttpServletResponse response) |
| throws Exception { |
| |
| // extract user data |
| LoginForm formBean = (LoginForm) form; |
| String name = formBean.getName(); |
| String email = formBean.getEmail(); |
| |
| // perform validation |
| if ((name == null) || // name parameter does not exist |
| email == null || // email parameter does not exist |
| name.equals("") || // name parameter is empty |
| email.indexOf("@") == -1) { // email lacks '@' |
| |
| return mapping.findForward(FAILURE); |
| } |
| |
| return mapping.findForward(SUCCESS); |
| }</pre></li> |
| |
| <li>Добавьте объявление <code>FAILURE</code> к классу <code>LoginAction</code> (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| private final static String SUCCESS = "success"; |
| <strong>private final static String FAILURE = "failure";</strong> |
| </pre> |
| </li> |
| </ol> |
| |
| <p>Используя вышеуказанную логику, метод <code>execute</code> пересылает запрос в представление <code>success</code>, если пользователь предоставляет данные для полей <code>name</code> и <code>email</code>, а поле электронной почты содержит знак "@". В противном случае пересылается представление <code>failure</code>. Как будет указано ниже в разделе <a href="#forward">Добавление записей <code>forward</code> к <code>struts-config.xml</code></a>, можно указать представление <code>failure</code>, которое будет указывать на страницу формы, чтобы пользователь мог снова ввести данные в правильном формате.</p> |
| |
| <a name="errorMsg"></a> |
| <h3>Настройка сообщения об ошибке</h3> |
| |
| <p>Если возвращается форма входа, то будет полезно сообщить пользователю, что проверка не пройдена. Это можно сделать, добавив поле <code>error</code> к компоненту формы и соответствующий тег <code><bean:write></code> к форме в <code>login.jsp</code>. Наконец, в объекте <code>Action</code> укажите отображение сообщения об ошибке в случае выбора представления <code>failure</code>.</p> |
| |
| <ol> |
| <li>Откройте <code>LoginForm</code> и добавьте к классу поле <code>error</code>: |
| |
| <pre class="examplecode"> |
| // error message |
| private String error;</pre></li> |
| |
| <li>Добавьте методы получения и установки для <code>error</code>, как <a href="#accessors">указано выше</a>.</li> |
| <li>Измените метод установки, чтобы он выглядел следующим образом: |
| |
| <pre class="examplecode"> |
| public void setError() { |
| this.error = |
| "<span style='color:red'>Please provide valid entries for both fields</span>"; |
| } |
| </pre></li> |
| <li>Откройте <code>login.jsp</code> и внесите следующие изменения: |
| |
| <pre class="examplecode"> |
| <html:form action="/login"> |
| <table border="0"> |
| <tbody> |
| <strong><tr> |
| <td colspan="2"> |
| <bean:write name="LoginForm" property="error" filter="false"/> |
| &nbsp;</td> |
| </tr></strong> |
| <tr> |
| <td>Enter your name:</td> |
| <td><html:text property="name" /></td> |
| </tr> |
| </pre></li> |
| |
| <li>В <code>LoginAction</code> в рамках блока <code>if</code> добавьте оператор, устанавливающий сообщение об ошибке, перед пересылкой условия <code>failure</code> (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| if ((name == null) || // name parameter does not exist |
| email == null || // email parameter does not exist |
| name.equals("") || // name parameter is empty |
| email.indexOf("@") == -1) { // email lacks '@' |
| |
| <strong>formBean.setError();</strong> |
| return mapping.findForward(FAILURE); |
| } |
| </pre></li> |
| </ol> |
| |
| <p>Завершенный класс <code>LoginAction</code> должен теперь выглядеть следующим образом:</p> |
| |
| <pre class="examplecode"> |
| public class LoginAction extends org.apache.struts.action.Action { |
| |
| private final static String SUCCESS = "success"; |
| private final static String FAILURE = "failure"; |
| |
| public ActionForward execute(ActionMapping mapping, ActionForm form, |
| HttpServletRequest request, HttpServletResponse response) |
| throws Exception { |
| |
| // extract user data |
| LoginForm formBean = (LoginForm)form; |
| String name = formBean.getName(); |
| String email = formBean.getEmail(); |
| |
| // perform validation |
| if ((name == null) || // name parameter does not exist |
| email == null || // email parameter does not exist |
| name.equals("") || // name parameter is empty |
| email.indexOf("@") == -1) { // email lacks '@' |
| |
| formBean.setError(); |
| return mapping.findForward(FAILURE); |
| } |
| |
| return mapping.findForward(SUCCESS); |
| |
| } |
| } |
| </pre> |
| </div> |
| |
| <a name="forward"></a> |
| <h2>Добавление записей <code>forward</code> к <code>struts-config.xml</code></h2> |
| |
| <p>Чтобы приложение соответствовало страницам JSP с условиями пересылки, возвращенными методом исполнения <code>LoginAction</code> <code>execute</code>, необходимо добавить записи <code>forward</code> к файлу <code>struts-config.xml</code>.</p> |
| |
| <ol> |
| <li>Откройте <code>struts-config.xml</code> в редакторе исходного кода, щелкните правой кнопкой мыши в любом местоположении в записи <code>action</code> для <code>LoginForm</code> и выберите Struts > 'Добавить Forward'. <br> <img alt="Параметры Struts отображаются в контекстном меню struts-config.xml" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/add-forward.png" title="Щелкните правой кнопкой мыши и выберите Struts > 'Добавить Forward'"></li> |
| |
| <li>В диалоговом окне "Добавить Forward" введите <code>success</code> в поле "Имя пересылку". Укажите путь к файлу <code>success.jsp</code> в поле файла ресурсов (напр., <code>/WEB-INF/success.jsp</code>). Диалоговое окно должно теперь выглядеть следующим образом: <br> <img alt="Диалоговое окно &quot;Добавление Forward&quot;." class="margin-around b-all" src="../../../images_www/articles/72/web/struts/add-forward-dialog.png" title="В диалоговом окне 'Добавить Forward' создается запись Forward в struts-config.xml"> <br> Нажмите кнопку "Add". Обратите внимание, что следующая запись <code>forward</code> была добавлена к файлу <code>struts-config.xml</code> (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <action name="LoginForm" path="/login" scope="request" type="com.myapp.struts.LoginAction" validate="false"> |
| <strong><forward name="success" path="/WEB-INF/success.jsp"/></strong> |
| </action> |
| </pre></li> |
| |
| <li>Выполните такое же действие, чтобы добавить запись пересылки для <code>failure</code>. Укажите в пути к файлу ресурсов <code>/login.jsp</code>. Следующая запись <code>forward</code> добавляется к файлу <code>struts-config.xml</code> (изменения выделены <strong>жирным шрифтом</strong>): |
| |
| <pre class="examplecode"> |
| <forward name="success" path="/WEB-INF/success.jsp"/> |
| <strong><forward name="failure" path="/login.jsp"/></strong> |
| </pre> |
| </li> |
| </ol> |
| |
| <a name="configure"></a> |
| <h2>Настройка и выполнение приложения</h2> |
| |
| <p>Среда IDE использует сценарий сборки Ant для сборки и выполнения вашего веб-приложения. Среда IDE создала сценарий сборки при создании проекта на основании параметров, указанных в мастере создания проекта. Перед сборкой и выполнением приложения необходимо указать для приложения точкой входа по умолчанию <code>login.jsp</code>. Можно дополнительно добавить к проекту простую таблицу стилей.</p> |
| |
| <ul> |
| <li><a href="#welcome">Настройка страницы приветствия</a></li> |
| <li><a href="#style">Присоединение таблицы стилей</a></li> |
| <li><a href="#run">Выполнение приложения</a></li> |
| </ul> |
| |
| <a name="welcome"></a> |
| <h3>Настройка страницы приветствия</h3> |
| |
| <ol> |
| <li>В окне 'Проекты' дважды щелкните дескриптор развертывания <code>web.xml</code>. Перечисленные наверху редактора исходного кода вкладки предоставляют интерфейс к файлу <code>web.xml</code>. Щелкните вкладку "Страницы". В поле "Файлы приветствия" введите <code>login.jsp</code>. <br> <img alt="интерфейс дескриптора развертывания" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/welcome-files.png" title="Графический редактор для дескриптора развертывания приложения"> <br> Теперь перейдите на вкладку 'Исходный код' для просмотра файла. Обратите внимание, что <code>login.jsp</code> теперь указан в записи <code>welcome-file</code>: |
| |
| <pre class="examplecode"> |
| <welcome-file>login.jsp</welcome-file> |
| </pre></li> |
| </ol> |
| |
| |
| <a name="style"></a> |
| <h3>Присоединение таблицы стилей</h3> |
| |
| <ol> |
| <li>Добавьте к проекту простую таблицу стилей. Это можно легко сделать, сохранив <a href="https://netbeans.org/files/documents/4/2228/stylesheet.css">этот пример таблицы стилей</a> на компьютер. Скопируйте файл (Ctrl-C), а затем в среде IDE выберите узел веб-страницы в окне "Проекты" и нажмите Ctrl-V). Файл добавляется к вашему проекту.</li> |
| <li>Свяжите таблицу стилей со страницами JSP, добавив ссылку между тегами <code><head></code> как в <code>login.jsp</code>, так и в <code>success.jsp</code>: |
| |
| |
| <pre class="examplecode"> |
| <link rel="stylesheet" type="text/css" href="stylesheet.css"> |
| </pre></li> |
| </ol> |
| |
| <a name="run"></a> |
| <h3>Запуск приложения</h3> |
| |
| <ol> |
| <li>В окне "Проекты" щелкните правой кнопкой мыши узел проекта и выберите команду "Выполнить". Среда IDE собирает веб-приложение и развертывает его, используя сервер, указанный при создании проекта Страница <code>login.jsp</code> будет открыта и отображена в браузере. Введите какие-то данные, которые должны не пройти проверку, например, оставьте одно поле пустым или введите адрес электронной почты без знака "@": <br> <img alt="login.jsp отображается в браузере с образцами данных" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/login-form.png" title="Форма содержит данные, которые не пройдут проверку правильности"> <br><br> При нажатии кнопки "Вход" страница формы входа отображается заново и содержит сообщение об ошибке: <br> <img alt="login.jsp отображается с сообщением об ошибке" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/login-form-error.png" title="Форма повторно отображается с сообщением об ошибке"> <br><br> Попробуйте ввести данные, которые должны пройти проверку. После нажатия кнопки "Вход" вы видите страницу успешного входа: <br> <img alt="Отображается success.jsp, на которой отображаются входные данные" class="margin-around b-all" src="../../../images_www/articles/72/web/struts/success-page.png" title="Отображается страница успешного завершения, на которой отображаются входные данные"> |
| </li> |
| </ol> |
| |
| <div class="feedback-box"> |
| <a href="/about/contact_form.html?to=3&subject=Feedback:%20Introduction%20to%20Struts">Мы ждем ваших отзывов</a></div> |
| |
| <br style="clear:both;"> |
| |
| <a name="seeAlso"></a> |
| <h2>Дополнительные сведения</h2> |
| |
| <p>На этом завершается введение в платформу Struts в IDE NetBeans. В этом документе описывается создание простого веб-приложения MVC в IDE NetBeans с помощью платформы Struts и описывается интерфейс IDE для разработки веб-приложений. Было показано, как использовать теги Struts на страницах JSP, временно хранить данные пользователя в компоненте Struts <code>ActionForm</code> и внедрять логику пересылки с помощью объекта действия Struts <code>Action</code>. Кроме того, будет показано, как внедрять в приложение простую проверку правильности, в том числе вывод предупреждения при неудачной попытке входа в систему.</p> |
| |
| <p>Учебные курсы на смежные темы приведены в следующих материалах: </p> |
| |
| <ul> |
| <li><a href="framework-adding-support.html">Добавление поддержки веб-платформы</a>. В общем руководстве описывается добавления поддержки веб-платформ к IDE NetBeans с помощью диспетчера подключаемых модулей.</li> |
| <li><a href="quickstart-webapps-spring.html">Введение в веб-платформу Spring</a>. Описываются основы использования IDE NetBeans для разработки веб-приложений с помощью платформы Spring.</li> |
| <li><a href="jsf20-intro.html">Введение в JavaServer Faces 2.0</a>. Документ с описанием способов присоединения управляемого компонента к веб-страницам и использования преимуществ шаблонов Facelets.</li> |
| </ul> |
| |
| </body> |
| </html> |