:






от mashamm | skachatreferat.ru






азработка системы сбора статистики посещаемости сайтов под высокую нагрузку

от mashamm | skachatreferat.ru

КАЗАНСКИЙ (П ИВОЛЖСКИЙ) ФЕДЕ АЛНЫЙ УНИВЕ СИТЕТ

ИНСТИТУТ ВЫЧИСЛИТЕЛНОЙ МАТЕМАТИКИ И ИНФО МАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕД А СИСТЕМНОГО АНАЛИЗА И ИНФО МАЦИОННЫХ ТЕХНОЛОГИЙ

КУ СОВАЯ АБОТА
на тему:
азработка системы сбора статистики посещаемости сайтов под высокую нагрузку

Студент: Мягкова М.А.
Группа: 981и
уководитель: ассистент кафедры системного анализа и информационных технологий Шлянников А.В.

Казань 2011

Содержание:

1. Цели работы...3
2. Функции системы..5
3. Архитектура и компоненты......6
4. еализация....10
5. Заключение...22
6. Приложение..23
7. Список использованных источников.63

 

1. Цели работы.

На сегодняшний день много бизнес-процессов проходит в сети интернет. Существует множество сайтов, с помощью которых люди создают или расширяют свое дело. Но им как разумным бизнесменам нужна информация, статистика посещения сайтов, чтобы оценить рентабельность предприятия.
Очевидно, что владельцам разнообразных интернет магазинов нужна подобная информация. Но если подумать, то в любом бизнес-процессе нужна продуманная маркетинговая компания, которая, конечно, создается профессиональными маркетологами, однако первые данные, необходимые для создания маркетинговой концепции, это статистика посещения. В то же время эти данные становятся одним из основных критериев оценки эффективности данной концепции. К тому же есть давно процветающий бизнес интернет рекламы на сайтах, а чтобы правильно оценить стоимость расположения рекламы, нужна опять же информация.
Именно поэтому данная тема актуальна, а учитывая рост сети интернет, нельзя сомневаться в ее перспективности. Это подтверждает наличие подобных систем:
* Google Analytics
* LiveInternet
* Система статистики Mail.ru

Цели задачи:

Система представляет собой серверное приложение с WEB-интерфейсом. Владельцы любых сторонних сайтов регистрируются в системе и получают сгенерированный html-код для встраивания на страницы своего сайта. Далее, при посещении страниц этих сайтов встроенный код делает запрос специального вида в мою систему, и таким образом учитывается факт посещения страницы. И затем владельцы сайтов также через WEB-интерфейс могут зайти в систему и получить статистику посещения в виде графиков. Поскольку сторонних сайтов может быть много, и некоторые из них могут иметьочень большое количество посетителей, то система должна держать высокую нагрузку.
Учебные цели:
1. Получение практических навыков по основам программирования на языке Java, а также знакомство со специфическими профессиональными Java Server-Side технологиями проектирования и разработки (Servlet, JSP, JFreeChart);
2. Ознакомление и использование Open Source JBoss Application Server, Apache Tomcat, JBossAS, СУБД H2;
3. Применение полученных знаний по работе с HTML.

2.Функции системы
1. Аутентификация пользователя.
Доступ к web-интерфейсу пользования системой предоставляется только после ввода логина и пароля.

2. Генерация html кода.
После регистрации сайта генерируется код, который должен быть размещен на этом сайте.
3. абота с сайтами.
Пользователь может создать или удалить сайт, посмотреть сгенерированный для него код.
4. Переменные границы подсчета статистики.
Пользователь сам задает интересующий его временной интервал, по которому считается статистика.
5. Уникальность посещений.
Также пользователь выбирает, какие посещения надо учесть: все или только новых посетителей.
6. Создание графика.
По всем введенным параметрам строится столбцовый график.
7. егистрация посещения сайта.
Как только посетитель заходит на сайт, на сервер поступает запрос, и факт посещения заносится в базу данных.
8. Проверка уникальности посещений.
Каждый посетитель проверятся на наличие его в базе данных, и регистрируется, если он впервые посещает данный сайт.
9. Обработка исключений.
В случае ошибки выведется причина оной.
3.Архитектура и компоненты
Практически любая крупная современная информационная система имеет многоуровневую архитектуру, что позволяет разделить реализацию этих уровней. На сегодняшний день стандартом для разработки таких систем принята трехуровневая веб-ориентированная архитектура. Она предоставляет возможность применять любой интернет-браузер как клиента информационной системы, что решает проблему неоднородности программного обеспечения.
Первый уровень системы отвечает за представление и управляется одним или несколькими серверами веб-приложений. Второй уровнь это бизнес-логика, которая управляется сервером приложений. На третьем, самом нижнем уровне, находится хранилище данных, в основе которого лежит одна из систем управления базами данных.
В состав системы входят не полностьюравнозначные компоненты, а выделяется один компьютер-сервер и множество компьютеров-клиентов. Сервер всегда один в работающем приложении и приложение не может функционировать без сервера. Клиентов же, наоборот, может быть произвольное количество, и клиенты могут отсутствовать.
Взаимодействие между сервером и клиентами осуществляется посредством запросов, которые клиенты периодически отправляют на сервер. Сервер обрабатывает клиентские запросы, генерирует необходимую информацию и отправляет ее клиентам. В данном приложении клиент может не только отображать информацию, обрабатываемую на сервере, но и отправляет запросы на изменение данных.

