Авторы: Java Studio Creator Tutorials Team
Перевод: Михаила Матвеева
Апрель 2006 [Revision number: V2.1-1] |
|
|
| Учебное пособие знакомит вас с процессом использования интегрированной среды разработки (IDE) Sun Java Studio
Creator
для построения веб-приложения, которое может создавать, находить,
изменять и удалять записи в базе данных. |
Приложение отображает выпадающий список основных
данных и синхронизированную с ним таблицу подробных данных.
Пользователи могут добавлять, изменять и удалять записи в таблице и
связанной с ней базе данных. |
| В учебном пособии используются многие концепции,
изложенные в других, более фундаментальных пособиях.
Если вы не обладаете базовыми знаниями об IDE и ее компонентах,
советуем вам сначала ознакомиться с такими вводными статьями, как
Getting Started With Java Studio Creator,
Using Virtual Forms и Using
Databound Components to Access Databases. |
|
Содержание
|
 |
 |
Учебное пособие использует интегрированную базу данных,
поставляемую с Java
Studio Creator IDE. Чтобы применить его для других баз данных, потребуется внести некоторые изменения в производимые действия и в источники данных Java Studio
Creator. Например, если вы используете другую базу данных, вам потребуется
открыть окно Servers и добавить источник данных.
Создание проекта
Начнем с создания проекта веб-приложения.
- На странице Welcome выберите Create New Project.
- Выберите Web на панели Categories, JSF Web Application на
панели Projects и нажмите на кнопку Next. Ваше веб-приложение будет
построено при помощи технологии JavaServer Faces (JSF).
- Назовите проект характерным именем, например,
InsertUpdateDelete.
Нажмите на кнопку Finish.
Расположение компонентов на странице
В этом пособии создается одностраничное веб-приложение. Сейчас мы построим страницу, которая выводит информацию
о человеке и его поездках.
- Откройте закладку с компонентами (Components) в окне
палитры (Palette) и раскройте секцию Basic, чтобы увидеть компоненты, которые вы будете использовать на странице.
- Перетащите мышкой следующие компоненты на дизайнер
страницы:
- выпадающий список (Drop Down List). Поместите его в левый верхний угол страницы.
- окно системных сообщений (Message Group). Поместите его
справа от выпадающего списка. Окно системных сообщений отображает
ошибки проверки корректности и преобразования данных, а также
сообщения, переданные в Java Server Faces контекст методами
info() и error().
Эти сообщения могут быть полезны при отладке проекта.
- таблицу (Table). Поместите ее под двумя предыдущими
компонентами.
Сейчас ваша страница должна выглядеть так, как на рисунке 1.
Figure
1 : Initial Page Layout |
Настройка выпадающего списка
- Выберите выпадающий список в дизайнере и в окне
свойств (Properties) измените свойство
General > id
на personDD.
- Щелкните правой кнопкой мыши на выпадающем списке personDD
в дизайнере и выберите Bind to Data во всплывающем меню.
Появится диалоговое окно Bind to Data.
- В диалоговом окне Bind to Data перейдите на закладку Bind
to Data Provider и выберите Add Data Provider. Появится диалоговое окно
Add Data Provider.
- В диалоговом окне Add Data Provider раскройте узел Data
Sources >
Travel > Tables и выберите таблицу PERSON. Нажмите на кнопку Add.
Figure
2 : Add Data Provider Dialog Box |
- В диалоговом окне Bind to Data нажмите на кнопку OK. Будет создана
переменная personDataProvider, привязанная к выпадающему списку
personDD.
Figure
3 : Bind to Data Dialog Box |
- Щелкните правой кнопкой мыши на выпадающем списке и
выберите Auto-Submit во всплывающем меню. При этой установке страница
будет отсылаться на сервер всякий раз, когда в выпадающем списке будет
выбрано новое значение.
- Щелкните правой кнопкой мыши на выпадающем списке и
выберите Configure Virtual
Forms во всплывающем меню. Обратите внимание, что в левом верхнем углу
появившегося диалогового окна написано
personDD,
что указывает, что выбран соответствующий выпадающий список. Более
подробную информацию об использовании виртуальных форм можно найти в учебном пособии Using
Virtual Forms.
- Нажмите на кнопку New. Введите
person в
столбце Name, выберите Yes в столбцах Participate и
Submit.
Figure
4: Configuring Virtual Forms |
При помощи виртуальных форм приложение
может избегать ненужных проверок корректности данных.
- Нажмите на кнопку OK.
- Нажмите на кнопку Show Virtual Forms на панели инструментов
дизайнера . Просмотр виртуальных форм позволяет увидеть
взаимосвязь между компонентами в дизайнере и любыми созданными вами
виртуальными формами.
Figure
5 : Showing Virtual Forms |
Настройка таблицы
- Щелкните правой кнопкой мыши на таблице и выберите Bind to
Data во всплывающем меню.
- Нажмите на кнопку Add Data Provider. Появится диалоговое окно
Add Data Provider.
- В диалоговом окне Add Data Provider раскройте узел Data
Sources >
Travel > Tables и выберите таблицу TRIP. Нажмите на кнопку Add. Будет
создан провайдер данных
tripDataProvider и появится диалоговое окно.
- Диалоговое окно показывает поля, доступные в только что
созданном tripDataProvider и позволяет задавать набор полей,
которые будут отображаться в таблице. Удалите при помощи кнопки <
поля TRIP.TRIPID и TRIP.PERSONID из списка Selected справа, как
показано на рисунке.
Значения этих полей важны только для программистов и не должны
показываться пользователям.
Figure
6 : Binding Table to Data Provider |
- Нажмите на кнопку OK, чтобы сохранить изменения и закрыть диалоговое
окно.
- Снова выберите таблицу в дизайнере, щелкните на
ней правой кнопкой мыши и выберите Table Layout во всплывающем меню.
- Перейдите на закладку Options и измените заголовок (Title)
на
Trips Summary. Нажмите на кнопку OK.
СОВЕТ: Вы также можете
изменить заголовок таблицы, выбрав и отредактировав его прямо в
дизайнере.
Теперь ваша таблица должна выглядеть в дизайнере так, как
показано на рисунке 7. Обратите внимание, что если столбцы идут не в требуемом порядке, вы можете переставить их, снова открыв
диалоговое окно Table Layout, перейдя на закладку Columns и используя
кнопки Up и Down.
Figure
7 : Page1 Table Layout |
- В окне Outline раскройте узел SessionBean1, щелкните правой
кнопкой мыши на
tripRowSet и выберите Edit SQL Statement во всплывающем меню. Откроется
редактор SQL-запросов.
- Щелкните правой кнопкой мыши в таблице, расположенной
примерно в центре окна, на строке PERSONID и выберите Add Query
Criteria. Откроется диалоговое окно Add Query Criteria.
- В этом окне выберите переключатель Parameter и нажмите на кнопку OK. Символы
"=?" появятся в ячейке таблицы PERSONID-Criteria, а в конце SQL-запроса
в панели SQL добавится условие "WHERE TRAVEL.TRIP.PERSONID=?".
СОВЕТ: Для быстроты вы
можете не вызывать диалоговое окно Add Query Criteria, а вместо этого
выбрать ячейку PERSONID-Criteria и набрать там "=?",
после чего нажать Tab для сохранения изменений.
- Закройте редактор SQL-запросов.
Изменение компонентов столбцов
Теперь мы изменим текст заголовков таблицы, чтобы сделать
его более понятным для пользователей. Мы также сделаем
содержимое столбцов редактируемым с целью подготовки возможности
добавления новых поездок в базу данных. При этом мы воспользуемся преимуществами структурности компонента Table, позволяющего встраивать
другие компоненты внутрь себя.
- Щелкните правой кнопкой мыши на таблице и выберите Table
Layout во всплывающем меню. Откроется диалоговое окно Table Layout.
- Перейдите на закладку Columns и выберите TRIP.DEPDATE в
списке Selected справа. В настройках свойств, расположенных в нижней
части диалогового окна, сделайте следующие изменения:
- Измените значение текстового поля Header с DEPDATE на
Date.
- При помощи выпадающего списка Component Type измените
тип компонента со Static Text на Text Field.
- Выберите поле TRIP.DEPCITY в списке Selected и сделайте
следующие изменения:
- Измените значение текстового поля Header с DEPCITY на
From
City.
- При помощи выпадающего списка Component Type измените
тип компонента со Static Text на Text Field.
- Выберите поле TRIP.DESTCITY в списке Selected и сделайте
следующие изменения:
- Измените значение текстового поля Header
с DESTCITY на To
City.
- При помощи выпадающего списка Component Type измените
тип компонента со Static Text на Text Field.
- Выберите поле TRIP.TRIPTYPEID в списке Selected и сделайте
следующие изменения:
- Измените значение текстового поля Headerс TRIPTYPEID на
Trip
Type.
- При помощи выпадающего списка Component Type измените
тип компонента со Static Text на Drop Down List.
- Нажмите на кнопку OK для сохранения
изменений и закрытия
диалогового окна. Если после проделанных действий столбцы таблицы
оказались слишком широкими, вы можете изменить их размер, выбрав первый
компонент колонки и перетащив ее границы на нужное расстояние.
- В дизайнере выберите верхний компонент с выпадающим
списком в таблице. Щелкните на нем правой кнопкой мыши и выберите Bind
to Data во всплывающем меню. Откроется диалоговое окно Bind to Data.
- В диалоговом окне Bind to Data перейдите на закладку Bind
to Data Provider и нажмите на кнопку Add Data Provider. Откроется
диалоговое окно Add Data Provider.
- В диалоговом окне Add Data Provider раскройте узел Data
Sources >
Travel > Tables и выберите TRIPTYPE. Нажмите на кнопку Add. В результате будет
создан провайдер данных
triptypeDataProvider и вновь
появится диалоговое окно Bind to Data.
- В диалоговом окне Bind to Data выберите
triptypeDataProvider из выпадающего списка.
- В списке Value field выберите TRIPTYPE.TRIPTYPEID; в списке
Display
field выберите TRIPTYPE.NAME, как показано на рисунке 8. Нажмите на кнопку OK
для сохранения изменений и закрытия диалогового окна.
Figure
8 : Bind to Data Dialog Box |
Настройка виртуальной формы для таблицы
Сейчас мы создадим виртуальную форму для компонентов ввода в
таблице. Эта виртуальная форма дает возможность не производить проверку корректности и преобразование значений компонентов ввода, когда изменение
personDD отсылает страницу на сервер. Таким образом, всякий раз, когда пользователь выбирает
нового человека в выпадающем списке, в таблице отображается корректная информация.
- В дизайнере выделите при помощи комбинации
Ctrl-Click три текстовых поля и выпадающий список в таблице. Щелкните правой кнопкой мыши на любом
из выбранных компонентов и выберите
Configure Virtual Forms во всплывающем меню.
- Убедитесь, что три текстовых поля и выпадающий список
перечислены в левом вехнем углу появившегося диалогового окна
Configure Virtual Forms. Если они не перечислены так, как показано на
рисунке 9, закройте диалоговое окно, заново выделите их и
попробуйте снова. Если они перечислены как надо, нажмите на кнопку New.
- Измените имя новой виртуальной формы на
save. Установите параметр Participate в Yes, как показано на рисунке 9, и
нажмите на кнопку OK, чтобы закрыть окно.
Figure
9 : Configuring Virtual Forms for Table Elements |
Теперь мы ассоциируем выпадающий список personDD с таблицей, для того чтобы когда пользователь выбрал человека из списка, в таблице появились его поездки.
Добавление обработчика события и кода инициализации
Чтобы согласовать выбор пользователя в выпадающем списке
с таблицей поездок, добавим обработчики событий.
- Выполните двойной щелчок мышью на выпадающем списке personDD для создания
метода, обрабатывающего событие valueСhange, и открытия редактора
Java-кода на этом методе.
- Обратите внимание на комментарий в этом методе
//
TODO: Replace with your code. Введите вместо этого
комментария свой код так, чтобы обработчик события выглядел так же, как
в примере 1.
| Code Sample 1: Drop
Down List Event Handler |
public void personDD_processValueChange(ValueChangeEvent vce) {
Object selectedPersonId = personDD.getSelected();
try {
personDataProvider.setCursorRow(
personDataProvider.findFirst("PERSON.PERSONID",
selectedPersonId));
getSessionBean1().getTripRowSet().setObject(1, selectedPersonId);
tripDataProvider.refresh();
form1.discardSubmittedValues("save");
} catch (Exception e) {
error("Cannot switch to person " + selectedPersonId);
log("Cannot switch to person " + selectedPersonId, e);
}
}
|
В конце блока try
оператор form1.discardSubmittedValues("save");
гарантирует, что всякий раз, когда пользователь выбирает нового
человека в выпадающем списке, текущее содержимое таблицы будет заменено
на новую информацию, относящуюся к выбранному человеку. Напомним, что
все элементы интерфейса, отображающие информацию о поездке, участвуют в
виртуальной форме save.
Обратите внимание, что обработчик событий не генерирует исключений.
Вместо этого он записывает их в серверный лог (файл server.log).
Он также вызывает метод error, и, соответственно, в случае ошибки в
обработчике событий будет отображено сообщение в компоненте Message
Group, который мы поместили на страницу.
- Переместитесь в Java-коде на метод
prerender()
(или, если вам так удобнее, нажмите Ctrl-F и найдите текст prerender
при помощи диалогового окна Find). Сделайте метод таким, как показано в
примере 2.
| Code Sample 2:
Prerender Method |
public void prerender() {
if ( personDD.getSelected() == null ) {
Object firstPersonId = null;
try {
personDataProvider.cursorFirst();
firstPersonId = personDataProvider.getValue("PERSON.PERSONID");
personDD.setSelected(firstPersonId);
getSessionBean1().getTripRowSet().setObject(
1, firstPersonId);
tripDataProvider.refresh();
} catch (Exception e) {
error("Cannot switch to person " +
firstPersonId);
log("Cannot switch to person " +
firstPersonId, e);
}
}
}
|
- Щелкните правой кнопкой мыши в редакторе Java-кода и
выберите Reformat Code, чтобы код был правильно отформатирован.
Тестирование приложения - часть 1
Постройте, загрузите на сервер приложений и запустите
проект, нажав на кнопку Run Main Project на главной панели инструментов.
Эта страница должна загрузиться в ваш браузер, выпадающий список должен
быть заполнен именами, а таблица – соответствующими
данными. Когда вы выбираете другое имя из списка, в таблице должны
появляться поездки, ассоциированные с этим именем.
Figure 10:
Deployed Application, Test 1 |
Добавление возможности вставки записей
Теперь мы релизуем возможность добавления
поездки в
таблицу путем вставки записи в базу данных. Сначала создадим компоненты
Message для текстовых полей таблицы. Они дадут возможность пользователю
видеть сообщения об ошибках в случае ввода некорректной новой информации .
- Откройте страницу Page1 в дизайнере.
- Перетащите компонент Message из секции Basic палитры на самое верхнее текстовое поле каждого из трех первых столбцов таблицы.
- Нажав и удерживая Ctrl-Shift, щелкните мышью и перетащите курсор с каждого
компонента Message на соответствующее текстовое поле. При этом курсор мыши меняется на символ связи, как это показано для столбца
From City на рисунке 11. Когда компонент Message правильно
ассоцирован с текстовым полем, текст Message отображает эту ассоциацию, как
это показано для столбца Date column на рисунке 11.
Figure
11: Associating Message Components with Text Fields |
Теперь мы добавим на страницу кнопку, которая позволит
пользователям добавлять новые строки в буфер данных.
- Перетащите компонент Button из секции Basic палитры на
страницу Page1 и поместите его над таблицей рядом со второй колонкой, как
показано на рисунке 12.
- Текст кнопки сейчас выбран в дизайнере. Измените
этот текст с
Button на Add Trip.
Нажмите Enter или щелкните мышью вне кнопки для сохранения изменений.
- Выберите кнопку и в окне Properties измените свойство
General
> (id) на add.
- Выполните двойной щелчок мышью на кнопке. Откроется редактор Java-кода на
обработчике событий этой кнопки.
- Измените код обработчика событий (метод
add_action())
так, как в примере 3:
| Code Sample 3: Add Trip
Action Code |
public String add_action() {
try {
RowKey rk = tripDataProvider.appendRow();
tripDataProvider.setCursorRow(rk);
tripDataProvider.setValue("TRIP.TRIPID", new Integer(0));
tripDataProvider.setValue("TRIP.PERSONID", personDD.getSelected());
tripDataProvider.setValue("TRIP.TRIPTYPEID", new Integer(1));
} catch (Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
return null;
}
|
- Если редактор Java-кода выведет ошибку о том, что IDE не
может найти класс
RowKey (или другой класс), вы можете
это исправить, применив функцию редактора Java-кода Fix Imports. Она
автоматически добавляет необходимые операторы import в текущий
класс ( в данном случае - Page1.java). Для вызова этой
функции щелкните правой кнопкой мыши в редакторе Java-кода и выберите
Fix Imports во всплывающем меню. Для ссылки на класс RowKey
функция Fix Imports добавит следующий оператор в блок import:
import com.sun.data.provider.RowKey;
Тестирование приложения - часть 2
Постройте, загрузите на сервер приложений и запустите
проект. Страница должна загрузиться в веб-браузер, и на ней должна появиться кнопка Add Trip. При каждом
нажатии на эту кнопку внизу таблицы должна прибавляться новая пустая
строка. Вы сможете редактировать информацию в строках, но поскольку
механизм сохранения изменений пока не добавлен,
все изменения будут теряться, когда вы выберете другое имя из
выпадающего списка.
Figure 12
: Deployed Application, Test 2 |
Изменение страницы для сохранения записей
Теперь мы добавим в проект второй rowset, который будет
использоваться для вычисления максимального из задействованных значений
поля TRIPID.
- Нажмите на кнопку Design окна редактирования для возвращения в
дизайнер страницы Page1.
- В окне Servers выберите таблицу Data Sources > Travel
>
Tables > TRIP table и перетащите ее на узел SessionBean1 в окне
Outline.
Figure
13 : Dragging TRIP Table onto SessionBean1 |
Откроется диалоговое окно Add New Data
Provider.
- Выберите вариант Create SessionBean1/tripRowSet1, измените
имя провайдера данных на
maxTripRowSet и нажмите на кнопку OK.
Figure
14 : Adding New Data Provider to SessionBean1 |
В результате в SessionBean1 будут созданы
maxTripDataProvider and maxTripRowSet.
- В окне Outline выполните двойной щелчок мышью
на SessionBean1 >
maxTripRowSet для открытия редактора SQL-запросов. Щелкните на панели
SQL (третья сверху). Удалите имеющийся SQL-запрос и введите следующий
запрос:
SELECT max(TRAVEL.TRIP.TRIPID)+1 as MAXTRIPID FROM
TRAVEL.TRIP
Значение MAXTRIPID будет использоваться в обработчике
нажатия на кнопку Save, которую мы сейчас добавим.
- Закройте редактор SQL-запросов. Обратите внимание, что
запрос такого типа не поддерживается графическим
интерфейсом редактора SQL-запросов. При появлении диалогового
окна с предупреждением о возможной лексической ошибке вы можете
спокойно закрыть его, выбрав Continue.
Теперь мы добавим еще одну кнопку, которая будет сохранять в
базе данных сделанные изменения.
- Добавьте кнопку на страницу сверху от первой колонки
таблицы.
- Измените текст на кнопке с
Button на Save
Changes.
- В окне Properties поменяйте значение свойства
General
> (id) на save.
- Нажмите правой кнопкой мыши на кнопку Save Changes и
выберите Configure Virtual Forms во всплывающем меню. Откроется
диалоговое окно Configure Virtual Forms.
- Убедитесь, что в появившемся окне Configure Virtual Forms
идентификатор
save указан в списке в левом верхнем
углу, так что сделанные вами в этом окне изменения будут относиться к
кнопке Save Changes. Затем выберите виртуальную форму save,
измените значение Submit на Yes и нажмите на кнопку OK.
- В дизайнере выполните двойной щелчок мышью на кнопке Save
Changes. Откроется редактор Java-кода на обработчике событий этой
кнопки.
- Замените код обработчика событий (метод
save_action()
) на указанный в примере 4.
ПРИМЕЧАНИЕ: Этот код написан для Java Studio Creator 2
Update 1. Если вы используете Java Studio Creator 2, измените
int newTripId = ((Integer) maxTrip.getValue("MAXTRIPID")).intValue();
на
int newTripId = ((Long) maxTrip.getValue("MAXTRIPID")).intValue();
| Code Sample 4: Save
Action Code |
public String save_action() { try { // Get the next key, using result of query on MaxTrip data provider CachedRowSetDataProvider maxTrip = getSessionBean1().getMaxTripDataProvider(); maxTrip.refresh(); maxTrip.cursorFirst(); int newTripId = ((Integer) maxTrip.getValue("MAXTRIPID")).intValue(); // Navigate through rows with data provider if (tripDataProvider.getRowCount() > 0) { tripDataProvider.cursorFirst(); do { if (tripDataProvider.getValue("TRIP.TRIPID").equals (new Integer(0))) { tripDataProvider.setValue("TRIP.TRIPID", new Integer(newTripId)); newTripId++; } } while (tripDataProvider.cursorNext()); }; tripDataProvider.commitChanges(); } catch (Exception ex) { log("Error Description", ex); error("Error :"+ex.getMessage()); }
return null;
}
|
Тестирование приложения - часть 3
Постройте, загрузите на сервер приложений и запустите
проект, нажав на кнопку Run Main Project. Приложение должно работать
следующим образом:
- Вы можете добавить и сохранить поездку. После этого поездка
появляется в таблице и не исчезает, если вы выбираете другого человека,
а
затем возвращаетесь к предыдущему .
- Вы можете отредактировать информацию об имеющейся поездке и
сохранить изменения.
- Если вы ввели в поле Date что-то, не являющееся датой, приложение выдаст сообщение об ошибке.
- Вы можете нажать на кнопку Add Trip несколько раз, прежде
чем
сохранять изменения, это простой способ добавления большого количества
строк за один раз.
- Если вы выберете другого человека, не сохранив изменения, все
ваши изменения (в том числе заполненные новые строки)
будут потеряны.
- Если вы измените некоторые значения и затем щелкните по
одному из заголовков столбцов (для сортировки по этому столбцу),
таблица запомнит сделанные изменения, и они затем могут быть сохранены.
Добавление возможности удаления записей
Теперь добавим возможность удаления строк таблицы.
Пользователь сможет удалить поездку, удалив соответствующую запись из
базы данных. В реализации, рассматриваемой в этом пособии, действие
кнопки Delete является немедленным и не требует нажатия на кнопку Save
Changes для реального удаления записей из базы данных. При этом,
поскольку обработчик событий кнопки Delete использует метод commitChanges(),
он также сохраняет все сделанные изменения тем же образом, что и кнопка
Save Changes.
Добавление кнопки Delete к каждой строке
- В дизайнере щелкните п
|