Как реализовать пользовательский компонент JSF для рисования диаграммы? - PullRequest
1 голос
/ 28 апреля 2010

Я хочу создать компонент, который можно использовать как:

<mc:chart data="#{bean.data}" width="200" height="300" />

где #{bean.data} возвращает коллекцию некоторых объектов или объекта модели диаграммы или что-то еще, что может быть представлено в виде диаграммы (проще говоря, давайте предположим, что она возвращает коллекцию целых чисел).

Я хочу, чтобы этот компонент генерировал HTML следующим образом:

<img src="someimg123.png" width="200" height="300"/>

Проблема в том, что у меня есть какой-то метод, который может получать данные и возвращать изображение, например:

public RenderedImage getChartImage (Collection<Integer> data) { ... }

и у меня также есть компонент для рисования динамическое изображение :

<o:dynamicImage width="200" height="300" data="#{bean.readyChartImage}/> 

Этот компонент генерирует html точно так, как мне нужно, но его параметр представляет собой массив байтов или RenderedImage, т. Е. Ему нужен метод в bean, например:

public RenderedImage getReadyChartImage () { ... }

Таким образом, один из подходов - использовать propertyChangedListener при отправке для установки данных (Collection<Integer>) для построения диаграммы, а затем использовать компонент <o:dynamicImage />. Но я хотел бы создать свой собственный компонент, который получает данные и рисует диаграмму.

Я пользуюсь фейслетами, но это не так важно. Есть идеи, как создать нужный компонент?

P.S. Одно из решений, о котором я думал, это не использовать <o:dynamicImage/> и использовать какой-нибудь сервлет для потоковой передачи изображения. Но я не знаю, как правильно это реализовать и как связать компонент jsf с сервлетом и как сохранить уже построенные изображения диаграмм (создание нового одинакового изображения для каждого запроса может вызвать проблемы с производительностью imho) и т. Д.

1 Ответ

1 голос
/ 28 апреля 2010

P.S. Одно из решений, о котором я думал, это не использовать и не использовать какой-нибудь сервлет для потоковой передачи изображения. Но я не знаю, как правильно это реализовать и как связать компонент jsf с сервлетом и как сохранить уже построенные изображения диаграмм (создание нового одинакового изображения для каждого запроса может вызвать проблемы с производительностью imho) и т. Д.

Просто дайте ему URL-адрес в качестве атрибута, чтобы он заканчивался как <img src="url">, и позвольте этому URL-адресу указывать на сервлет. Пусть сервлет генерирует / возвращает изображение на основе информации, предоставленной параметрами запроса или pathinfo в URL.

Что касается кеширования, просто сохраните его где-нибудь в файловой системе диска или в БД по некоторому уникальному идентификатору, и пусть сервлет при каждом запросе проверяет его наличие и обрабатывает соответствующим образом.

Для этого уже достаточно всего стандарта <h:graphicImage>. Просто сделайте URL динамическим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...