исунок 1. Архитектура веб-системы
Центральное место в любой информационной системе уровня предприятия занимает сервер приложений, который отвечает за выполнение бизнес-логики всей системы. Именно выбор сервера приложений играет основную роль при выборе платформы для создания информационной системы, поскольку от этого зависит выбор таких компонентов как сервера веб-приложений и системы управления базами данных.
В качестве сервера-приложений для нашей веб-системы был выбран JBoss Application Server версии 5.1.0.GA. JBoss 5 является следующим поколением сервера приложений JBoss, построенным на базе нового JBoss Microcontainer. JBoss Microcontainer является облегченным контейнером для управления POJO, их развертыванием, конфигурацией и жизненным циклом.

исунок 2. Компоненты JBoss AS
JBoss5 построен вокруг передовой концепции Virtual Deployment Framework (VDF), которая берет аспектно-ориентированный дизайн от многих ранних контейнеров JBoss и применяет это на уровне развертывания. Деплойеры работают по цепочке через VFS, анализируют развертывания и предоставляют метаданные, используемые JBoss Microcontainer, который в свою очередь инстанцирует и связывает вместе различные части развертывания, контролируя их жизненный цикл и зависимости.
Многие ключевые возможности JBoss 5, которые используются в работе веб-системы, предоставляются через интеграцию других автономных проектов JBoss:
* JBoss EJB3, включенный в JBoss 5, предоставляет реализацию последней ревизии спецификации Enterprise Java Beans (EJB). EJB 3.0 является глубоко изученной и упрощенной спецификацией EJB. Целями EJB 3.0 являются упрощенная разработка, содействие подходу разработки через тесты, и фокусирование больше на написании POJO, чем кодировании средствами сложных EJB API.
* JBossWS является стеком веб-сервисов для JBoss 5, предоставляющие Java EE совместимые веб-сервисы, JAX-WS-2.0..
* JBoss Transactions является менеджером транзакций по умолчанию для JBoss 5. JBoss Transactions основан на индустриально проверенной технологии и 18 летней истории как лидера в распределенных транзакциях, и является одним из наиболее доступных интероперабельных реализаций.
* JBoss Web является Web контейнером в JBoss 5, реализация которого основана на Apache Tomcat, который включает Apache Portable Runtime (APR) и нативные технологии Tomcat, достигающие масштабируемости и производительных характеристик, которые сравнимы и превышаю Apache Http Server.
Одной из требуемых функций системы является ее взаимодействие с базой данных. Для этого на компьютере-сервере должна быть установлена система управления базой данных (СУБД), к которой компоненты приложения обращаются с запросами на выборку необходимой информации. В данной системе клиент напрямую не взаимодействует с СУБД, а только через сервер.
В качестве СУБД была использована H2 - открытая кроссплатформенная СУБД полностью написанная на языке Java. Несмотря на малый размер (чуть более 1 МБ) H2 отличается:
* Высокой скоростью работы и стабильностью
* Функционированием в режимах: Клиент-сервер, встроенный, в памяти
* Консолью управления работающей через любой браузер
* Полной поддержкой JDBC API
* Поддержкой стандартного синтаксиса SQL
* Поддержкой транзакций
* Поддержкой механизмов поддержания целостности (первичные и внешние ключи)
* Поддержкой внешних соединений
* Возможностью шифрования файлов СУБД
* Поддержкой режима совместимости для IBM DB2, Apache Derby, HSQLDB, MS SQL Server, MySQL, Oracle и PostgreSQL

4. еализация

* Шаблон проектирования MVC
В качестве шаблона проектирования главных компонент системы, а именно просмотра статистики, был использован MVC.
Model-View-Controller (MVC, Модель-представление-поведение, Модель-представление-контроллер) архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что изменение одного из компонентов оказывает минимальное воздействие на другие компоненты.

исунок 3. Архитектура проектирования MVC
Представление (вид) отвечает за отображение информации, поступающей из системы или в систему.
Модель предоставляет данные, отвечает за непосредственные алгоритмы, расчёты и реагирует на запросыконтроллера, изменяя свое состояние.
Контроллер является связующим звеном между представлением и моделью системы, посредством которого и существует возможность произвести разделение между ними. Контроллер получает данные от пользователя и передаёт их в модель. Кроме того, он получает сообщения от модели, и передаёт их в представление.
Важно отметить, что как представление, так и поведение зависят от модели. Однако модель не зависит ни от представления, ни от поведения. Это одно из ключевых достоинств подобного разделения. Оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
* Язык программирования Java
Система полностью реализована на языке Java. Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.
Достоинство подобного способа выполнения программ в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина. Другой важной особенностью технологии Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции, которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание.

Структура БД
Начнем с описания таблиц БД. Всего в проекте 4 таблицы:
1. USERS таблица с информацией о пользователях системы.
2. SITES таблица с опциями, на которые проверяются серверы.
3. VISITORS таблица с информацией о серверах.
4. VISITEVENTS таблица с логами (записями об ошибках при проверке).


Как видно из схемы данных, в базе данных присутствует только отношения один ко многим, что сильно упрощает в дальнейшем работу с ней.

Модель
Вся модель была вынесена в отдельный пакет. Модель делится на VO (Value Object) и DAO (Data Access Object). У каждой таблицы есть соответствующие классы VO, описывающие её.
Класс Users с полями:
private int idUser;
private String login;
private String password;
К каждому полю есть свои getterы и settеры, например (getter и setter для поля id):
public int getIdUser() {
return idUser;
}

