Автор работы: Пользователь скрыл имя, 21 Декабря 2011 в 03:02, курсовая работа
Целью данной работы является создание Интернет-комплекса для анализа и хранения информации, который будет использоваться в работе Гродненской областной организации общественного объединения «Белорусское общество «Знание».
Так как между некоторыми таблицами используется связь «многие-ко-многим», то возникла необходимость создать дополнительные промежуточные таблицы:
В каждой из этих таблиц всего два столбца, содержащие значения первичных ключей тех таблиц, для которых данная таблица является промежуточной.
Классы, которые относятся к этому логическому слою, находятся в пакете by.knowledge.database.
Класс DBQueryHelper вспомогательный. Он генерирует SQL запросы к базе данных. Например, рассмотрим метод insertQuery, который конструирует SQL запрос, добавляющий новую запись в таблицу:
public static String insertQuery(String table, String[] fields,
String[] values) {
String query = "INSERT INTO " + table + " (";
for (int i = 0; i < fields.length; i++) {
query += fields[i] + ", ";
}
query = query.substring(0, query.length() - 2);
query += ") VALUES (";
for (int i = 0; i < values.length; i++) {
if ("null".equals(values[i])) {
query += "NULL, ";
}
else {
query += "'" + values[i] + "', ";
}
}
query = query.substring(0, query.length() - 2);
query += ")";
return query;
}
В качестве параметров этот метод принимает название таблицы table, массив названий полей fields и массив соответствующих значений values.
Таким образом, в коде не придётся писать полный запрос типа "INSERT INTO Domains (Name_Domain, Description_Domain) VALUES (‘Экология’, ‘Проблемы экологии’)". А достаточно будет вызвать метод insertQuery, передав ему необходимые параметры. Это позволяет избежать возможных опечаток в запросах и упростить разработку приложения.
Класс DBConnection позволяет работать с базой данных. В нём реализованы методы, с помощью которых открывается и закрывается соединение с базой данных, а также методы, осуществляющие SQL-запросы.
Как было упомянуто выше, для каждой сущности, выделенной на этапе анализа предметной области, создана таблица в базе данных. В принципе, используя 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(
ResultSet rs = conn.executeQuery(query);
if (loaded = rs.first()) {
setVal
}
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. Он включает в себя часто используемые методы для работы с сущностями, например методы, которые возвращают список всех деятелей или лекториев.
Совокупность 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(
domain.
domain.save();
return (mapping.findForward("success"
}
}
Метод execute получает в качестве параметра объект класса AddDomainFormBean – форму с заполненными пользователем полями. Далее создаётся новый объект сущности DomainEntity и его поля инициализируются в соответствии со значениями формы. После этого объект domain сохраняется.
Интерфейс пользователя реализуется в основном с помощью Jsp-страниц. Они расположены в директории WebContent.
В приложении используется два типа Jsp-страниц: для просмотра информации об одном отдельном объекте (например, о мероприятии) и для просмотра списка всех однородных объектов (например, списка всех проведённых мероприятий).
В начале страницы осуществляется проверка на то, является ли посетитель сайта администратором:
boolean hasAdminRights = false;
UserEntity
currentUser = (UserEntity) session.getAttribute("
if (currentUser != null) {
hasAdminRigh
}
Для этого происходит попытка обратится к объекту “currentUser”, расположенному в сессии. Он будет находится в сессии только, если пользователь вошёл под своим логином и паролем.
В зависимости от прав посетителя страница меняет свой внешний вид. Так у администраторов на странице domains.jsp отображается не только список всех направлений деятельности, но и форма для ввода нового направления. А также напротив каждого направления есть кнопка для его удаления.
Таким образом, в курсовом проекте был реализован Интернет-комплекс «Знание» для анализа и хранения информации с использованием программных средств MySQL, Java и технологии Struts.
Были решены следующие задачи:
1. Изучены материалы, касающиеся систем и технологий для их реализации.
2.
Произведено инфологическое
3.
Осуществлена программная
В будущем возможно расширение функциональности Интернет-комплекса. В частности, ведение статистики, которая может быть полезна как пользователям, так и самим сотрудником общества.
Рисунок 1. Страница с информацией о деятеле
Рисунок 2. Регистрация нового пользователя
Рисунок 3. Добавление администратором нового деятеля