blob: 026412c254c096e025dc960814d5fc25f561caa7 [file] [log] [blame]
//
// 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.
//
= Учебный курс по электронной коммерции в NetBeans. Подготовка представлений страниц и сервлета Controller
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Учебный курс по электронной коммерции в NetBeans. Подготовка представлений страниц и сервлета Controller - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Учебный курс по электронной коммерции в NetBeans. Подготовка представлений страниц и сервлета Controller
1. link:intro.html[+Введение+]
2. link:design.html[+Проектирование приложения+]
3. link:setup-dev-environ.html[+Настройка среды разработки+]
4. link:data-model.html[+Проектирование модели данных+]
5. *Подготовка представлений страниц и сервлета контроллера*
6. link:connect-db.html[+Подключение приложения к базе данных+]
7. link:entity-session.html[+Добавление классов сущностей и сеансных компонентов+]
8. link:manage-sessions.html[+Управление сеансами+]
9. link:transaction.html[+Интеграция транзакционной бизнес-логики+]
10. link:language.html[+Добавление поддержки языков+]
11. link:security.html[+Обеспечение безопасности приложений+]
12. link:test-profile.html[+Тестирование и профилирование+]
13. link:conclusion.html[+Заключение+]
image::../../../../images_www/articles/68/netbeans-stamp-68-69.png[title="Содержимое на этой странице применимо к IDE NetBeans, версиям 6.8 и 6.9"]
В учебном курсе показано создание файлов проекта в среде IDE и рассмотрены некоторые возможности, применяемые при работе с HTML и CSS. После создания необходимых файлов проекта, начните создание внешнего интерфейса приложения. Для этого поместите файлы JSP в нужные позиции в структуре проекта, создайте верхний и нижний колонтитулы, которые будут применяться ко всем представлениям, и создайте сервлет Controller для обработки входящих запросов.
Также в этой главе для приложения будет создан дескриптор веб-развертывания (файл `web.xml`). Дескриптор развертывания может использоваться для указания конфигурационной информации, считываемой сервером при развертывании. Хотя link:http://jcp.org/en/jsr/detail?id=315[+спецификации сервлетов версии 3.0+], включенные в Java EE 6, позволяют использовать аннотации класса вместо XML, дескриптор развертывания, тем не менее, может потребоваться для настройки определенных элементов приложения. В этой главе в частности будут добавлены директивы для определения верхнего и нижнего колонтитулов и указания, к каким файлам они будут применяться.
Одна из целей этого учебного курса создать страницы JSP, соответствующие представлениям, указанным в проекте приложения. В соответствии с link:design.html#mockups[+макетами страниц+] и link:design.html#business[+блок-схемой процесса+], реализация макетов страниц начинается с создания _заполнителей_ всех визуальных и функциональных компонентов. В этом учебном курсе приведено руководство по реализации макета главной страницы. Перечисленные ниже действия можно использовать для создания других страниц по своему усмотрению или можно link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252Fecommerce%252FAffableBean_snapshot1.zip[+загрузить снимок 1 проекта+], на котором представлены макеты всех страниц.
Можно просмотреть интерактивную демонстрацию приложения, которое создается в этом учебном курсе: link:http://dot.netbeans.org:8080/AffableBean/[+Демонстрация приложения электронной коммерции NetBeans+]
|===
|Программное обеспечение или материал |Требуемая версия
|link:https://netbeans.org/downloads/index.html[+IDE NetBeans+] |Набор Java, версия 6.8 или 6.9
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Комплект для разработчика на языке Java (JDK)+] |версия 6
|<<glassFish,Сервер GlassFish>> |v3 или Open Source Edition 3.0.1
|===
*Примечания:*
* The IDE NetBeans requires the Java Development Kit (JDK) to run properly. Если указанные материалы не установлены, JDK следует загрузить и установить в первую очередь.
* The IDE NetBeans Java Bundle includes Java Web and EE technologies, which are required for the application you build in this tutorial.
* The IDE NetBeans Java Bundle also includes the GlassFish server, which you require for this tutorial. Можно link:https://glassfish.dev.java.net/public/downloadsindex.html[+загрузить сервер GlassFish отдельно+], но версия, предоставляемая с NetBeans, имеет преимущество, так как автоматически зарегистрирована в среде IDE.
[[createProjectFiles]]
== Создание файлов проекта
Для создания файлов проекта воспользуйтесь мастером создания файлов среды IDE. Вы можете нажать кнопку 'Создать файл' ( image::images/new-file-btn.png[] ), нажать Ctrl-N (⌘+N в Mac) или в окне 'Проекты' щелкните правой кнопкой мыши узел папку, в которой будет содержаться новый файл, и выберите папку 'Создать' > [тип_файла]. В следующих подразделах будут созданы страницы JSP и таблица стилей проекта.
* <<jsp,Создание страниц JSP>>
* <<css,Создание таблицы стилей>>
[[jsp]]
=== Создание страниц JSP
Начните работу с создания страниц JSP, соответствующих представлениям, отображенным на link:design.html#business[+блок-схеме+].
Страница `index.jsp`, созданная средой IDE, станет главной страницей проекта. Создайте страницы JSP для оставшихся представлений и на время разместите их в корне проекта вместе с `index.jsp`.
1. Для открытия мастера создания файлов нажмите кнопку 'Создать файл' ( image::images/new-file-btn.png[] ).
2. Выберите категорию Web, затем элемент JSP и нажмите кнопку "Далее".
3. Введите имя файла "`category`". Обратите внимание, что в поле "Местоположение" указано значение `Web Pages`, означающее, что файл будет создан в корневом веб-узле проекта. Это соответствует папке проекта `web`, что можно позже проверить в окне "Файлы" среды IDE.
4. Нажмите кнопку "Завершить". В среде IDE создается и открывается в редакторе новая страница JSP.
5. Повторите действия 1 - 4 для создания оставшихся страниц `cart.jsp`, `checkout.jsp` и `confirmation.jsp`.
После завершения окно "Проекты" выглядит следующим образом:
image::images/projects-win-views.png[title="Представления содержатся в папке 'WEB-INF/view/'"]
[[css]]
=== Создание таблицы стилей
Создайте файл CSS, содержащий все стили приложения.
1. В окне 'Проекты' щелкните правой кнопкой мыши узел 'Веб-страницы' и выберите 'Создать' > 'Папка'.
2. В мастере создания новой папки назовите папку "`css`" и нажмите кнопку "Готово".
3. Щелкните правой кнопкой мыши папку `css` и выберите в меню "Создать" пункт "Каскадная таблица стилей". (Если пункта "Каскадная таблица стилей" нет, выберите "Прочее". В мастере создания файлов выберите категорию Web, затем "Каскадная таблица стилей" и нажмите кнопку "Далее".)
4. Назовите таблицу стилей `affablebean` и нажмите кнопку "Готово".
После этого файл `affablebean.css` отображается в окне "Проекты".
image::images/projects-win-css.png[title="В окне "Проекты" отображается новая папка 'css' и таблица стилей"]
[[implementHTML]]
== Создание содержимого HTML и CSS
В этом разделе создаются представления страниц для соответствия предлагаемым link:design.html#mockups[+макетам страниц+]. Они будут основой, к которой можно добавить динамическое содержимое на последующих стадиях разработки. Для этого используются редакторы HTML и CSS среды IDE, а также дополнительные окна поддержки CSS.
*Замечание о совместимости браузеров.*В этом учебном курсе используется браузер Firefox 3 и _не_ гарантируется совместимость разметки страницы с другими современными браузерами. В реальности при работе с технологиями создания внешнего интерфейса (HTML, CSS, JavaScript) необходимо принимать меры для обеспечения корректного отображения веб-страниц во всех версиях браузеров, которые могут использоваться посетителями (как правило, Internet Explorer, Firefox, Safari, Chrome и Opera). При работе в среде IDE можно указать, в каком браузере должно открываться приложение. Выберите в меню "Сервис" пункт "Параметры" Mac OS пункт "Параметры" в меню NetBeans) и под вкладкой "Общее" в окне "Параметры" выберите нужный браузер в выпадающем списке "Веб-браузер". Среда IDE обнаруживает браузеры, установленные в местоположении по умолчанию. Если установленный на компьютере браузер не отображается, нажмите кнопку "Правка" и зарегистрируйте браузер вручную.
Подготовка отображения веб-страниц, как правило, итерационный процесс, при котором требуется постоянная обратная связь с потребителем. Следующие действия демонстрируют средства среды IDE на примере link:design.html#index[+макета главной страницы+].
1. В окне 'Проекты' дважды щелкните `index.jsp`, чтобы открыть его в редакторе.
2. Вначале создайте теги `<div>` для основных областей страницы. Можно создать пять тегов: четыре для основных областей (верхний и нижний колонтитулы, левый и правый столбец) и пятый, содержащий все остальные. Удалите весь текст внутри тегов `<body>` и замените его на следующий. Новый код показан *полужирным шрифтом*.
[source,html]
----
<body>
*<div id="main">
<div id="header">
header
</div>
<div id="indexLeftColumn">
left column
</div>
<div id="indexRightColumn">
right column
</div>
<div id="footer">
footer
</div>
</div>*
</body>
----
[start=3]
. Добавьте ссылку на таблицу стилей в заголовке страницы и измените текст заголовка.
[source,xml]
----
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
*<link rel="stylesheet" type="text/css" href="css/affablebean.css">*
<title>*The Affable Bean*</title>
</head>
----
[start=4]
. Откройте в редакторе таблицу стилей `affablebean.css`. Вначале создайте правила для идентификаторов созданных тегов `<div>`.
* Для указания размеров областей используйте свойства `width` и `height`.
* Чтобы отличать области при просмотре страницы, используйте свойство `background`.
* Для горизонтального центрирования четырех областей на странице, можно добавить параметр `margin: 20px auto` к правилу `body`. (`20px` относится к верхнему и нижнему полю; `auto` создает равные промежутки слева и справа.) Затем добавьте параметр `float: left` к левому и правому столбцу.
* В нижнем колонтитуле требуется параметр `clear: left`, чтобы его верхняя граница отображалась после нижних границ выровненных влево и расположенных выше областей (т.е. левого и правого столбца).
[source,java]
----
body {
font-family: Arial, Helvetica, sans-serif;
width: 850px;
text-align: center;
margin: 20px auto;
}
#main { background: #eee }
#header {
height: 250px;
background: #aaa;
}
#footer {
height: 60px;
clear: left;
background: #aaa;
}
#indexLeftColumn {
height: 400px;
width: 350px;
float: left;
background: #ccc;
}
#indexRightColumn {
height: 400px;
width: 500px;
float: left;
background: #eee;
}
----
[start=5]
. Нажмите кнопку 'Запустить проект' (image::images/run-project-btn.png[]) на главной панели инструментов IDE. Измененные файлы проекта автоматически сохраняются, код Java компилируется, проект упаковывается и развертывается в GlassFish, затем открывается браузер для просмотра текущего состояния страницы приветствия.
image::images/index-page.png[title="Выполните проект для просмотра текущего состояния страниц"]
[start=6]
. Теперь создайте заполнитель для компонентов страницы в каждой из четырех видимых областей. Начните с верхнего колонтитула. Согласно link:design.html#index[+макету страницы приветствия+], верхний колонтитул должен содержать следующие компоненты:
* Логотип
* Текст логотипа
* Корзина покупок (элемент оформления)
* Переключатель языка
Внесите в файл `index.jsp` следующие изменения. Новый код отображается *полужирным шрифтом*.
[source,html]
----
<div id="header">
*<div id="widgetBar">
<div class="headerWidget">
[ language toggle ]
</div>
<div class="headerWidget">
[ shopping cart widget ]
</div>
</div>
<a href="#">
<img src="#" id="logo" alt="Affable Bean logo">
</a>
<img src="#" id="logoText" alt="the affable bean">*
</div>
----
В этом коде элемент `<div id="widgetBar">` будет содержать переключатель языков и корзину покупок.
=== Поддержка правки HTML в среде NetBeans
При работе в редакторе пользуйтесь поддержкой HTML среды IDE. В дополнение к обычной подсветке синтаксиса, позволяющей отличать друг от друга теги, атрибуты, значения атрибутов и текст, существует также много других возможностей.
При вводе тегов и атрибутов можно нажатием комбинации клавиш CTRL+ПРОБЕЛ вызывать автозавершение кода и документацию. Среда IDE отображает список предположений, из которого можно выбрать вариант, а также окно документации с определением выбранного элемента и примерами кода.
image::images/documentation-popup.png[title="Для просмотра окон автозавершения кода и документации нажмите сочетание клавиш CTRL+ПРОБЕЛ."]
При обнаружении ошибок в коде в среде IDE отображаются предупреждения, сообщения об ошибках и, в некоторых случаях, предположения. Предупреждения отображаются желтым цветом, а ошибки красным. Можно навести указатель мыши на выбранную область для просмотра сообщения во всплывающем окне.
image::images/html-hint.png[title="Наведите указатель мыши дляч просмотра подсказки с предупреждением"]
Также доступно множество комбинаций клавиш. Выберите в основном меню "Справка" пункт "Таблица сочетаний клавиш".
[start=7]
. Создайте в таблице стилей правила для новых идентификаторов и классов. После правила `header` добавьте следующие правила. Новый код отображается *полужирным шрифтом*.
[source,java]
----
#header {
height: 250px;
background: #aaa;
}
*#logo {
height: 155px;
width: 155px;
float: left;
margin-left: 30px;
margin-top: -20px;
}
#logoText {
float: left;
margin: 20px 0 0 70px;
/* font styles apply to text within alt tags */
font-family: 'American Typewriter', Courier, monospace;
font-size: 50px;
color: #333;
}
#widgetBar {
height: 50px;
width: 850px;
float: right;
background: #ccc;
}
.headerWidget {
width: 194px;
margin: 20px 2px;
font-size: small;
float: right;
line-height: 25px;
background: #aaa;
}*
----
Для правила `logo` примените свойства `margin-left` и `margin-top` для указания позиции компонента на странице.
Если требуются сведения о свойствах в этом коде, поместите курсор на нужное свойство и нажмите комбинацию клавиш CTRL+ПРОБЕЛ для вызова всплывающего окна с документацией.
image::images/css-doc-support.png[title="Нажмите Ctrl-Space в свойстве CSS для вызова поддержки документации"]
Чтобы увидеть, как свойство действует на страницу, можно закомментировать его и обновить страницу в браузере. Чтобы закомментировать наведите курсор на строку или выделите блок кода, а затем нажмите Ctrl-/ (⌘-/ в Mac).
[start=8]
. Сохраните (Ctrl-S; ⌘-S в Mac) файлы `index.jsp` и `affablebean.css`, затем перейдите к браузеру и обновите страницу для просмотра текущего состояния.
*Примечание.* Служебная программа 'Развертывать при сохранении' в IDE автоматически активируется для веб-проектов Java. Это означает, что при каждом сохранении файла, он автоматически компилируется (если это класс Java или страница JSP), и выполняется упаковывание и развертывание проекта на сервере. Поэтому при внесении изменений в HTML и CSS нет необходимости вручную перезапускать проект для просмотра обновленной версии в браузере. Просто сохраните файлы, перейдите к браузеру и обновите страницу.
image::images/index-page2.png[title="Заполнители для заголовков отображаются при запуске проекта"]
В предыдущих действиях можно уловить закономерность. Для каждой области страницы выполняется три действия.
1. Создание структуры с помощью HTML.
2. Создание набора стилей для определения внешнего вида.
3. Просмотр страницы для анализа результатов этих изменений.
Выполняя эти действия, реализуем компоненты в оставшихся областях.
[start=9]
. Создайте заполнители для компонентов в правом столбце. В соответствии с link:design.html#index[+макетом страницы приветствия+], в правом столбце расположены четыре блока одинакового размера.
Создайте структуру четырех блоков. Вставьте следующий текст между тегами `<div id="indexRightColumn">`. Новый код отображается *полужирным шрифтом*.
[source,html]
----
<div id="indexRightColumn">
*<div class="categoryBox">
<a href="#">
<span class="categoryLabelText">dairy</span>
</a>
</div>
<div class="categoryBox">
<a href="#">
<span class="categoryLabelText">meats</span>
</a>
</div>
<div class="categoryBox">
<a href="#">
<span class="categoryLabelText">bakery</span>
</a>
</div>
<div class="categoryBox">
<a href="#">
<span class="categoryLabelText">fruit &amp; veg</span>
</a>
</div>*
</div>
----
[start=10]
. Добавьте в файл `affablebean.css` правила стилей для новых классов `categoryBox` и `categoryLabelText`. Новый код отображается *полужирным шрифтом*.
[source,java]
----
#indexRightColumn {
height: 400px;
width: 500px;
float: left;
background: #eee;
}
*.categoryBox {
height: 176px;
width: 212px;
margin: 21px 14px 6px;
float: inherit;
background: #ccc;
}
.categoryLabelText {
line-height: 150%;
font-size: x-large;
}*
----
=== Поддержка CSS в среде NetBeans
Рассмотрим два окна, которые важно использовать при работе с таблицами стилей. Окно "Предварительный просмотр CSS" позволяет просмотреть правила стилей так, как они отображаются в браузере. Чтобы открыть это окно, выберите в главном меню "Окно" пункт "Прочее", затем "Предварительный просмотр CSS". Если поместить курсор внутри правила стиля в редакторе, пример текста в окне "Предварительный просмотр CSS" автоматически обновляется в соответствии с указанными в этом правиле свойствами.
image::images/css-preview.png[title="Используйте 'Окно предварительного просмотра CSS' для просмотра визуализированных правил стилей"]
Окно "Конструктор стилей CSS" позволяет не набирать правила стилей вручную. Чтобы открыть это окно, выберите в главном меню "Окно" пункт "Прочее", затем "Конструктор стилей CSS". С помощью этого интерфейса можно создавать правила, выбирая свойства и значения в графическом интерфейсе.
image::images/style-builder.png[title="Используйте 'Конструктор стилей CSS' для создания правил стилей"]
Так же как "Предварительный просмотр CSS", "Конструктор стилей CSS" синхронизирован с редактором. При выборе свойства в "Конструкторе стилей CSS" правило автоматически обновляется в редакторе. Аналогично, при внесении изменений в редакторе выбранные свойства в "Конструкторе стилей CSS" немедленно обновляются.
[start=11]
. Сохраните (Ctrl-S; ?-S в Mac) файлы `index.jsp` и `affablebean.css`, затем перейдите к браузеру и обновите страницу для просмотра текущего состояния.
image::images/index-page3.png[title="Заполнители для заголовков и правого столбца отображаются при запуске проекта"]
[start=12]
. В левом столбце и нижнем колонтитуле требуются заполнители только для статического текста, поэтому добавьте их одновременно.
Вставьте между тегами `<div id="indexLefttColumn">` и `<div id="footer">` следующий код. Новый код отображается *полужирным шрифтом*.
[source,html]
----
<div id="indexLeftColumn">
*<div id="welcomeText">
<p>[ welcome text ]</p>
</div>*
</div>
...
<div id="footer">
*<hr>
<p id="footerText">[ footer text ]</p>*
</div>
----
[start=13]
. Внесите изменения в таблицу стилей `affablebean.css`. Нет необходимости учитывать все новые идентификаторы и классы, можно улучшить внешний вид позже, после получения от клиента текста и изображений.
Тег горизонтальной линии (`<hr>`) занимает всю ширину родительского элемента (`<div id="footer"`). Поэтому для изменения ширины линии в соответствии с макетом следует изменить ширину элемента `<div id="footer">`. Новый код отображается *полужирным шрифтом*.
[source,java]
----
#footer {
height: 60px;
*width: 350px;*
clear: left;
background: #aaa;
}
*hr {
border: 0;
background-color: #333;
height: 1px;
margin: 0 25px;
width: 300px;
}*
----
[start=14]
. Сохраните (Ctrl-S; ?-S в Mac) файлы `index.jsp` и `affablebean.css`, затем перейдите к браузеру и обновите страницу для просмотра текущего состояния.
image::images/index-page4.png[title="Отображаются заполнители для левого столбца и нижнего колонтитула"]
Страница приветствия готова. Созданы все необходимые заполнители для компонентов, которые будут добавлены на страницу.
Начальный дизайн страницы приветствия приложения выполнен. Созданы все заполнители для компонентов страницы. Позже в этом учебном курсе, когда будет применяться динамическая логика для представлений страниц, можно будет просто включить выражения JSTL и EL в эти заполнители.
Самостоятельно реализуйте начальный проект для остальных страниц в соответствии с link:design.html#mockups[+макетами+]. Для этого следуйте шаблону:
1. Создайте теги `<div>` для основных областей страницы.
2. Для каждой области страницы выполните следующие действия:
.. Создание структуры с помощью HTML.
.. Создание набора стилей для определения внешнего вида.
.. Просмотр страницы для анализа результатов этих изменений.
Не забывайте использовать поддержку HTML и CSS среды IDE. <<tipsTricks,Полезные советы>> Если требуется просто получить код для оставшихся страниц и продолжить выполнение учебного курса, можно link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252Fecommerce%252FAffableBean_snapshot1.zip[+загрузить снимок 1 ` проекта AffableBean`+]. Изображения начальной реализации макетов оставшихся страниц.
[[categoryPage]]
==== страница категории
image::images/category-page.png[title="Заполнители реализованы для страницы категории"]
[[cartPage]]
==== страница корзины покупок
image::images/cart-page.png[title="Заполнители реализованы для страницы корзины"]
[[checkoutPage]]
==== страница проверки
image::images/checkout-page.png[title="Заполнители реализованы для страницы изъятия из использования"]
==== страница подтверждения
image::images/confirmation-page.png[title="Заполнители реализованы для страницы изъятия из использования"]
*Примечание.* Фоновые цвета для всех областей страницы используются только для расположения элементов при разработке приложения. В конце следует удалить их из таблицы стилей и применить более подходящий цвет фона. Для этого измените правило background класса `main`:
[source,java]
----
#main { background: #f7f7e9 }
----
[[tipsTricks]]
=== Полезные советы
В редакторе среды IDE есть много полезных возможностей для эффективной работы. Изучение комбинаций клавиш и кнопок панели инструментов увеличит эффективность работы. Следующие советы относятся к правке файлов HTML и CSS. Для просмотра остальных комбинаций клавиш, откройте таблицу сочетаний клавиш среды IDE, выбрав в основном меню "Справка" пункт "Таблица сочетаний клавиш".
* *Автозавершение кода.* При вводе тегов и атрибутов во всплывающем окне автоматически отображаются предположения. Нажатие клавиши ВВОД завершает выбранный тег.
* *Форматирование кода.* Щелкните правой кнопкой мыши в редакторе и выберите пункт "Формат".
* *Переключение номеров строк.* Щелкните правой кнопкой мыши в левом поле редактора и выберите команду "Показать номера строк".
* *Найти вхождения:* Выделите блок текста и нажмите Ctrl-F (⌘-F в Mac). Все вхождения текста подсвечиваются в редакторе. Для переключения выделения нажмите кнопку 'Переключение выделения при поиске' ( image::images/toggle-highlight.png[] ) (Ctrl-Shift-H) на панели инструментов редактора.
* *Создание закладки.* Нажмите кнопку 'Переключение закладок' ( image::images/toggle-bookmark.png[] ) (Ctrl-Shift-M) для создания закладки в левом поле редактора. Независимо от положения в файле можно перейти к закладке нажатием кнопок "Предыдущая закладка"/"Следующая закладка" на панели инструментов редактора.
* *Копирование фрагментов кода вверх или вниз*Выделите фрагмент кода и нажмите комбинацию клавиш CTRL+SHIFT+СТРЕЛКА ВВЕРХ/СТРЕЛКА ВНИЗ.
* *Выделение открывающих и закрывающих тегов.* Поместите курсор на открывающий или закрывающий тег, и оба тега будут подсвечены желтым.
[[view]]
== Размещение страниц JSP в папке WEB-INF
В соответствии с созданными link:design.html#mockups[+макетами страниц+], link:design.html#index[+страница приветствия+] всегда должна выглядеть одинаково для всех посетителей. Это означает, что содержимое страницы приветствия не зависит от _сеанса_ пользователя. (Сеансы рассматриваются в главе 8, link:manage-sessions.html[+Управление сеансами+].) Обратите внимание, что всем остальным страницам для верного отображения требуется информация, зависящая от пользователя. Например, на link:design.html#category[+странице категории+] требуется, чтобы пользователь выбрал категорию для отображения, а на link:design.html#cart[+странице корзины+] требуется информация о добавленных пользователем в корзину покупок элементах. Эти страницы не будут отображаться верно, если сервер не свяжет информацию, зависящую от пользователя, с входящим запросом. Поэтому нужно избежать прямого запроса этих страниц путем ввода их адреса в адресной строке браузера. Для этой цели можно использовать папку проекта `WEB-INF`: все ресурсы, содержащиеся в папке `WEB-INF` недоступны из браузера напрямую.
Создайте папку `view` и поместите ее в папку `WEB-INF`. Затем переместите все страницы JSP, кроме страницы приветствия, в эту папку.
1. В окне 'Проекты', щелкните правой кнопкой мыши узел WEB-INF и выберите 'Создать' > 'Папка'.
2. В мастере создания папки введите название `view` и нажмите кнопку "Готово". Обратите внимание, что созданная папка отображается в окне "Проекты".
3. Переместите страницы `category.jsp`, `cart.jsp`, `checkout.jsp` и `confirmation.jsp` в папку `view`.
Для этого щелкните файл `cart.jsp` для его выбора, затем, удерживая нажатой клавишу SHIFT, щелкните файл `confirmation.jsp`. При этом будут выделены четыре файла. Когда эти файлы выделены, щелкните их и перетащите в папку `WEB-INF/view`.
image::images/view-folder.png[title="Щелкните и перетащите страницы JSP в папку 'WEB-INF/view/'"]
Для демонстрации того, что эти страницы более недоступны из браузера, нажмите кнопку 'Запустить проект' ( image::images/run-project-btn.png[] ) для запуска проекта. После отображения приложения в браузере введите полный путь к одному из этих файлов в строке адреса. Например, введите адрес:
[source,java]
----
http://localhost:8080/AffableBean/WEB-INF/view/category.jsp
----
Вы получите статус HTTP 404, означающий, что ресурс недоступен.
[[jspf]]
== Создание верхнего и нижнего колонтитула
Как видно из link:design.html#mockups[+макетов страниц+], у всех пяти представлений есть общее содержание. В верхней части все они содержат логотип компании, переключатель языков и другие элементы оформления, связанные с корзиной покупок. В нижней части они содержат текст о политике конфиденциальности и ссылки на контакты. Вместо того, чтобы включать этот код в исходные файлы всех страниц, можно выделить его в два фрагмента JSP: верхний и нижний колонтитулы. Затем можно включить файлы фрагментов в представления страниц в нужных позициях.
Для этих фрагментов создайте новую папку `jspf`, расположенную в папке `WEB-INF`.
1. В окне 'Проекты', щелкните правой кнопкой мыши узел WEB-INF и выберите 'Создать' > 'Папка'.
2. В мастере создания папки введите имя `jspf` и нажмите кнопку "Готово".
Поведение элементов меню среды IDE часто зависит от контекста. Например, при щелчке правой кнопкой мыши узла WEB-INF когда отображен мастер создания папок, `web/WEB-INF` был автоматически введен в поле 'Родительская папка'. Точно так же, при щелчке правой кнопкой мыши узла в окне 'Проекты' и выборе 'Создать', список типов файлов частично определяется предыдущими выборками.
[start=3]
. Создайте два сегмента JSP: `header.jspf` и `footer.jspf`. Для этого щелкните правой кнопкой мыши новую созданную папку `jspf` и выберите 'Создать' > JSP. В мастере создания JSP введите имя файла и под надписью "Параметры" выберите параметр "Создать как сегмент JSP", затем нажмите кнопку "Готово".
После этого в окне "Проекты" отображаются файлы `header.jspf` и `footer.jspf`:
image::images/projects-win-jspf.png[title="В проекте отображаются фрагменты JSP нижнего и верхнего колонтитулов"]
Теперь можно скопировать код верхнего колонтитула из любой страницы JSP и вставить его в файл `header.jspf`. Аналогично, можно скопировать текст нижнего колонтитула из любой страницы JSP и вставить его в файл `footer.jspf`. После этого можно удалить код верхнего и нижнего колонтитулов из всех страниц JSP.
[start=4]
. Скопируйте код верхнего колонтитула из любой страницы JSP и вставьте его в файл `header.jspf`. Верхний колонтитул должен включать описатель типа документа и открывающие теги `<html>`, `<head>` и `<body>` и текст до закрывающего тега элемента `<div id="header&amp;quot>`. Убедитесь, что добавлены заполнители для элементов, используемых в верхней части представлений страниц: корзины покупок, переключателя языков и кнопки "Переход к проверке". После вставки кода в файл `header.jspf`, он будет выглядеть следующим образом:
[source,html]
----
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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">
<link rel="stylesheet" type="text/css" href="css/affablebean.css">
<title>The Affable Bean</title>
</head>
<body>
<div id="main">
<div id="header">
<div id="widgetBar">
<div class="headerWidget">
[ language toggle ]
</div>
<div class="headerWidget">
[ checkout button ]
</div>
<div class="headerWidget">
[ shopping cart widget ]
</div>
</div>
<a href="#">
<img src="#" id="logo" alt="Affable Bean logo">
</a>
<img src="#" id="logoText" alt="the affable bean">
</div>
----
[start=5]
. Скопируйте код нижнего колонтитула из любой страницы JSP и вставьте его в файл `footer.jspf`. Код нижнего колонтитула должен включать в себя элемент `<div id="footer">` и текст до закрывающего тега `<html>`. После вставки кода в файл `footer.jspf` он будет выглядеть следующим образом:
[source,html]
----
<div id="footer">
<hr>
<p id="footerText">[ footer text ]</p>
</div>
</div>
</body>
</html>
----
[start=6]
. Удалите код верхнего и нижнего колонтитулов из всех пяти страниц JSP (`index.jsp`, `category.jsp`, `cart.jsp`, `checkout.jsp` и `confirmation.jsp`).
[[dd]]
== Добавление директивы к дескриптору развертывания
В настоящий момент представления размещены правильным образом и общий код колонтитулов выделен в файлы `header.jspf` и `footer.jspf`. По-прежнему не указано, к каким страницам относятся верхний и нижний колонтитулы. К каждому представлению страницы можно добавить теги `<jsp:include>`. Однако это приведет только к дублированию кода, которое требовалось устранить. В качестве альтернативы можно создать дескриптор развертывания `web.xml` и добавить директиву "Группа свойств JSP" для указания, к каким страницам относятся фрагменты верхнего и нижнего колонтитула.
1. Нажмите сочетание клавиш CTRL+N (⌘-N на компьютере Mac) для открытия мастера создания файлов. Выберите категорию Web, затем выберите тип файла "Стандартный дескриптор развертывания (web.xml)".
2. Нажмите кнопку "Далее". Обратите внимание, что файл называется `web.xml`, и будет помещен в папку `WEB-INF` проекта после завершения работы мастера.
3. Нажмите кнопку "Завершить". Файл `web.xml` создается и добавляется в проект. В редакторе открывается графический интерфейс среды IDE для дескриптора развертывания.
Интерфейс разбит на категории в соответствии в областями, которые могут быть настроены в веб-приложении. Эти области (например, "Сервлеты", "Фильтры","Ссылки" и "Безопасность") отображаются на панели инструментов редактора как вкладки. На вкладке XML отображается весь исходный код файла. При любых изменениях, сделанных в графическом интерфейсе, исходный код дескриптора развертывания немедленно обновляется. В этом можно убедиться, открыв вкладку XML. Выполните следующие действия.
[start=4]
. Выберите вкладку "Страницы", затем нажмите кнопку "Добавить в группу свойств JSP". Открывается диалоговое окно "Добавление группы свойств JSP".
[start=5]
. Введите в поле "Описание" текст "`header and footer settings`". Оставьте поле "Отображаемое имя" пустым. Поля "Отображаемое имя" и "Описание" являются необязательными для заполнения.
[start=6]
. В поле "Шаблоны URL" введите пути к пяти представлениям. Введите "`/index.jsp`" и "`/WEB-INF/view/*`". Разделите эти два пути запятой. (Символ "`*`" это подстановочный знак, обозначающий все файлы в данной папке.)
image::images/add-jsp-prop-group-dialog.png[title="Используйте диалоговое окно 'Добавить группу свойств JSP', чтобы указать теги <jsp-config> в дескрипторе развертывания"]
[start=7]
. Нажмите кнопку "ОК". В категорию "Группа свойств JSP" на вкладке "Страницы" добавляется запись.
[start=8]
. Переключитесь обратно на вкладку XML. Обратите внимание, что в дескриптор развертывания добавился следующий код.
[source,xml]
----
<jsp-config>
<jsp-property-group>
<description>header and footer settings</description>
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/WEB-INF/view/*</url-pattern>
</jsp-property-group>
</jsp-config>
----
*Примечание.* Может потребоваться добавление символа возврата каретки к коду, чтобы он отображался на нескольких строках. Можно щелкнуть правой кнопкой мыши в редакторе и выбрать 'Формат' (Alt-Shift-F, Ctrl-Shift-F на Mac), чтобы задать для код правильные отступы.
[start=9]
. Переключитесь снова на вкладку "Страницы" и введите в поля "Включить вводные части" и "Включить заключительные части" пути к файлам `header.jspf` и `footer.jspf` соответственно. Можно нажать кнопку "Обзор" и выбрать файлы в диалоговом окне.
[.feature]
--
image::images/jsp-prop-groups-small.png[role="left", link="images/jsp-prop-groups.png"]
--
[start=10]
. Переключитесь обратно на вкладку XML. Обратите внимание, что добавился следующий код. (Изменения *выделены полужирным шрифтом*.)
[source,xml]
----
<jsp-config>
<jsp-property-group>
<description>header and footer settings</description>
<url-pattern>/index.jsp</url-pattern>
<url-pattern>/WEB-INF/view/*</url-pattern>
*<include-prelude>/WEB-INF/jspf/header.jspf</include-prelude>
<include-coda>/WEB-INF/jspf/footer.jspf</include-coda>*
</jsp-property-group>
</jsp-config>
----
Эти директивы означают, что для всех файлов, расположенных по указанным `шаблонам путей`, файл`header.jspf` будет добавлен в начало, а файл `footer.jspf` добавлен в конец.
Определения этих и остальных доступных в дескрипторе веб-развертывания тегов приведены в link:http://jcp.org/en/jsr/detail?id=315[+Спецификации сервлетов+].
[start=11]
. Выполните приложение повторно (нажмите клавишу F6; комбинацию клавиш fn+F6 в Mac OS). Код верхнего и нижнего колонтитулов уже удален из файла`index.jsp`, поэтому при запросе этого файла можно убедиться, что код автоматически добавляется.
<<welcome-page,Страница приветствия отображается как ранее>>, включая содержимое верхнего и нижнего колонтитулов.
[[controller]]
== Создание сервлета Controller
Сервлет Controller обрабатывает входящие запросы, запуская необходимые для создания модели действия и перенаправляя запрос соответствующему представлению. Визуальное представление приведено на link:design.html#mvcDiagram[+диаграмме MVC для проекта AffableBean+].
Мастер создания сервлета среды IDE позволяет определить компонент сервлета веб-приложения с помощью аннотации `@WebServlet` в создаваемом классе или с помощью добавления необходимых директив в дескриптор развертывания. Далее класс `ControllerServlet` будет создан и определен в контексте приложения с помощью аннотации link:http://java.sun.com/javaee/6/docs/api/javax/servlet/annotation/WebServlet.html[+`@WebServlet`+].
1. В окне 'Проекты', щелкните правой кнопкой мыши узел проекта `AffableBean` и выберите 'Создать' > 'Сервлет'.
2. В мастере введите в поле "Имя класса" `ControllerServlet`.
3. В поле "Пакет", введите `controller`. (Пакет автоматически создается после завершения работы мастера.)
image::images/servlet-wizard.png[title="Используйте мастер создания сервлетов для создания сервлетов для проекта"]
[start=4]
. Нажмите кнопку "Далее". На третьем экране мастера можно настроить сервлет. Наиболее значимыми являются шаблоны URL-адресов, которые требуется указать. Эти шаблоны определяют URL-адреса, по которым выполняется сервлет. Например, если ввести "`/category`", сервлет будет обрабатывать запросы следующего вида.
[source,java]
----
http://localhost/AffableBean*/category*
----
Шаблоны URL-адресов должны соответствовать представлениям и действиям пользователя. В соответствии с link:design.html#index[+макетом страницы приветствия+], пользователь должен иметь возможность выбрать категорию. Поэтому можно связать URL-адрес `/category` с действием нажатия изображения категории. Аналогично, на link:design.html#category[+странице категории+] пользователи должны иметь возможность добавить элемент в корзину покупок. Поэтому можно указать URL-адрес `/addToCart`.
[start=5]
. В поле "Шаблоны URL-адресов" введите `/category, /addToCart, /viewCart`. Шаблоны разделяются запятыми. Можно создать дополнительные шаблоны непосредственно в классе сервлета после его создания.
image::images/servlet-wizard2.png[title="Настройте развертывание сервлета напрямую в мастере"]
[start=6]
. Нажмите кнопку "Завершить". `ControllerServlet` создается в среде IDE и открывается в редакторе. Сервлет и шаблоны URL-адресов включены в аннотацию `@WebServlet`, расположенную перед сигнатурой класса.
[source,java]
----
*@WebServlet(name="ControllerServlet", urlPatterns={"/category", "/addToCart", "/viewCart"})*
public class ControllerServlet extends HttpServlet {
----
Если выбрать на предыдущем шаге параметр "`Добавить сведения в дескриптор развертывания (web.xml)`", вместо этого была бы создана такая разметка в файле приложения `web.xml`.
[source,xml]
----
<servlet>
<servlet-name>ControllerServlet</servlet-name>
<servlet-class>controller.ControllerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/category</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/addToCart</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ControllerServlet</servlet-name>
<url-pattern>/viewCart</url-pattern>
</servlet-mapping>
----
[start=7]
. Добавьте остальные шаблоны URL-адресов прямо в аннотацию `@WebServlet` в элемент `urlPatterns`. В приложении требуются шаблоны URL-адресов для остальных действий и представлений. Можно ввести следующие шаблоны:
* `/updateCart`
* `/checkout`
* `/purchase`
* `/chooseLanguage`
Запишите шаблоны через запятую. Также можно переформатировать аннотацию таким образом:
[source,java]
----
@WebServlet(name="ControllerServlet",
urlPatterns = {"/category",
"/addToCart",
"/viewCart"*,
"/updateCart",
"/checkout",
"/purchase",
"/chooseLanguage"*})
----
[start=8]
. Наконец, добавьте элемент `loadOnStartup`, чтобы экземпляр сервлета создавался и инициализировался при развертывании приложения. Для этого задайте значение `0` или большее (по умолчанию используется значение `-1`).
[source,java]
----
@WebServlet(name="ControllerServlet",
*loadOnStartup = 1,*
urlPatterns = {"/category",
"/addToCart",
"/viewCart",
"/updateCart",
"/checkout",
"/purchase",
"/chooseLanguage"})
----
[[implement]]
== Реализация сервлета Controller
Сервлет Controller обрабатывает входящие запросы, запуская необходимые для создания модели действия и перенаправляя запрос соответствующему представлению. Визуальное представление приведено на link:design.html#mvcDiagram[+диаграмме MVC для проекта AffableBean+].
Открыв созданный код для поиска нового `ControllerServlet`, можно заметить, что шаблон сервлета IDE использует метод `processRequest`, который вызывается как методом `doGet`, так и `doPost`. (Возможно, потребуется расширить свертывание кода, щелкнув значок плюса ( image::images/code-fold-icon.png[] ) в левом поле редактора, чтобы просмотреть эти методы). Поскольку приложение проводит различие между `doGet` и `doPost`, код добавляется прямо в эти методы и полностью исключается из метода `processRequest`.
=== Изменение шаблонов файлов с помощью диспетчера шаблонов среды IDE
Среда IDE предоставляет простой шаблон для каждого создаваемого файла. Если шаблон не соответствует вашим рабочим шаблонам, можно изменить его в диспетчере шаблонов среды IDE. В среде IDE есть шаблоны практически для каждого типа файлов.
Например, для изменения шаблона сервлета выполните следующие действия:
1. Откройте диспетчер шаблонов, выбрав в главном меню "Сервис" пункт "Шаблоны".
2. Разверните категорию Web, затем выберите шаблон "Сервлет".
image::images/template-manager.png[title="Доступ и изменение шаблонов файлов с помощью диспетчера шаблонов"]
[start=3]
. Нажмите кнопку "Открыть в редакторе".
[start=4]
. Измените шаблон в редакторе. При следующем создании нового сервлета (например, с помощью мастера создания сервлетов), будет применена новая версия.
После связывания шаблонов URL-адресов в сервлетом с помощью аннотации `@WebServlet`, настройте `ControllerServlet` для обработки этих шаблонов. Также создайте экземпляр `RequestDispatcher` для перенаправления запроса к соответствующему представлению.
1. Замените код шаблона класса `ControllerServlet` на следующий.
[source,xml]
----
public class ControllerServlet extends HttpServlet {
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userPath = request.getServletPath();
// if category page is requested
if (userPath.equals("/category")) {
// TODO: Implement category request
// if cart page is requested
} else if (userPath.equals("/viewCart")) {
// TODO: Implement cart page request
userPath = "/cart";
// if checkout page is requested
} else if (userPath.equals("/checkout")) {
// TODO: Implement checkout page request
// if user switches language
} else if (userPath.equals("/chooseLanguage")) {
// TODO: Implement language request
}
// use RequestDispatcher to forward request internally
String url = "/WEB-INF/view" + userPath + ".jsp";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userPath = request.getServletPath();
// if addToCart action is called
if (userPath.equals("/addToCart")) {
// TODO: Implement add product to cart action
// if updateCart action is called
} else if (userPath.equals("/updateCart")) {
// TODO: Implement update cart action
// if purchase action is called
} else if (userPath.equals("/purchase")) {
// TODO: Implement purchase action
userPath = "/confirmation";
}
// use RequestDispatcher to forward request internally
String url = "/WEB-INF/view" + userPath + ".jsp";
try {
request.getRequestDispatcher(url).forward(request, response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
----
Продолжив работу с учебным курсом, вы вернётесь к `ControllerServlet` и реализуете каждый из сопоставленных шаблонов URL-адреса отдельно.
[start=2]
. Рассмотрим этот код. Следует обратить внимание на следующие моменты:
* Сервлет использует переменную экземпляра `userPath` для получения запрошенного шаблона URL-адреса от клиента:
[source,java]
----
String userPath = request.getServletPath();
----
`userPath` используется как методом `doGet`, так и `doPost`.
* Шаблоны URL-адресов связаны в первую очередь с запросом страниц и управляются методом `doGet`. Например, запросы `/category`, `/viewCart` и `/checkout` соответственно приведут к отображению страниц категории, корзины покупок и проверки.
* Шаблоны URL-адресов. связанные с отправкой форм и передачей конфиденциальной информации пользователей (например,, `/addToCart`, `/updateCart` и `/purchase`) управляются методом `doPost`.
* Как для метода `doGet`, так и для `doPost`, путь к соответствующему виду формируется с использованием строки адреса `url`.
[source,java]
----
String url = "/WEB-INF/view" + userPath + ".jsp";
----
* `RequestDispatcher` получается из `HttpServletRequest` и использует `url` для перенаправления запроса:
[source,java]
----
request.getRequestDispatcher(url).forward(request, response);
----
* Примечания `TODO` используются для обозначения работы, которую предстоит выполнить. Например:
[source,java]
----
// if category page is requested
if (userPath.equals("/category")) {
// TODO: Implement category request
----
Применение примечаний `TODO` в коде полезный способ отслеживать задания, которые предстоит выполнить. Можно использовать окно 'Задачи' среды IDE (Ctrl-6; ⌘-6 в Mac), чтобы просмотреть все заметки TODO, а также любой синтаксис или ошибки компиляции, содержащиеся в проекте.
image::images/tasks-window.png[title="Отслеживание задач реализации в окне 'Задачи' среды IDE"]
Можно управлять ключевыми словами, отображаемыми в окне "Задачи". Откройте окно "Параметры" меню "Сервис" пункт "Параметры"; меню NetBeans, пункт "Параметры" в Mac OS), затем выберите "Разное" > "Задания".
[start=3]
. Выполните проект (нажмите клавишу F6; fn+F6 в Mac OS) и проверьте, что `ControllerServlet` перенаправляет запросы соответствующим представлениям.
* Введите в строке адреса браузера `http://localhost:8080/AffableBean/category`. Отображается <<categoryPage,страница категории>> приложения.
* Введите в строке адреса браузера `http://localhost:8080/AffableBean/viewCart`. Отображается <<cartPage,страница корзины покупок>>.
* Введите в строке адреса браузера `http://localhost:8080/AffableBean/checkout`. Отображается <<checkoutPage,страница проверки>> приложения.
*Примечание.* Ввод `http://localhost:8080/AffableBean/purchase` в адресной строке браузера не обеспечивает разрешения для просмотра <<confirmationPage,страницы подтверждения>>. Это происходит потому, что шаблон URL-адреса `/purchase` управляется методом `doPost` сервлета, а запрос формы отправки из адресной строки браузера обычно посылается с помощью метода HTTP GET.
В настоящий момент созданы страницы JSP, содержащие заполнители для всех функциональных компонентов. Также создана структура внешнего интерфейса приложения. Страницы JSP теперь расположены в папке `WEB-INF`, верхний и нижний колонтитулы выделены в отдельные файлы, дескриптор развертывания настроен и для обработки входящих запросов создан `ControllerServlet`. В следующей главе учебного курса будет создано подключение приложения к базе данных.
Если требуется сравнить результаты выполнения этой главы с образцом, link:https://netbeans.org/projects/samples/downloads/download/Samples%252FJavaEE%252Fecommerce%252FAffableBean_snapshot2.zip[+загрузите снимок 2 проекта AffableBean+].
link:/about/contact_form.html?to=3&subject=Feedback: NetBeans E-commerce Tutorial - Preparing the Page Views and Controller Servlet[+Мы ждем ваших отзывов+]
[[seeAlso]]
== Дополнительные сведения
=== Учебные курсы по среде NetBeans
* link:../javaee-intro.html[+Введение в технологию Java EE +]
* link:../javaee-gettingstarted.html[+Начало работы с приложениями для Java EE+]
* link:../../web/quickstart-webapps.html[+Введение в разработку веб-приложений+]
* link:../../web/mysql-webapp.html[+Создание простого веб-приложения, использующего базу данных MySQL+]
* link:../../screencasts.html[+Video Tutorials and Demos for IDE NetBeans 6.x+]
* link:https://netbeans.org/projects/www/downloads/download/shortcuts.pdf[+Таблица комбинаций клавиш и шаблонов кода+]
* link:../../../trails/java-ee.html[+Учебная карта по Java EE и Java Web+]
=== Книги по среде NetBeans
* link:https://netbeans.org/kb/articles/netbeans-tips-and-tricks-book.html[+100 IDE NetBeans Tips and Tricks+]
* link:http://www.apress.com/book/view/1590598954[+Pro IDE NetBeans 6 Rich Client Platform Edition+]
* link:http://apress.com/book/view/1430219548[+Начало работы с платформой Java EE 6 с GlassFish 3: от новичка до профессионала+]
* link:https://netbeans.org/kb/articles/books.html[+More books about IDE NetBeans+]
=== Внешние ресурсы
* link:http://jcp.org/en/jsr/detail?id=315[+Спецификация сервлета 3.0+]
* link:https://developer.mozilla.org/en/Common_CSS_Questions[+Часто задаваемые вопросы по CSS+]
* link:http://quirksmode.org/compatibility.html[+Главная таблица совместимости с браузерами+]
* link:http://refcardz.dzone.com/refcardz/netbeans-ide-67-update[+DZone Refcard для редактора Java NetBeans+]