Как я могу отобразить JFreeChart в веб-браузере с Stripes Framework

Это ситуация: мояmetrics.jsp» Страница представляет пару переменных, которые необходимы для создания диаграммы. 'ProjectActionBean.java» вызывает несколько других java-классов, которые создают JFreeChart. Я могу отобразить график во всплывающем окне, но хочу, чтобы он отображался в исходном окне браузера.

JFreeChart placeChart = ChartFactory.createBarChart(
                                    "ChartName",
                "",             //x-axis label
                "",             //y-axis label
                dataset,
                PlotOrientation.VERTICAL,
                false,          //legend
                true,           //tooltype
                false);         //generate urls
        ChartFrame frame = new ChartFrame(name, placeChart);
        frame.pack();
        frame.setVisible(true);

Ответы на вопрос(3)

Я написал заявление, как это, поэтому я могу заверить вас, чтос выполнимо :)

Во-первых, вам нужно избавиться от всего, чтос графическим интерфейсом. Вы просто нене иметь графический интерфейс на сервере. Это означает, что вашChartFrame frame сбрасывается. Моя основная процедура создания диаграммы выглядит следующим образом:

  private void createChart(XYPlot plot, String fileName, String caption) throws IOException {
      JFreeChart chart = new JFreeChart(caption, plot);
      chart.addSubtitle(this.subtitle);
      if (plot.getRangeAxis() instanceof LogarithmicAxis) {
         chart.addSubtitle(1, new TextTitle("(logarithmische Skala)"));
      }
      File file = new File(fileName);
      file.delete();
      ChartUtilities.saveChartAsPNG(file, chart, CHART_WIDTH, CHART_HEIGHT);
   }

Это создает файл, который вы можете использовать в качестве<img> с вашей веб-страницы. В качестве альтернативы (но немного более продвинутого) вы можете использовать ChartUtilities для создания потока, который вы можете использовать в ответ на запрос URL-адреса изображения.

Еще одна магия, котораянеобходимо сообщить Java, что выповторяю графический код без графического интерфейса. Вам необходимо установить переменную среды

-Djava.awt.headless=true

Для сервера веб-приложений, такого как Tomcat, это входит в сценарий запуска Tomcat.

Обновить

хорошо, да нетChartUtilities.saveChartAsPNG ();» просто сохранить график в файловой системе? Я хочу, чтобы пользователь мог вводить переменные, а затем диаграмма отображалась прямо в браузере.

Пока у вас есть только один пользователь, запись изображений в файловую систему будет работать нормально для сценария, который вы описываете. На самом деле этоКак работала моя первая версия: у меня было 4<img> теги в моей странице ответа HTML из формы, где пользователь указал параметры; и те указали на имена 4 файлов с моими изображениями. Пока вы заканчиваете писать эти файлы, прежде чем возвращать ответ пользователю, это прекрасно работает.

Проблемы появляются, когда у вас есть несколько пользователей. Они могут в конечном итоге просматривать графики, указанные другим пользователем. Существуют возможные обходные пути с кодированием пользователяs ID или сессия в именах файлов графиков, но это становится ужасно быстро. Существует лучший способ, основанный на динамической генерации каждого изображения по требованию, отдельно.

Я неЯ не знаю, сколько вы знаете о HTML / HTTP, поэтому я надеюсь, чтоЯ не собираюсь утомлять вас этим:

Для любого данного HTTP-запроса вы можете вернуть только один поток данных. Как правило, этоэто HTML-страница, то есть поток текста. Если вы хотите изображения на вашей HTML-странице, вы вставляете<img> ссылки с различными URL-адресами на страницу HTML, и вырееще просто возвращаю страницу, полную текста. Браузерзатем идет вперед и запрашивает изображения, запуская запросы для тех URL, упомянутых в<img> теги. Это довольно легко, когда ваши изображения - это просто файлы в файловой системе. Если вам нужны динамически генерируемые изображения, такие как диаграммы, вам нужно придумать URL для каждого типа изображения, которое вы хотите сгенерировать, и сопоставить каждый из этих URL с сервлетом, который знает, как генерировать такое изображение.

В моем приложении было 4 разных графика на одной странице, поэтому в моей HTML-странице было 4<img> теги с 4 различными URL-адресами, которые все сопоставлены с одним и тем же сервлетом, генерирующим диаграммы, но в URL-адресе были некоторые параметры, которые сообщали сервлету, какой тип диаграммы нужен. Получив запрос, сервлет использовал магию JFreeChart, а затем использовалChartUtilities.writeChartAsPNG() сбросить сгенерированное изображение в сервлетвыходной поток.

 Carl Smotricz29 дек. 2009 г., 17:39
Нет, этос того, что я назвалпродвинутый» вариант. Я'Я уточню мой ответ с некоторыми подсказками.
 robbie29 дек. 2009 г., 17:02
хорошо, да нетChartUtilities.saveChartAsPNG ();» просто сохранить график в файловой системе? Я хочу, чтобы пользователь мог вводить переменные, а затем диаграмма отображалась прямо в браузере. Могу ли я сделать это с помощью кода, который вы мне предоставили? Большое спасибо

Вам нужно написать сервлет, который записывает изображение (поток байтов) в выходной поток для клиента. Нет необходимости создавать файлы. В принципе что-то вроде этого должно работать:

public class ChartServlet extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException {

        JFreeChart chart = .. // create your chart
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ChartUtilities.writeChartAsPNG(bos, chart, width, height);

            response.setContentType("image/png");
            OutputStream out = new BufferedOutputStream(response.getOutputStream());
            out.write(bos.toByteArray());
            out.flush();
            out.close();
  }
}

Затем сопоставьте его с некоторым URL в вашем web.xml и используйте из "IMG» тег в HTML / JSP. Очевидно, что вы можете передать ему параметры и т. Д.

Если вы хотите остаться в рамках Stripes, вы можете использовать пользовательское расширение StreamingResolution, таким образом:

Создайте новую нормальную реализацию ActionBean, которая будет представлять URL-адрес вашей диаграммы (будет включен в ваш тег img):

@DefaultHandler
public Resolution view() {
    JFreeChart chart = ...
    return new ChartStreamingResolution(chart);
}

Затем пользовательский StreamingResolution выглядит следующим образом:

public class ChartStreamingResolution extends StreamingResolution {
    private JFreeChart chart;
    public ChartStreamingResolution(JFreeChart chart) {
        super("image/png");
        this.chart = chart;
    }

    @Override
    public void stream(HttpServletResponse response) {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ChartUtilities.writeChartAsPNG(bos, chart, 400, 200);
            OutputStream out = new BufferedOutputStream(response.getOutputStream());
            out.write(bos.toByteArray());
            out.flush();
            out.close();
        } catch (Exception e) {
            //something sensible
        }
    }
}

Ваш ответ на вопрос