Лекция
Привет, сегодня поговорим про динамическая графика в java сервлетах, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое динамическая графика в java сервлетах , настоятельно рекомендую прочитать все из категории Объектно-ориентированное программирование ООП.
Для этой статьи я подготовил примеры, работающие на платформах Java 1.1 и Java 1.2.
public interface ImageProducer {
/**
* MIME тип создаваемого изображения.
*
* @return MIME тип изображения.
*/
public String getMIMEType();
/**
* Создает изображение и записывает его в указанный поток.
*
* @param stream Куда писать картинку.
*/
public void createImage(OutputStream stream)
throws IOException;
}
Интерфейс ImageProducer содержит метод для определения типа изображения и метод для формирования изображения. Об этом говорит сайт https://intellect.icu . Полученная картинка отправляется клиенту.
Следующий код демонстрирует, как сервлет работает с классами, реализующими интерфейс ImageProducer:
ImageProducer imageProducer =
(ImageProducer)
Class.forName(request.getQueryString()).newInstance();
response.setContentType(imageProducer.getMIMEType());
imageProducer.createImage(response.getOutputStream());
Сервлет создает (загружается) класс с именем, указанным в параметрах запроса - части URL справа после "?". Полученный класс приводится к типу ImageProducer. Затем, обращаясь к соответствующим методам, сервлет получает тип и формирует изображение. В случае если нет ошибок, картинка пересылается клиенту. Приведенный код может вызвать несколько исключений, наиболее распространенные из них: ClassNotFoundException и ClassCastException. Первое вызвано тем, что класс, имя которого передано в качестве параметра запроса, не доступен загрузчику (ClassLoader), второе же тем, что указанный класс не реализует интерфейс ImageProducer. В случае ошибки клиент, конечно же, не получает картинку, и броузер выводит изображение, показывающее, что сервер не ответил на запрос. Программа тестировалась с использованием Java Server Web Development Kit (JSWDK 1.0.1), но вы должны получить аналогичные результаты на большинстве других Веб серверах, поддерживающих Java.
Следующие шаги необходимо проделать для формирования PNG изображения с использованием Jimi.
Frame f = new Frame();
f.setVisible(true;
image = f.createImage(ImageWidth, ImageHeight);
graphics = image.getGraphics();
f.setVisible(false);
Ключевой метод класса JIMIProducer - drawSlice. Получая на входе метку и величину сегмента в градусах, этот метод рисует сегмент диаграммы, раскрашивает его и подписывает. Далее, я расскажу подробней, как это происходит. Будем заполнять "внутренности" диаграммы по часовой стрелке, начиная с положения "три часа", то есть первую линию проведем из центра к окружности ограничивающей диаграмму в положении часовой стрелки в три часа дня (или ночи, как вам больше нравиться). Отступим по часовой стрелке необходимое количество градусов и нарисуем вторую линию, ограничивающую сегмент диаграммы. И так далее. Приведенный ниже код получает на входе величину сегмента в градусах и рисует границу этого сегмента. Он вызывается последовательно для всех сегментов, при этом предполагается, что в сумме угловые величины составят 360 градусов.
//*************************************************
// Преобразуем угол в радианы
// 1 градус = pi/180 радиан
//*************************************************
doubletheta = degrees * (3.14/180);
currentTheta += theta;
//*************************************************
// Переводим в декартовы координаты
// x = r cos @
// y = r sin @
//*************************************************
double x = Radius * Math.cos(currentTheta);
double y = Radius * Math.sin(currentTheta);
Point mark2 = newPoint(center);
mark2.translate((int)x,(int)y);
graphics.drawLine
(center.x, center.y, mark2.x, mark2.y);
Затем, нужно раскрасить сегменты диаграммы. Для этого можно воспользоваться очень полезным методом fillArc():
graphics.setColor(colors[colorIndex++]);
graphics.fillArc(Inset,
Inset,
PieWidth,
PieHeight,
-1 * lastAngle,
-1 * degrees);
Последняя задача метода drawSlice() нарисовать метки сегментов. Расположение надписи рассчитывается, основываясь на метрике используемого шрифта. Окончательный вариант диаграммы можно посмотреть на рисунке.

Рис. 1. Окончательный вариант круговой диаграммы. (Не все броузеры показывают файлы формата PNG, поэтому здесь мы поставили GIF файл.)
Практически все интересуются сейчас курсами акций на бирже. Нарисуем (всем на радость) на нашей диаграмме курс акций компании Sun за одну из недель марта.
Для создания изображений в формате JPEG используется класс com.sun.image.codec.jpeg.JPEGImageEncoder. Повторюсь, что принадлежность к пакету com.sun означает, что этот класс не является частью основного API и к нему относятся все соответствующие предупреждения. Класс JPEGImageEncoder "понимает", как перекодировать изображение java.awt.image.BufferedImage, так что его и будем использовать. Для создания класса BufferedImage нужно указать требуемые размеры изображения. После создания, класс BufferedImage предоставляет класс ava.awt.Graphics2D, который можно использовать для рисования на соответствующей классу BufferedImage картинке. Все просто? Итак, основные шаги, необходимые для формирования изображения в формате JPEG:Обсудим некоторые детали рисования с использованием Graphics2D.
Для создания графика курса акций нужно, собственно, нарисовать несколько линий. Пакет Java 2D, java.awt.geom, содержит все необходимые для этого классы. Абстрактный класс Line2D определяет отрезок прямой. Он имеет две реализации, отличающиеся типом используемых координат. Класс Line2D.Double применяет примитивный тип double, а класс Line2D.Float - вещественные числа с плавающей точкой. Высокая точность совершенно излишня для нашего графика, но я не буду экономить и создам отрезки прямой классом Line2D.Double.Приведем, в качестве примера, участок программы, рисующий горизонтальную ось графика:
horAxis = new Line2D.Double(HorzInset,
ImageHeight - VertInset,
ImageWidth - HorzInset,
ImageHeight - VertInset);
graphics.draw(horAxis);
Горизонтальная ось строится с небольшим отступом от границы экрана, предоставляя место для разметки. После создания вы рисуете линю, обращаясь к методу draw() объекта Graphics2D. Напомню, что вы получили его от реализации класса BufferedImage. Класс Graphics2D содержит методы для рисования графических примитивов, для наших целей более чем достаточно. На рисунке 2 приведен окончательный вариант графика.

Рис. 2. Окончательный вариант графика курса акций.
К сожалению, в одной статье не просто дать все знания про динамическая графика в java сервлетах. Но я - старался. Если ты проявишь интерес к раскрытию подробностей,я обязательно напишу продолжение! Надеюсь, что теперь ты понял что такое динамическая графика в java сервлетах и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Объектно-ориентированное программирование ООП
Комментарии