publicvoid setIdUser(int idUser) {
this.idUser = idUser;
}
Так же в данном классе расположены конструкторы класса, например:
public User(int idUser, String login, String password){
this.idUser= idUser;
this.login = login;
this.password = password;
}

В пакете DAO прописаны функции с обращениями к базе, которые впоследствии будет использовать контроллер, в том числе функции для выборки, добавления, удаления и другие функции, обращающиеся к базе. Например:
public int authentication(String login, String password) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" select * from Users3 where login=? and password=? ");
statement.setString(1, login);
statement.setString(2, password);
ResultSet resultSet = statement.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idUser"));
} else {
return 0;
}
} finally {
if (connection! = null) {
connection.close();
}
}
}
Также в DAO есть класс, отвечающий за построение графиков StackedXYBarChartPNG, в котором создаем столбцовую диаграмму:
// Render
// 0.02 - расстояние между столбиками
StackedXYBarRenderer renderer = new StackedXYBarRenderer(0.2);
// без рамки
renderer.setDrawBarOutline(false);
// цвета для каждого элемента стопки
renderer.setSeriesPaint(0, Color.blue);

Контроллер
Контроллер также выделен в отдельный пакет. В нем находится все логика приложения. Именно здесь описаны сервлеты, с помощью которых осуществляется работа web-интерфейса системы. Servlet это класс для обработки запросов с сервера.
Мой сервлет наследует класс HttpServlet и имеют методы doPost, doGet и init.
Именно в методах doPost и doGet определяются действия, которые надо выполнить приложению в ответ на пришедшие запросы (get или post):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String action = request.getParameter(Constants.PARAM_ACTION);
if (action == null) {
action = Constants.ACTION_AUTH; }
if (action.equals(Constants.ACTION_SITES_REG)) {
include(request, response, Constants.JSP_REG_SITE);
}else if (action.equals(Constants.ACTION_REGISTR)) {
include(request, response, Constants.JSP_REG);
}
else if (action.equals(Constants.ACTION_ALL)) {
int idUser = (Integer) request.getSession().getAttribute(Constants.PARAM_IDUSER);
List< Site> sites = inter.getAllSites(idUser);
request.setAttribute(Constants.ATTRIBUTE_SITES, sites);
include(request, response, Constants.JSP_SITES);
}

} catch (RuntimeException e) {
// User hacking our urls
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Bad request");
include(request, response, Constants.JSP_ERROR);
} catch (Exception e) {
// Unknown f***up
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, e.getMessage());
include(request, response, Constants.JSP_ERROR);
}
}


Представление
Непосредственно интерфейс был реализован с помощью JSP страничек. Java Server Pages (JSP) позволили отделить динамическую часть страниц от статического HTML.
JSP (Java Server Pages) технология, позволяющая веб-разработчикам легко создавать содержимое, которое имеет как статические, так и динамические компоненты. По сути страница JSP является текстовым документом, которая содержит текст двух типов: статические исходные данные, которые могут быть оформлены в одном из текстовых форматов HTML, SVG, WML, или XML, и JSP элементы, которые конструируют динамическое содержимое. Кроме этого могут использоваться библиотеки JSP тегов для внедрения Java-кода.
JavaServer Pages (JSP) позволяют отделить динамическую часть страниц от статического HTML. Процедура довольно проста, создаёте обычный код HTML (статический), а динамическую часть заключаете в специальные тэги " < % %> ":
< %@ page import=" Controller.Constants" %>
< %@ page import=" Model.VO.Site" %>
< %@ page import=" java.util.List" %>
< %@ page contentType=" text/html; charset=UTF-8" language=" java" %>
< %
List< Site> sites = (List< Site>) request.getAttribute(Constants.ATTRIBUTE_SITES);
String contextPath = request.getContextPath();
String user = (String)request.getSession().getAttribute(Constants.PARAM_LOGIN);
%>
< htmlstyle=" width: 100%; text-align: center; background: #CCCC66; " >
< head> < title> Your sites< /title> < /head>
< body>
< div style=" width: 100%; text-align: center; " >
< h3> Sites< /h3>
< td> Logged in as " < %=user%> " < /td>
< br/>
< br/>

< table>
< %
for (Site site: sites) {
%>
< tr>
< td> " < %=site.getIdSite()%> " < /td>
< td> " < %=site.getName()%> " < /td>
< td> " < %=site.getAddress()%> " < /td>
< td>
< form action=" < %=contextPath%> /servlet" method=" post" >
< input type=" hidden" name=" < %=Constants.ATTRIBUTE_IDSITES%> " value=" < %=site.getIdSite()%> " >
< input type=" hidden" name=" < %=Constants.PARAM_ACTION%> " value=" < %=Constants.ACTION_STAT%> " >
< input type=" submit" name=" submit" value=" Statistics" >
< /form>
< /td>
< td>
< form action=" < %=contextPath%> /servlet" method=" post" >
< input type=" hidden" name=" < %=Constants.ATTRIBUTE_IDSITES%> " value=" < %=site.getIdSite()%> " >
< input type=" hidden" name=" < %=Constants.PARAM_ACTION%> " value=" < %=Constants.ACTION_DELETE%> " >
< input type=" submit" name=" submit" value=" Delete" onclick=" return confirm('Delete this site? '); " >
< /form>
< /td>
< td>
< textarea cols=60> < img height=0 width=0 src=" < %=contextPath%> /servlet? < %=Constants.PARAM_ACTION%> =< %=Constants.ACTION_VISIT%> & < %=Constants.ATTRIBUTE_IDSITES%> =< %=site.getIdSite()%> " > < /textarea>
< /td>
< /tr>
< %
}
%>
< tr>
< td colspan=" 4" >
< a href=" < %=contextPath%> /servlet? < %=Constants.PARAM_ACTION%> =< %=Constants.ACTION_SITES_REG%> " > Add site< /a>
< /td>
< /tr>
< /table> < /div>
< /body>
< /html>
JFreeChart
Собственно представление результатов работы системы происходит посредством графиков, которые генерируются с помощью открытой библиотеки JFreeChart. Для этого создавался класс в DAO, который создавал график:
package Model.DAO;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.VerticalAlignment;

