- •Содержание
- •Глава 1. Выбор программных средств для реализации Интернет-комплекса «Знание»
- •1.1. Выбор субд (MySql).
- •1) Быстродействие
- •6) Сообщество
- •7) Переносимость
- •1.2. Язык программирования Java
- •1.3. Технология Struts
- •Глава 2. Анализ предметной области и создание концептуальной модели
- •2.1. Сбор информации о предметной области
- •2.2. Выделение сущностей
- •2.3. Определение отношений между сущностями
- •2.4. Создание концептуальной модели
- •Глава 3. Программная реализация Интернет-комплекса
- •3.1. Логическая структура программы
- •3.2. База данных
- •3.3. Классы работающие с базой данных
- •3.4. Классы-сущности
- •3.5.Action-классы
- •3.6. Пользовательский интерфейс
- •Заключение
- •Список использованных источников
- •Приложение а Внешний вид программы
3.4. Классы-сущности
Как было упомянуто выше, для каждой сущности, выделенной на этапе анализа предметной области, создана таблица в базе данных. В принципе, используя SQL запросы к этим таблицам, уже можно реализовать необходимую функциональность приложения. Однако куда более проще и логичнее создать некоторую программную структуру для каждой сущности, и обращаться с соответствующими запросами к ней, а не непосредственно к базе данных. Вся логика работы с данными на диске будет скрыта в этой сущности, и тем самым будет реализован принцип инкапсуляции, который должен обязательно присутствовать в объектно-ориентированном приложении.
Классы, которые относятся к этому логическому слою, находятся в пакете by.knowledge.entities.
Каждая сущность относится к одной определённой записи в таблице базы данных, а полям таблицы соответствуют атрибуты класса. В то же время сущность выступает, как самостоятельный объект, и имеет методы, унаследованные от абстрактного класса AbstractEntity, которые отвечают за загрузку, сохранение, удаление соответствующей записи в таблице. В качестве примера приведём метод, устанавливающий значения полей некоторой сущности.
public boolean load(int id) throws EntityException {
boolean loaded = true;
this.id = id;
try {
DBConnection conn = new DBConnection();
String query = DBQueryHelper.selectQuery(getTableName(), new String[] { "*" }, getSelectCondition());
ResultSet rs = conn.executeQuery(query);
if (loaded = rs.first()) {
setValues(rs, 1);
}
conn.close();
return loaded;
}
catch (DBException e) {
throw new EntityException("Can't load entity", e);
}
catch (SQLException e) {
throw new EntityException("Can't load entity", e);
}
}
Вначале устанавливается соединения с базой данных. Затем формируется SQL-запрос. Для этого методу selectQuery передаются параметры getTableName() (имя таблицы), new String[] { "*" } (множество полей, которые необходимо выбрать, getSelectCondition() (условие отбора).
После проверки, не является ли пустым результат запроса к базе данных, вызывается метод setValues, который присваивает полям объекта полученные значения.
После завершения работы с базой данных соединение закрывается.
Таким образом, классы-сущности позволяют работать с данными на более высоком уровне, чем просто обращение к файлам на диске или к базе данных. Благодаря этому соблюдается принцип модульности: классы, которые работают с сущностями, «не знают» о том, что является источником данных, и каким образом эти данные загружаются.
В пакете by.knowledge.entities расположен также вспомогательный класс EntitiesManager. Он включает в себя часто используемые методы для работы с сущностями, например методы, которые возвращают список всех деятелей или лекториев.
3.5.Action-классы
Совокупность Action-классов представляет собой контроллер приложения. Эти классы находятся в пакете by.knowledge.actions. По своей функциональности action-классы, реализованные в данном приложении, делятся на добавляющие данные, удаляющие данные и другие.
Главный и обычно единственный метод в каждом action-классе – execute. Рассмотрим пример метода execute для класса AddDomainAction:
public class AddDomainAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
AddDomainFormBean domainForm = (AddDomainFormBean) form;
DomainEntity domain = new DomainEntity();
domain.setName(domainForm.getName());
domain.setDescription(domainForm.getDescription());
domain.save();
return (mapping.findForward("success"));
}
}
Метод execute получает в качестве параметра объект класса AddDomainFormBean – форму с заполненными пользователем полями. Далее создаётся новый объект сущности DomainEntity и его поля инициализируются в соответствии со значениями формы. После этого объект domain сохраняется.