Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2013_1 / КСТ / Разработка веб-приложений.pdf
Скачиваний:
252
Добавлен:
23.02.2015
Размер:
2.74 Mб
Скачать

18.4.Программирование вида для объектов

После создания заготовки вида (см. п. 1.4.4.3) автор приложения должен до-

полнить описания необходимых дизайнеру свойств и методов. Их состав зависит от потребностей в информации и функциях страниц, отправляемых клиенту на браузер.

Обычно это обзорная таблица со всеми полями записей, форма для ввода и коррек-

тировки полей, для удаления записей, форма для ввода задания на поиск и другие.

Рассмотрим потребности дизайна для работы с сущностями на примере простых та-

блиц нашего демонстрационного приложения. Напомним, что для автоматического форматирования и вставки выражений импорта необходимых пакетов нужно исполь-

зовать команды меню «Исходный код – Формат» и «Исходный код – Исправить вы-

ражения импорта».

Первое, что нам будет нужно — обеспечить дизайнера доступом к свойствам

сущности. Для вида сущности класса Cities нужно создать описание его свойства со всеми методами get/set. Для этого нам требуется описание приватного поля экземпля-

ра сущности и соответствующие методы, которые будут выглядеть так:

private Cities city;

//

Поле экземпляра города

public Cities getCity() {

//

Метод получения свойства city

return this.city;

 

 

}

 

 

Для создания экземпляра города в конструктор вида добавим строку, получив:

public CitiesView() { // Конструктор вида без параметров this.city = new Cities(null, "", 0);

}

Параметры вызова конструктора Cities(null, " ", 0) для города имеют следующий смысл:

null — неопределённое значение ключа,

" " — пустое название города,

0 — численность населения.

Таким образом, свойство city нашего вида будет иметь ссылку на «живой» экземпляр сущности Cities с указанными атрибутами. Они будут использоваться на странице добавления нового города.

Свойство city необходимо дизайнеру для доступа к полям сущности при разра-

ботке формы для ввода данных от клиента при добавлении, редактировании и удале-

нии записи. Доступ на чтение этого свойства обеспечивает метод:

public Cities getCity() { return this.city;

}

Для подсчета числа записей в таблице городов (пусть об этом попросил дизай-

нер) создадим вычисляемое (не хранимое) свойство с именем numberOfCities с досту-

пом только на чтение методом getNumberOfCities:

public int getNumberOfCities() { return citiesFacade.findAll().size();

}

219

Для получения списка всех сущностей из базы данных добавим объявление свойства allOfCities вычисляемого методом getAllOfCities:

public List<Cities> getAllOfCities() { return citiesFacade.findAll();

}

Обратите внимание на тип возвращаемого значения — типизированный список

List<Cities> объектов класса Cities. Это то, что нужно будет дизайнеру для организа-

ции просмотра всех записей таблицы городов.

Для приема от клиента и обработки команды на запись в БД добавляемого го-

рода включим в состав класса вида метод без параметров saveCity, который с исполь-

зованием метода фасада create передаст на сохранение в БД содержимое приватного объекта city, хранящего значение свойства нашего вида city. Сохранив объект в БД,

метод вернет навигационную строку, указывающую, какую страницу нужно показать

клиенту следующей. Имя страницы нужно согласовать с дизайнером, в нашем случае

это citiesPage.xhtml.

public String saveCity() { this.citiesFacade.create(city); return "citiesPage";

}

Аналогичный смысл имеют методы для модификации и удаления записей. Метод modCity будет вызываться как обработчик команды редактирования сущности из обзорной таблицы. Он просто сохраняет передаваемый параметром редакти-

руемый экземпляр сущности в свойстве this.city и вызывает страницу city_mod.xhtml

с формой для редактирования.

public String modCity(Cities city) { this.city = city;

return "city_mod";

}

Метод mod_yes_City будет обработчиком командной кнопки Submit — «Принять» данные с формы редактирования для сохранения изменений в БД средствами фасада.

public String mod_yes_City() { this.citiesFacade.edit(city); return "citiesPage";

}

Аналогичный смысл методов для обработки задания на удаление и получения

подтверждения на удаление со страницы запроса.

public String delCity(Cities city) { this.city = city;

return "city_del";

}

public String del_yes_City() { this.citiesFacade.remove(this.city); return "citiesPage";

}

220

Файл CitiesView.java

/*

*To change this template, choose Tools | Templates

*and open the template in the editor.

*/

package Views;

import Entities.Cities; import Facades.CitiesFacade; import java.util.List; import javax.ejb.EJB;

import javax.enterprise.context.SessionScoped; import javax.faces.bean.ManagedBean;

/**

*

* @author cyx */

@ManagedBean(name = "citiesView") @SessionScoped

public class CitiesView {

@EJB

private CitiesFacade citiesFacade; private Cities city;

/** Creates a new instance of CitiesView */ public CitiesView() {

this.city = new Cities(null, "", 0);

}

public Cities getCity() { return this.city;

}

public int getNumberOfCities() { return citiesFacade.findAll().size();

}

public List<Cities> getAllOfCities() { return citiesFacade.findAll();

}

public String saveCity() { this.citiesFacade.create(city); return “citiesPage”;

}

public String modCity(Cities city) { this.city = city;

221

return "city_mod";

}

public String mod_yes_City() { this.citiesFacade.edit(this.city); return "citiesPage";

}

public String delCity(Cities city) { this.city = city;

return "city_del";

}

public String del_yes_City() { this.citiesFacade.remove(this.city); return "citiesPage";

}

}

Упражнения

1.Зачем в описании класса вида присутствует объект фасада сущности?

2.Почему в описании вида нет вызова конструктора фасада сущности? За счет чего устанавливается связь экземпляров фасада и вида?

3.Можно ли в фасаде для города запросить объекты другого класса, например, персоны?

4.Можно ли в виде для города использовать фасад для персон?

18.5. Дизайн главной страницы

При создании проекта была сгенерирована пустая главная страница index.xhtml.

Дизайнер должен наполнить ее содержанием, отвечающим задачам проекта. В нашем

случае требуется организовать работу клиента с тремя таблицами: города, люди, рабочие места. Разместим на странице три ссылки и поясняющий текст. Ссылки будут вызывать соответствующие страницы для обзора содержимого соответствующих та-

блиц. Для доступа к библиотекам тегов их необходимо указать в атрибутах xmlns тега html. Ссылки выполняются тегом commandLink с атрибутом action, задающим нави-

гационную строку с именем следующей страницы (без расширения). Вложенный тег outputText определяет текст ссылки.

Файл index.xhtml

<?xml version=’1.0’ encoding=’UTF-8’ ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/html"

xmlns:f="http://java.sun.com/jsf/core"

xmlns:ui="http://java.sun.com/jsf/facelets"

>

<h:head>

222

Соседние файлы в папке КСТ