import java.awt.*;

public class StackedXYBarChartPNG extends JFreeChart {

public StackedXYBarChartPNG(TableXYDataset dataset) {
super(new XYPlot());

// OX
// задаем название оси
DateAxis domainAxis = new DateAxis(" Date");

// Показываем стрелочку вправо
domainAxis.setPositiveArrowVisible(true);
// Задаем отступ от графика
domainAxis.setUpperMargin(0.2);

// OY
// Задаём название оси
NumberAxis rangeAxis = new NumberAxis(" Visit");

rangeAxis.setStandardTickUnits(NumberAxis.createStandardTickUnits());
rangeAxis.setTickUnit(new NumberTickUnit(1));
// Показываем стрелочку вверх
rangeAxis.setPositiveArrowVisible(true);

// Render
// 0.02 - расстояние между столбиками
StackedXYBarRenderer renderer = new StackedXYBarRenderer(0.2);
// без рамки
renderer.setDrawBarOutline(false);
// цвета для каждого элемента стопки
renderer.setSeriesPaint(0, Color.blue);

// Plot
// Создаем область рисования
XYPlot plot = getXYPlot();
plot.setDataset(dataset);
plot.setDomainAxis(domainAxis);
plot.setRangeAxis(rangeAxis);
plot.setRenderer(renderer);
// Закрашиваем
plot.setBackgroundPaint(Color.white);
// Закрашиваем сетку
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
// Отступ от осей
plot.setAxisOffset(new RectangleInsets(0D, 0D, 10D, 10D));
plot.setOutlinePaint(null);

// Chart
// ЗакрашиваемsetBackgroundPaint(Color.white);
// Перемещаем легенду в верхний правый угол
getLegend().setPosition(RectangleEdge.RIGHT);
getLegend().setVerticalAlignment(VerticalAlignment.TOP);
}
}

А потом в сервлете он отправляется на отображение:
JFreeChart chart;
chart = new StackedXYBarChartPNG(dataset);
chart.setBorderVisible(false);
chart.setAntiAlias(true);
response.setContentType(" image/png");
ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, 500, 500);

5.Заключение
Итак, мне удалось решить поставленную перед нами задачу. Я создала многопользовательскую систему сбора статистики посещаемости сайтов с WEB-интерфейсом, результаты которого представляются в графическом виде. Таким образом, созданное веб-приложение вполне соответствует поставленным требованиям и реализует необходимые функции. Поэтому я думаю, что моя система может найти свое применение на практике. Для практического использования также был разработан интуитивно-понятный web-интерфейс. К тому же, при выполнении работы были достигнуты значительные учебные цели: мы научились пользоваться многими технологиями, применяющимися в языке Java, продолжила свое знакомство с СУБД Н2, что сделало мою работу не только некой необходимостью, но и познавательным процессом.
Дальнейшее развитие системы может проводиться в направлении сбора статистики по другим параметрам, представления разнообразных отчетов и реализации очередей и потоков для более эффективной работы.

6. Приложение.
6.1 Скриншоты

Авторизация

Список сайтов

егистрация сайта

Удаление сайта

Параметры статистики

График

7.2 Исходный код проекта.
Модель
VO понятно как выглядит из вышеописанного, поэтому здесь его кода не будет. DAO состоит из двух классов. Один работает с базой данных:
Implementation.java

package Model.DAO;

import Model.VO.Site;
import Model.VO.VisitEvent;
import Model.VO.Visitor;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimePeriod;
import org.jfree.data.time.TimeTableXYDataset;

import java.io.IOException;
import java.sql.*;
import java.util.*;
import java.util.Date;

public class Implementation implements Interface {

private String driver;
private String url;
private String user;
private String pass;

public Implementation(String driver, String url, String user, String pass) throws SQLException, IOException, ClassNotFoundException {
this.driver = driver;
this.url = url;
this.user = user;
this.pass = pass;
}

private Connection getConnection() throws SQLException {
try {
Class.forName(driver);
return DriverManager.getConnection(url, user, pass);
} catch (Exception e) {
throw new SQLException(e.getMessage(), e);
}
}

private void createTables() throws SQLException, ClassNotFoundException, IOException {
Connection connection = null;
try {
connection = getConnection();
Statement statement = connection.createStatement();
statement.executeUpdate(" create table Users3 " +
" (idUser int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, " +
" login varchar, " +
" password varchar)");
statement.executeUpdate(" create table Sites3 " +
" (idSite int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, " +
" name varchar, " +
" address varchar, " +
" idOwner int)");
statement.executeUpdate(" create table VisitEvents3 " +
" (idVisitEvent int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, " +
" idSite int, " +
" idVisitor int, " +
" ip varchar, " +
" date timestamp)");
statement.executeUpdate(" create table Visitors3 " +
" (idVisitor int GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY, " +
" dateCreate timestamp)");
} finally {
if (connection! = null) {
connection.close();
}
}
}

public int createNewUser(String login, String password) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" insert intoUsers3" +
" (login, password)" +
" values(?,?)");
statement.setString(1, login);
statement.setString(2, password);
statement.executeUpdate();
PreparedStatement statement1 = connection.prepareStatement(" select * from Users3 where login=? and password=? ");
statement1.setString(1, login);
statement1.setString(2, password);
ResultSet resultSet = statement1.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idUser"));
} else {
return 0;
}
}
finally {
if (connection! = null) {
connection.close();
}
}
}

