| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <!-- |
| Copyright (c) 2009, 2010, 2014, Oracle and/or its affiliates. All rights reserved. |
| --> |
| |
| <html> |
| <head> |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> |
| <meta name="description" content="A short guide to creating and using web |
| applications in NetBeans IDE."> |
| |
| <meta name="keywords" content="NetBeans, IDE, integrated development environment, |
| web applications, open source, JSP, JavaServer Pages, JavaBeans"> |
| |
| <link rel="stylesheet" type="text/css" href="../../../netbeans.css"> |
| <script type="text/javascript" src="../../../images_www/js/window_opener.js"></script> |
| |
| <title>Введение в разработку веб-приложений - учебный курс по IDE NetBeans</title> |
| </head> |
| |
| <body> |
| <h1>Введение в разработку веб-приложений</h1> |
| |
| <p>В этой документации содержится пошаговое описание основ использования IDE NetBeans для разработки веб-приложений. Также здесь рассматриваются способы создания простого веб-приложения, его развертывания на сервере и просмотра в браузере. В этом приложении будет создана страница <a href="http://www.oracle.com/technetwork/java/javaee/jsp/index.html">JavaServer Pages</a>(tm) (JSP) с запросом на ввод имени пользователя. Для сохранения введенного имени во время сеанса HTTP и повторения имени на другой странице JSP будет использоваться компонент JavaBeans.</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="#setting">Настройка проекта веб-приложения</a></li> |
| <li><a href="#creating">Создание и изменение исходных файлов веб-приложения</a> |
| <ul> |
| <li><a href="#creatingJava">Создание пакета Java и исходного файла Java</a></li> |
| <li><a href="#generating">Создание методов получения и установки</a></li> |
| <li><a href="#editing">Изменение файла JavaServer Pages по умолчанию</a></li> |
| <li><a href="#creatingJSP">Создание файлов JavaServer Pages</a></li> |
| </ul></li> |
| <li><a href="#building">Выполнение проекта веб-приложения</a></li> |
| <li><a href="#trouble">Устранение проблем</a></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 Server Open Source Edition <br><em class="indent margin-around">или</em> <br>Контейнер сервлетов Tomcat <br> <em class="indent margin-around">или</em> <br> Сервер Oracle Web Logic </td> |
| <td class="tbltd1" valign="top">4.x <br> <em class="margin-around indent"> </em> <br>7.x или 8.x<br> <br>11gR1 (10.3.3) или более поздние версии</td> |
| </tr> |
| </tbody> |
| </table> |
| |
| <p><strong>Примечания</strong></p> |
| |
| <ul> |
| <li>Установка Java EE (но не Java SE!) позволяет, при желании, установить сервер GlassFish и контейнер сервлетов Apache Tomcat.</li> |
| |
| <li>Если вы хотите сравнить проект с рабочим решением, можно <a href="https://netbeans.org/projects/samples/downloads/download/Samples/Java%20Web/HelloWebEE6.zip">загрузить демонстрационное приложение</a>.</li> |
| </ul> |
| |
| <a name="setting"></a> |
| <h2>Настройка проекта веб-приложения</h2> |
| |
| <ol> |
| <li>Выберите в главном меню "Файл" > "Новый проект" (CTRL+SHIFT+N). В области "Категории" выберите "Java Web". В области "Projects" (Проекты) выберите "Web Application" (Веб-приложение) и нажмите кнопку "Next" (Далее).</li> |
| <li>В экране 2 введите <tt>HelloWeb</tt> в текстовом поле "Project Name" (Имя проекта). </li> |
| <li>В поле "Project Location" укажите любой каталог на компьютере. В данном учебном курсе этот каталог будет называться <tt><i>$PROJECTHOME</i></tt>. </li> |
| <li>Установите флажок "Использовать отдельную папку для хранения библиотек" и укажите местоположение папки библиотек (необязательно). Дополнительные сведения об этой функции см. в разделе <a href="http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG366">Создание проектов Java</a> в документе <em>Разработка приложений в IDE NetBeans</em></li> |
| |
| <li>Нажмите кнопку "Далее". Откроется панель сервера и параметров настройки. Выберите версию Java EE, которую требуется использовать для приложения. </li> |
| <li>Выберите сервер, на котором требуется выполнить развертывание приложения. В списке представлены только те серверы, которые зарегистрированы в среде IDE. Обратите внимание, что для поля "Context Path" (например, на сервере) устанавливается значение <tt>/HelloWeb</tt> в основе которого находится имя проекта, указанное при выполнении предыдущего действия. |
| </li> |
| <li>Нажмите кнопку "Готово". |
| <p>В среде IDE будет создана папка проекта <tt><i>$PROJECTHOME</i>/HelloWeb</tt>. Структуру файлов проекта можно просмотреть в окне "Files" (Ctrl+2), а его логическую структуру – в окне "Projects" (Ctrl+1). </p> |
| <img alt="Логическая структура проекта HelloWeb отображается в окне 'Проекты'" class="margin-around" src="../../../images_www/articles/72/web/quickstart-web/projects-window.png"> |
| </li> |
| </ol> |
| <p>Папка проекта содержит все исходные файлы и метаданные проекта, например сценарий сборки Ant. После этого проект "HelloWeb" откроется в среде IDE. В главном окне редактора исходного кода откроется страница приветствия <tt>index.jsp</tt>. </p> |
| <p class="notes"><strong>Примечание.</strong> В зависимости от версий сервера и Java EE, указанных при создании проекта, IDE может создать страницу <tt>index.html</tt> в качестве стандартной страницы приветствия для веб-проекта. Вы можете следовать инструкциям этого руководства и использовать файл <tt>index.html</tt> либо создать файл <tt>index.jsp</tt>, который будет использоваться в качестве страницы приветствия, в мастере создания файлов. В последнем случае необходимо удалить файл <tt>index.html</tt>.</p> |
| |
| |
| <a name="creating"></a> |
| <h2>Создание и изменение исходных файлов веб-приложения</h2> |
| |
| <p>Наиболее важной функцией среды IDE является создание и изменение исходных файлов. Именно эти операции при разработке чаще всего отнимают наибольшее количество времени. Среда IDE предоставляет широкий спектр средств, подходящих под личный стиль любого разработчика — как сторонника кодирования вручную, так и разработчика, предпочитающего предоставить среде IDE создание крупных блоков кода.</p> |
| |
| <div class="indent"> |
| <a name="creatingJava"></a> |
| <h3>Создание пакета Java и исходного файла Java</h3> |
| |
| <ol> |
| <li>В окне 'Проекты' разверните узел 'Исходные пакеты'. Обратите внимание, что узел "Source Packages" содержит только пустой узел пакета по умолчанию.</li> |
| <li>Щелкните узел "Source Packages" правой кнопкой мыши и выберите "New" > "Java Class". Введите <tt>NameHandler</tt> в текстовом поле "Class Name" и <tt>org.mypackage.hello</tt> в поле списка "Package". Нажмите кнопку 'Готово'. Новый файл <tt>NameHandler.java</tt> будет открыт в редакторе исходного кода.</li> |
| <li>Объявите в редакторе исходного кода переменную <tt>String</tt>, введя непосредственно под объявлением класса следующую строку: |
| <pre class="examplecode">String name;</pre></li> |
| <li>Добавьте следующий конструктор к классу: |
| <pre class="examplecode">public NameHandler() { }</pre></li> |
| <li>Добавьте следующую строку в конструктор <tt>NameHandler()</tt>: |
| <pre class="examplecode">name = null;</pre></li> |
| </ol> |
| |
| <a name="generating"></a> |
| <h3>Создание методов получения и установки</h3> |
| |
| <ol> |
| <li>Щелкните правой кнопкой мыши поле <tt>name</tt> в редакторе исходного кода и выберите "Refactor" > "Encapsulate Fields". |
| <p>Откроется диалоговое окно "Encapsulate Fields", в котором имеется поле <tt>name</tt>. Обратите внимание, что для параметра "Visibility" (Видимость) полей по умолчанию установлено значение "private" (закрытый), а для средств доступа – значение "public" (общедоступный); в результате модификатор доступа для объявления переменной класса будет определен как "private", в то время как методы получения и установки будут созданы с модификаторами <tt>public</tt> и <tt>private</tt>, соответственно.</p> |
| <img alt="Диалоговое окно инкапсуляции полей" class="margin-around b-all" src="../../../images_www/articles/72/web/quickstart-web/encapsulatefields-dialog.png"></li> |
| <li>Нажмите кнопку "Refactor" (Реорганизация). |
| <p>Для поля <tt>name</tt> создаются методы получения и установки. Модификатор для переменной класса определяется как <tt>private</tt>, в то время как методы получения и установки создаются с модификаторами "public". Класс Java должен теперь выглядеть следующим образом.</p> |
| |
| <pre class="examplecode">package org.mypackage.hello; |
| |
| /** |
| * |
| * @author nbuser |
| */ |
| |
| public class NameHandler { |
| |
| private String name; |
| |
| /** Creates a new instance of NameHandler */ |
| public NameHandler() { |
| name = null; |
| } |
| |
| public String getName() { |
| return name; |
| } |
| |
| public void setName(String name) { |
| this.name = name; |
| } |
| |
| }</pre> |
| </li> |
| </ol> |
| |
| <a name="editing"></a> |
| <h3>Изменение файла JavaServer Pages по умолчанию</h3> |
| |
| <ol> |
| <li>Активируйте файл <tt>index.jsp</tt>, перейдя на вкладку, отображаемую в верхней части редактора исходного кода.</li> |
| <li><p>В палитре (Ctrl+Shift+8), расположенной справа от редактора исходного кода, разверните узел "HTML Forms" и перетащите элемент "Form" в позицию, находящуюся в редакторе исходного кода непосредственно после тегов <tt><h1></tt>. </p> |
| <p> Появится диалоговое окно "Insert Form".</p></li> |
| |
| |
| <li> Установите следующие значения: |
| <ul> |
| <li><strong>Action:</strong> response.jsp; |
| <li><strong>Method:</strong> GET; |
| <li><strong>Name:</strong> Name Input Form. |
| </ul> |
| <p>Нажмите кнопку "ОК". К файлу <tt>index.jsp</tt> добавляется форма HTML.</p> |
| <img alt="Диалоговое окно 'Конфигурация'" src="../../../images_www/articles/72/web/quickstart-web/input-form.png"></li> |
| <li>Перетащите элемент "Text Input" в позицию непосредственно перед тегом <tt></form></tt>, затем установите следующие значения: |
| |
| <ul> |
| <li><strong>Name:</strong> name; |
| <li><strong>Type:</strong> text. |
| </ul> |
| |
| Нажмите кнопку "ОК". Между тегами <tt><form></tt> будет добавлен тег HTML <tt><input></tt>. Удалите атрибут <tt>value</tt> из данного тега.</li> |
| |
| <li>Перетащите элемент "Button" в позицию непосредственно перед тегом <tt></form></tt>. Установите следующие значения: |
| |
| <ul> |
| <li><strong>Label:</strong> OK; |
| <li><strong>Type:</strong> submit. |
| </ul> |
| |
| Нажмите кнопку "ОК". Между тегами <tt><form></tt> будет добавлена кнопка HTML.</li> |
| |
| <li>Введите <tt>Enter your name:</tt> непосредственно перед первым тегом <tt><input></tt>, затем измените текст по умолчанию <tt>Hello World!</tt>, расположенный между тегами <tt><h1></tt>, на <tt>Entry Form</tt>.</li> |
| |
| <li>Щелкните правой кнопкой мыши область редактора исходного кода и выберите "Format" (Alt+Shift+F) для переформатирования кода. Файл <tt>index.jsp</tt> должен теперь выглядеть следующим образом: |
| |
| <pre class="examplecode"><html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <title>JSP Page</title> |
| </head> |
| <body> |
| <h1>Entry Form</h1> |
| |
| <form name="Name Input Form" action="response.jsp"> |
| Enter your name: |
| <input type="text" name="name" /> |
| <input type="submit" value="OK" /> |
| </form> |
| </body> |
| </html></pre> |
| </li> |
| </ol> |
| |
| <a name="creatingJSP"></a> |
| <h3>Создание файлов JavaServer Pages</h3> |
| |
| <ol> |
| <li>В окне 'Проекты', щелкните правой кнопкой мыши узел проекта HelloWeb и выберите 'Создать' > JSP. Откроется мастер "New JSP File". Назовите файл <tt>response</tt> и нажмите кнопку "Finish". Обратите внимание на то, что узел файла <tt>response.jsp</tt> отображается в окне "Projects" под файлом <tt>index.jsp</tt>, а новый файл открывается в редакторе исходного кода.</li> |
| <li> |
| <p>На палитре справа от редактора исходного кода разверните узел "JSP" и поместите элемент "Use Bean" непосредственно под тегом <tt><body></tt> в редакторе исходного кода. Откроется диалоговое окно "Insert Use Bean". Укажите значения, как показано на следующем рисунке.</p> |
| |
| |
| <img alt="Диалоговое окно 'Использование компонентов Bean', содержащее определенные поля" class="margin-around" src="../../../images_www/articles/72/web/quickstart-web/usebean-dialog.png"> |
| |
| <ul> |
| <li><strong>ID:</strong> mybean; |
| <li><strong>Class: </strong>org.mypackage.hello.NameHandler; |
| <li><strong>Scope:</strong> session. |
| </ul> |
| |
| Нажмите кнопку "ОК". Обратите внимание на то, что под тегом <tt><body></tt> добавляется тег <tt><jsp:useBean></tt>.</li> |
| |
| <li>Перетащите элемент "Set Bean Property" из палитры и поместите его непосредственно перед тегом <tt><h1></tt>. Нажмите кнопку "OК". В появившемся теге <tt><jsp:setProperty></tt> удалите пустой атрибут <tt>value</tt> и измените его следующим образом: Eсли средой IDE был создан атрибут <tt>value = ""</tt>, удалите его. В противном случае значение <tt>name</tt>, введенное в форме <tt>index.jsp</tt>, будет перезаписано. |
| |
| <pre class="examplecode"><jsp:setProperty name="mybean" property="name" /></pre> |
| |
| <p>Как указано в </p>документации <tt><jsp:setProperty></tt>, значение свойства можно задать различными способами. В этом случае вводимые пользователем данные из <tt>index.jsp</tt> становятся парой имя/значение, передаваемой в объект <tt>request</tt>. При установке свойства с помощью тега <tt><jsp:setProperty></tt> можно указать значение в соответствии с именем свойства, содержащегося в объекте <tt>request</tt>. Поэтому при определении <tt>property</tt> в качестве <tt>name</tt> можно получить значение, указанное пользователем при вводе.</p></li> |
| |
| <li>Измените текст между тегами <h1> следующим образом: |
| <pre class="examplecode"><h1>Hello, !</h1></pre> |
| </li> |
| <li>Перетащите элемент "Get Bean Property" из палитры в позицию непосредственно после запятой между тегами <tt><h1></tt>. Укажите следующие значения в диалоговом окне "Insert Get Bean Property": |
| |
| <ul> |
| <li><strong>Bean Name: </strong>mybean; |
| <li><strong>Property Name: </strong>name. |
| </ul> |
| |
| <p>Нажмите кнопку "ОК". Обратите внимание на то, что между тегами <tt><h1></tt> появился тег <tt><jsp:getProperty></tt>.</p> |
| <p class="alert"><b>Обратите внимание:</b> имена Property нужно вводить с учетом регистра. Свойство "name" должно быть в одном регистре как в <tt>response.jsp</tt>, так и в форме ввода <tt>index.jsp</tt>. |
| </li> |
| |
| <li>Щелкните правой кнопкой мыши область редактора исходного кода и выберите "Format" (Alt+Shift+F) для переформатирования кода. Теперь теги <tt><body></tt> файла <tt>response.jsp</tt> должны выглядеть следующим образом: |
| |
| <pre class="examplecode"><body> |
| <jsp:useBean id="mybean" scope="session" class="org.mypackage.hello.NameHandler" /> |
| <jsp:setProperty name="mybean" property="name" /> |
| <h1>Hello, <jsp:getProperty name="mybean" property="name" />!</h1> |
| </body></pre> |
| </li> |
| </ol> |
| </div> |
| |
| <a name="building"></a> |
| <h2>Выполнение проекта веб-приложения</h2> |
| |
| <p>Для сборки и выполнения веб-приложений в среде IDE используется сценарий сборки Ant. IDE создаст сценарий сборки на основе параметров, указанных в мастере создания новых проектов, а также проектов в диалоговом окне 'Свойства проектов' (в окне 'Проекты' выберите 'Свойства' в меню правой кнопки мыши узла проекта).</p> |
| |
| <ol> |
| <li> |
| <p>В окне 'Проекты' щелкните правой кнопкой мыши узел проекта HelloWeb и выберите 'Выполнить' (F6). При выполнении веб-приложения среда IDE выполнит следующие действия:</p> |
| <ul> |
| <li>Сборка и компиляция кода приложения (см. примечание ниже). Это действие можно выполнить отдельно от прочих, выбрав Build ("Сборка") или Clean and Build ("Очистка и сборка") из контекстного меню узла проекта.</li> |
| <li>Запуск сервера.</li> |
| <li>Развертывание приложения на сервере. Это действие можно выполнить отдельно от прочих, выбрав Deploy ("Развертывание") из контекстного меню узла проекта.</li> |
| <li>Отображение приложения в окне браузера.</li> |
| </ul> |
| <p class="notes"><b>Примечание.</b> По умолчанию, проект создается с включенной функцией 'Компилировать при сохранении', так что не нужно сначала компилировать код. </p> |
| </li> |
| |
| <li> |
| <p>Среда IDE откроет окно 'Результаты', в котором отображается ход выполнения приложения. Взгляните на вкладку HelloWeb в окне вывода. В этой вкладке можно проследить все действия, выполняемые средой IDE. При наличии проблемы IDE отображает информацию об ошибке в этом окне.</p> |
| <img alt="Окно "Результаты" IDE NetBeans для запуска приложения Hello Web" class="margin-around b-all" src="../../../images_www/articles/72/web/quickstart-web/app-output-tab.png"></li> |
| <li>Среда IDE открывает окно 'Результаты', которое показывает состояние сервера. Взгляните на вкладку в окне вывода с именем сервера. |
| <p class="alert"><b>Обратите внимание.</b> Если сервер GlassFish не запускается, запустите его вручную и после этого выполните проект снова. Сервер можно запустить вручную из окна 'Службы', щелкнув правой кнопкой мыши узел сервера и выбрав 'Пуск'.</p> |
| <p class="tips">Окно 'Результаты' для сервера отображает полезную информацию о проблемах при выполнении веб-приложений. Также могут быть полезны журналы сервера. Они расположены в каталоге соответствующего домена сервера. Также можно сделать видимым журнал среды IDЕ, выбрав View ("Представление") > IDE log ("Журнал IDE") и просмотреть его.</p> |
| <img alt="Окно "Результаты" в IDE NetBeans для сервера GlassFish 3 при запуске приложения Hello Web" class="margin-around b-all" src="../../../images_www/articles/72/web/quickstart-web/gf-output-tab.png"> |
| </li> |
| <li> |
| <p>Страница <tt>index.jsp</tt> откроется в браузере по умолчанию. Обратите внимание, что окно браузера может открыться до отображения выходных данных сервера средой IDE.</p> |
| |
| <img alt="Файл index.jsp отображается в браузере" border="1" class="margin-around" src="../../../images_www/articles/72/web/quickstart-web/result1.png"></li> |
| <li><p>Введите имя в текстовом поле и нажмите кнопку "OК". На экране появится страница <tt>response.jsp</tt> с простым приветствием.</p> |
| |
| |
| <img alt="Файл response.jsp отображается в браузере" border="1" class="margin-around" src="../../../images_www/articles/72/web/quickstart-web/result2.png"></li> |
| </ol> |
| |
| <a name="trouble"></a> |
| <h2>Устранение проблем</h2> |
| |
| <p><em>Я создал и запустил проект. При нажатии кнопки "OК" для <tt>index.jsp</tt> на экране появляется страница ошибки, указывающая на то, что файл <tt>response.jsp</tt> недоступен.</em></p> |
| |
| <div class="indent"> |
| <p>Откройте окно 'Результаты' в IDE (Ctrl-4) на вкладке 'Проекты' или на вкладке 'Серверы'. Какие сообщения об ошибках там отображаются? Какой JDK используется в вашем проекте? Какой сервер? Для JDK 7 требуется GlassFish 3.x или Tomcat 7.x. Щелкните правой кнопкой мыши узел проекта в окне 'Проекты' и выберите 'Свойства'. JDK находится в категории 'Библиотеки' в поле 'Платформа Java'. Версию сервера можно посмотреть в категории 'Выполнить'. Наконец, загрузите <a href="https://netbeans.org/projects/samples/downloads/download/Samples/Java%20Web/HelloWebEE6.zip"> демонстрационный проект</a> и сравните его с собственным.</p> |
| </div> |
| <p><em>Я собрал и выполнил проект, но имя не выводится на экран, отображается только "Привет, !"</em></p> |
| <div class="indent"> |
| <p>В теге <jsp:setProperty> содержится атрибут <tt>value = ""</tt>? Он перезаписывает значение, введенное в форме <tt>index.jsp</tt>, и заменяет его пустой строкой. Удалите атрибут <tt>value</tt>.</p></div> |
| <p><em>Я собрал и выполнил проект, но получаю "Hello, null!"</em></p> |
| <div class="indent"> |
| <p>В первую очередь проверьте окна выходных данных среды IDE как для приложения, так и для сервера, а также журнал сервера. Работает ли сервер? Было ли развернуто приложение? Если сервер работает и приложение было развернуто, возникает ли <tt>org.apache.jasper.JasperException: java.lang.NullPointerException?</tt> Это обычно означает, что значение в коде неправильно инициализировано. В рамках данного курса это, вероятно, указывает на наличие ошибки где-то в имени свойства в файлах JSP. Помните, что для имен свойств важен регистр!</p> |
| </div> |
| |
| <div class="feedback-box"> |
| <a href="/about/contact_form.html?to=3&subject=Feedback:%20Introduction%20to%20Developing%20Web%20Applications">Отправить отзыв по этому учебному курсу</a></div> |
| |
| <br style="clear:both;"> |
| |
| <a name="seeAlso"></a> |
| <h2>Дополнительные сведения</h2> |
| |
| <p>Это заключительный раздел учебного курса "Введение в разработку веб-приложений". В этом документе описывается создание простого веб-приложения с помощью IDE NetBeans, его развертывание на сервере и просмотр его представления в браузере. В нем также рассматривается использование технологий JavaServer Pages и JavaBeans в приложении для сбора, сохранения и вывода пользовательских данных.</p> |
| |
| <p>Дополнительные и более детальные сведения о разработке веб-приложений в IDE NetBeans см. в следующих ресурсах:</p> |
| |
| <ul> |
| |
| <li><a href="quickstart-webapps-struts.html">Введение в веб-платформу Struts</a>. Описываются основы использования IDE NetBeans для разработки веб-приложений с помощью платформы Struts.</li> |
| <li><a href="../../trails/java-ee.html">Учебная карта по Java EE и Java Web</a></li> |
| </ul> |
| |
| </body> |
| </html> |