public int createNewSite(String name, String address, int idOwner) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" insert into Sites3" +
" (name, address, idOwner)" +
" values(?,?,?)");
statement.setString(1, name);
statement.setString(2, address);
statement.setInt(3, idOwner);
statement.executeUpdate();
PreparedStatement statement1 = connection.prepareStatement(" select * from Sites3 where name=? and address=? and idOwner=? ");
statement1.setString(1, name);
statement1.setString(2, address);
statement1.setInt(3, idOwner);
ResultSet resultSet = statement1.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idSite"));
} else {
return 0;
}
}
finally {
if (connection! = null) {
connection.close();
}
}

}

public int createNewVisitor(Date dateCreate) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" insert into Visitors3" +
" (dateCreate)" +
" values(?)");
statement.setTimestamp(1, new Timestamp(dateCreate.getTime()));
statement.executeUpdate();
PreparedStatement statement1 = connection.prepareStatement(" select * from Visitors3 where dateCreate=? ");
statement.setTimestamp(1, new Timestamp(dateCreate.getTime()));
ResultSet resultSet = statement1.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idVisitor"));
} else {
return 0;
}
}
finally {
if (connection! = null) {
connection.close();
}
}
}

public int createNewVisitEvent(Date timestamp, int idSite, int idVisitor, String ip) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" insert into VisitEvents3" +
" (date, idSite, idVisitor, ip)" +
" values(?,?,?,?)");
statement.setTimestamp(1, new Timestamp(timestamp.getTime()));
statement.setInt(2, idSite);
statement.setInt(3, idVisitor);
statement.setString(4, ip);
statement.executeUpdate();
PreparedStatement statement1 = connection.prepareStatement(" select * from Visitors3 where and timestamp=? and idSite=? and idVisitor=? and ip=? ");
statement1.setTimestamp(1, new Timestamp(timestamp.getTime()));
statement1.setInt(2, idSite);
statement1.setInt(3, idVisitor);
statement1.setString(4, ip);
ResultSet resultSet = statement1.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idVisitEvent"));
} else {
return 0;
}
}
finally {
if (connection! = null) {
connection.close();
}
}
}public int authentication(String login, String password) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" select * from Users3 where login=? and password=? ");
statement.setString(1, login);
statement.setString(2, password);
ResultSet resultSet = statement.executeQuery();
if (resultSet! = null) {
resultSet.next();
return resultSet.getInt(resultSet.findColumn(" idUser"));
} else {
return 0;
}
} finally {
if (connection! = null) {
connection.close();
}
}
}

public void deleteSite(int idSite, int idOwner) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" delete from Sites3 where idSite =? and idOwner=? ");
statement.setInt(1, idSite);
statement.setInt(2, idOwner);
statement.executeUpdate();
} finally {
if (connection! = null) {
connection.close();
}
}

}

public List< Site> getAllSites(int idOwner) throws SQLException {
List< Site> list = new ArrayList< Site> ();
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" select * from Sites3 where idOwner =? ");
statement.setInt(1, idOwner);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new Site(resultSet.getInt(" idSite"), resultSet.getString(" name"), resultSet.getInt(" idOwner"), resultSet.getString(" address")));
}
return list;
} finally {
if (connection! = null) {
connection.close();
}
}
}

public List< VisitEvent> getAllEventsV(int idVisitor) throws SQLException {
List< VisitEvent> list = new ArrayList< VisitEvent> ();
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement =connection.prepareStatement(" select * from VisitEvents3 where idVisitor =? ");
statement.setInt(1, idVisitor);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new VisitEvent(resultSet.getInt(" idVisitEvent"), resultSet.getDate(" date"), resultSet.getInt(" idSite"), idVisitor, resultSet.getString(" ip")));
}
return list;
} finally {
if (connection! = null) {
connection.close();
}
}
}

public List< VisitEvent> getAllEventsS(int idSite) throws SQLException {
List< VisitEvent> list = new ArrayList< VisitEvent> ();
Connection connection = null;
try {
connection = getConnection();
PreparedStatement statement = connection.prepareStatement(" select * from VisitEvents3 where idSite =? ");
statement.setInt(1, idSite);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new VisitEvent(resultSet.getInt(" idVisitEvent"), resultSet.getDate(" date"), idSite, resultSet.getInt(" idVisitor"), resultSet.getString(" ip")));
}
return list;
} finally {
if (connection! = null) {
connection.close();
}
}
}

public void stattime(Date start, Date end, int uniq, int idSite, TimeTableXYDataset dataset) throws SQLException {
Connection connection = null;
try {
connection = getConnection();
List< VisitEvent> visitEventsList;
visitEventsList = getAllEventsS(idSite);
List< VisitEvent> timestat = new ArrayList< VisitEvent> ();
if (uniq==0){
for(VisitEvent temp: visitEventsList){
if ((temp.getTimestamp().before(end))& & (temp.getTimestamp().after(start))){
timestat.add(temp);
}
}
if (start.getYear()==end.getYear()){
if (start.getMonth()==end.getMonth()){
if (start.getDate()==end.getDate()){
int[] a = new int[24];
for (int i = 0; i < 24; i++) {
a[i]= i; for(VisitEvent b: timestat){
if (b.getTimestamp().getHours() == a[i]){
a[i]++;
}
}
dataset.add(new Hour(i, start.getDate(), start.getMonth(), start.getYear()), a[i], " Visits");
}
}
int p = end.getDate() - start.getDate() + 1;
int[][] a = new int[2][p];
for (int i=0; i< p; i++){
a[0][i] = start.getDate()+i;
for (VisitEvent q: timestat){
if (q.getTimestamp().getDate() ==a[0][i]){
a[1][i]++;
}
}
Date b = new Date(start.getYear(), start.getMonth(), a[0][i]);
dataset.add((TimePeriod) b, a[1][i], " Visits");
}
}
int m = end.getMonth() - start.getMonth() + 1;
int[][] a = new int[2][m];
for (int i=0; i< m; i++){
a[0][i] = start.getMonth()+i;
for (VisitEvent q: timestat){
if (q.getTimestamp().getMonth() ==a[0][i]){
a[1][i]++;
}
}
dataset.add(new Month(a[0][i], start.getYear()), a[1][i], " Visits");
}
}
}

if (uniq==1){
List< Visitor> timestat1 = new ArrayList< Visitor> ();
PreparedStatement statement12 = connection.prepareStatement(" select * from Visitors3 where dateCreate between? and? ");
statement12.setTimestamp(1, new Timestamp(start.getTime()));
statement12.setTimestamp(2, new Timestamp(end.getTime()));
ResultSet resultSet = statement12.executeQuery();
while (resultSet.next()) {
PreparedStatement statement13 = connection.prepareStatement(" select * from VisitEvents3 where dateCreate =? and idVisitor =? and idSite =? ");
statement13.setTimestamp(1, newTimestamp(resultSet.getDate(" dateCreate").getTime()));
statement13.setInt(2, resultSet.getInt(" idVisitor"));
statement13.setInt(3, idSite);
timestat1.add(new Visitor(resultSet.getInt(" idVisitor"), resultSet.getDate(" dateCreate")));
}
if (start.getYear()==end.getYear()){
if (start.getMonth()==end.getMonth()){
if (start.getDate()==end.getDate()){
int[] a = new int[24];
for (int i = 0; i < 24; i++) {
for(Visitor b: timestat1){
if (b.getDateCreate().getHours() == a[i]){
a[i]++;
}
}
dataset.add(new Hour(i, start.getDate(), start.getMonth(), start.getYear()), a[i], " Visitors");
}
}
int p = end.getDate() - start.getDate() + 1;
int[][] a = new int[2][p];
for (int i=0; i< p; i++){
a[0][i] = start.getDate() + i;
for (Visitor q: timestat1){
if (q.getDateCreate().getDate() ==a[0][i]){
a[1][i]++;
}
}
dataset.add((TimePeriod) new Date(start.getYear(), start.getMonth(), a[0][i]), a[1][i], " Visitors");
}
}
int m = end.getMonth() - start.getMonth() + 1;
int[][] a = new int[2][m];
for (int i=0; i< m; i++){
a[0][i] = start.getMonth()+i;
for (Visitor q: timestat1){
if (q.getDateCreate().getMonth() ==a[0][i]){
a[1][i]++;
}
}
dataset.add(new Month(a[0][i], start.getYear()), a[1][i], " Visitors");
}
}
}
} finally {
if (connection! = null) {
connection.close();
}
}
}
}

Второй класс, генерирующий график: StackedXYBarChartPNG.java
package Model.DAO;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.VerticalAlignment;

import java.awt.*;

public class StackedXYBarChartPNG extends JFreeChart {

public StackedXYBarChartPNG(TableXYDataset dataset) {
super(new XYPlot());

// OX
// задаем название оси
DateAxis domainAxis = new DateAxis(" Date");

// Показываем стрелочку вправо
domainAxis.setPositiveArrowVisible(true);
// Задаем отступ от графика
domainAxis.setUpperMargin(0.2);

// OY
// Задаём название оси
NumberAxis rangeAxis = new NumberAxis(" Visit");

rangeAxis.setStandardTickUnits(NumberAxis.createStandardTickUnits());
rangeAxis.setTickUnit(new NumberTickUnit(1));
// Показываем стрелочку вверх
rangeAxis.setPositiveArrowVisible(true);

// Render
// 0.02 - расстояние между столбиками
StackedXYBarRenderer renderer = new StackedXYBarRenderer(0.2);
// без рамки
renderer.setDrawBarOutline(false);
// цвета для каждого элемента стопки
renderer.setSeriesPaint(0, Color.blue);

// Plot
// Создаем область рисования
XYPlot plot = getXYPlot();
plot.setDataset(dataset);
plot.setDomainAxis(domainAxis);
plot.setRangeAxis(rangeAxis);
plot.setRenderer(renderer);
// Закрашиваем
plot.setBackgroundPaint(Color.white);
// Закрашиваем сетку
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
// Отступ от осей
plot.setAxisOffset(new RectangleInsets(0D, 0D, 10D, 10D));
plot.setOutlinePaint(null);

// Chart
// Закрашиваем
setBackgroundPaint(Color.white);
// Перемещаем легенду в верхний правый угол
getLegend().setPosition(RectangleEdge.RIGHT);
getLegend().setVerticalAlignment(VerticalAlignment.TOP);
}
}

Контроллер
Constants.java

package Controller;

public interface Constants {
String ACTION_AUTH =" auth";
String ACTION_ALL = " all";
String ACTION_REG = " reg";
String ACTION_REGISTR = " registr";
String ACTION_SITES_REG = " sites_reg";
String ACTION_REG_SITE = " reg_site";
String ACTION_STAT = " stat";
String ACTION_DELETE = " delete";
String ACTION_VISIT = " visit";
String ACTION_TIME = " time";
String ATTRIBUTE_MESSAGE = " message";
String ATTRIBUTE_SITES = " sites.jsp";
String ATTRIBUTE_IDSITES = " idSites";
String PARAM_ACTION = " action";
String PARAM_LOGIN = " login";
String PARAM_IDUSER = " idUser";
String PARAM_PASSWORD = " password";
String PARAM_ADDRESS = " address";
String PARAM_NAME = " name";
String PARAM_START1 = " start1";
String PARAM_START2 = " start2";
String PARAM_START3 = " start3";
String PARAM_END1 = " end1";
String PARAM_END2= " end2";
String PARAM_END3 = " end3";
String PARAM_UNIQUE = " uniq";
String JSP_ERROR = " /WEB-INF/jsp/error.jsp";
String JSP_REG = " WEB-INF/jsp/registration.jsp";
String JSP_REG_SITE = " /WEB-INF/jsp/regsite.jsp";
String JSP_SUCCESS = " /WEB-INF/jsp/success.jsp";
String JSP_SITES = " /WEB-INF/jsp/sites.jsp";
String JSP_STAT = " /WEB-INF/jsp/statistic.jsp";
String JSP_GRAPHICS = " /WEB-INF/jsp/graphics.jsp";

HotelServlet.java

package Controller;

import Model.DAO.Implementation;
import Model.DAO.Interface;
import Model.DAO.StackedXYBarChartPNG;
import Model.VO.Site;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.time.TimeTableXYDataset;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.*;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;

public class HotelServlet extends HttpServlet{
private Interface inter;
int ID = 0;

public void init() throws ServletException {
String driver = getInitParameter(" driver");
String url = getInitParameter(" url");
String user = getInitParameter(" user");
String pass = getInitParameter(" pass");
try
{
try {
inter = new Implementation(driver, url, user, pass);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch(SQLException e)
{
throw new ServletException(e.getMessage(), e);
}
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String action = request.getParameter(Constants.PARAM_ACTION);
if (action == null) {
action = Constants.ACTION_AUTH;
}
if (action.equals(Constants.ACTION_SITES_REG)) {
include(request, response, Constants.JSP_REG_SITE);
}else if (action.equals(Constants.ACTION_REGISTR)) {
include(request, response, Constants.JSP_REG);
}
else if (action.equals(Constants.ACTION_ALL)) {
int idUser = (Integer) request.getSession().getAttribute(Constants.PARAM_IDUSER);
List< Site> sites = inter.getAllSites(idUser);
request.setAttribute(Constants.ATTRIBUTE_SITES, sites);
include(request, response, Constants.JSP_SITES);
}

} catch (RuntimeException e) {
// User hacking our urls
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Bad request");
include(request, response, Constants.JSP_ERROR);
} catch (Exception e) {
// Unknown f***up
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, e.getMessage());
include(request, response, Constants.JSP_ERROR);
}
}

private void include(HttpServletRequest request, HttpServletResponse response, String jspPath) throws ServletException, IOException {
RequestDispatcher rd = request.getRequestDispatcher(jspPath);
rd.include(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String action = request.getParameter(Constants.PARAM_ACTION);
if(action.equals(Constants.ACTION_AUTH)){
String login = request.getParameter(Constants.PARAM_LOGIN);
String password = request.getParameter(Constants.PARAM_PASSWORD);
int id = inter.authentication(login, password);
request.getSession().setAttribute(Constants.PARAM_IDUSER, id);
request.getSession().setAttribute(Constants.PARAM_LOGIN, login); request.getSession().setAttribute(Constants.PARAM_PASSWORD, password);
List< Site> sites = inter.getAllSites(id);
request.setAttribute(Constants.ATTRIBUTE_SITES, sites);
include(request, response, Constants.JSP_SITES);
}else if(action.equals(Constants.ACTION_REG)){
String login = request.getParameter(Constants.PARAM_LOGIN);
String password = request.getParameter(Constants.PARAM_PASSWORD);
int id = inter.createNewUser(login, password);
request.getSession().setAttribute(Constants.PARAM_IDUSER, id);
request.getSession().setAttribute(Constants.PARAM_LOGIN, login);
request.getSession().setAttribute(Constants.PARAM_PASSWORD, password);
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Welcome " + login + "! ");
include(request, response, Constants.JSP_SUCCESS);
}else if(action.equals(Constants.ACTION_DELETE)){
String idSite = request.getParameter(Constants.ATTRIBUTE_IDSITES);
int id = Integer.parseInt(idSite);
int idOwner = (Integer) request.getSession().getAttribute(Constants.PARAM_IDUSER);
inter.deleteSite(id, idOwner);
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Site deleted");
include(request, response, Constants.JSP_SUCCESS);
}else if(action.equals(Constants.ACTION_REG_SITE)){
String name = request.getParameter(Constants.PARAM_NAME);
String address = request.getParameter(Constants.PARAM_ADDRESS);
int idOwner = (Integer) request.getSession().getAttribute(Constants.PARAM_IDUSER);
inter.createNewSite(name, address, idOwner);
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Site created");
include(request, response, Constants.JSP_SUCCESS);
}else if(action.equals(Constants.ACTION_VISIT)){
String idSite = request.getParameter(Constants.ATTRIBUTE_IDSITES);
int id = Integer.parseInt(idSite);
int idVisitor;
Cookie counterCookie = null;
Cookie[] cookies = request.getCookies();
if (cookies! = null) {
for (Cookie cookie: cookies) {
if(cookie.getName().equals(" counterCookie")) {
counterCookie = cookie;
break;
}
}
}
if (counterCookie == null) {
Date time = new Date();
String ip = request.getRemoteAddr();
idVisitor = inter.createNewVisitor(time);
inter.createNewVisitEvent(time, id, idVisitor, ip);
counterCookie = new Cookie(" counterCookie", " " + idVisitor);
} else {
idVisitor = Integer.parseInt(counterCookie.getValue());
Date time = new Date();
String ip = request.getRemoteAddr();
inter.createNewVisitEvent(time, id, idVisitor, ip);
}
response.addCookie(counterCookie);
}else if(action.equals(Constants.ACTION_TIME)){
String uniq = request.getParameter(Constants.PARAM_UNIQUE);
int un = Integer.parseInt(uniq);
String starts1 = request.getParameter(Constants.PARAM_START1);
String ends1 = request.getParameter(Constants.PARAM_END1);
String starts2 = request.getParameter(Constants.PARAM_START2);
String ends2 = request.getParameter(Constants.PARAM_END2);
String starts3 = request.getParameter(Constants.PARAM_START3);
String ends3 = request.getParameter(Constants.PARAM_END3);
Date start = new Date(Integer.parseInt(starts3)-1900, Integer.parseInt(starts2)-1, Integer.parseInt(starts1));
Date end = new Date(Integer.parseInt(ends3)-1900, Integer.parseInt(ends2)-1, Integer.parseInt(ends1));
TimeTableXYDataset dataset = new TimeTableXYDataset();
inter.stattime(start, end, un, ID, dataset);
JFreeChart chart;
chart = new StackedXYBarChartPNG(dataset);
chart.setBorderVisible(false);
chart.setAntiAlias(true);
response.setContentType(" image/png");
ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, 500, 500);
include(request, response, Constants.JSP_GRAPHICS);
}else if(action.equals(Constants.ACTION_STAT)){
String idSite = request.getParameter(Constants.ATTRIBUTE_IDSITES); ID = Integer.parseInt(idSite);
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " STATISTIC");
include(request, response, Constants.JSP_STAT);
}

} catch (RuntimeException e) {
// User hacking our urls
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Bad request");
include(request, response, Constants.JSP_ERROR);
} catch (SQLException e) {
// Database unavailable
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, " Database connection error");
include(request, response, Constants.JSP_ERROR);
} catch (Exception e) {
// Unknown f***up
request.setAttribute(Constants.ATTRIBUTE_MESSAGE, e.getMessage());
include(request, response, Constants.JSP_ERROR);
}
}
}

Представление
Представляю пример одной jsp страницы:
Sites.jsp
< %@ page import=" Controller.Constants" %>
< %@ page import=" Model.VO.Site" %>
< %@ page import=" java.util.List" %>
< %@ page contentType=" text/html; charset=UTF-8" language=" java" %>
< %
List< Site> sites = (List< Site>) request.getAttribute(Constants.ATTRIBUTE_SITES);
String contextPath = request.getContextPath();
String user = (String)request.getSession().getAttribute(Constants.PARAM_LOGIN);
%>
< html style=" width: 100%; text-align: center; background: #CCCC66; " >
< head> < title> Your sites< /title> < /head>
< body>
< div style=" width: 100%; text-align: center; " >
< h3> Sites< /h3>
< td> Logged in as " < %=user%> " < /td>
< br/>
< br/>

< table>
< %
for (Site site: sites) {
%>
< tr>
< td> " < %=site.getIdSite()%> " < /td>
< td> " < %=site.getName()%> " < /td>
< td> " < %=site.getAddress()%> " < /td>
< td>
< form action=" < %=contextPath%> /servlet" method=" post" >
< input type=" hidden" name=" < %=Constants.ATTRIBUTE_IDSITES%> " value=" < %=site.getIdSite()%> " >
< input type=" hidden" name=" < %=Constants.PARAM_ACTION%> " value=" < %=Constants.ACTION_STAT%> " >
< input type=" submit" name=" submit" value=" Statistics" >
< /form>
< /td>
< td>
< form action=" < %=contextPath%> /servlet" method=" post" >
< input type=" hidden" name=" < %=Constants.ATTRIBUTE_IDSITES%> " value=" < %=site.getIdSite()%> " >
< input type=" hidden" name=" < %=Constants.PARAM_ACTION%> " value=" < %=Constants.ACTION_DELETE%> " >
< input type=" submit" name=" submit" value=" Delete" onclick=" return confirm('Delete this site? '); " >
< /form>
< /td>
< td>
< textarea cols=60> < img height=0 width=0 src


:

mylektsii.su - - 2015-2024 . (0.029 .)