2009-08-10 5 views
5

Я пытаюсь динамически генерировать графики с помощью JFreeChart в результате некоторых флажков, которые пользователь выбирает, но я не могу понять, как лучше всего получить сгенерированные наборы данных в форме диаграммы (у меня есть код, который делает диаграммы из них, но нужно создавать png) и в виде JSP. В настоящее время я могу думать только о отправке наборов данных в JSP, но не могу придумать, что делать дальше ... Как сделать так, чтобы: пользователь передавал форму сервлету, сервлет генерировал наборы данных, диаграммы, созданные из наборов данных , pngs из диаграмм и, наконец, pngs отправлены в jsp? Или что-то вдоль этих линий.Динамически генерировать JFreeChart в сервлет

public void doPost(HttpServletRequest request, 
        HttpServletResponse response) 
        throws IOException, ServletException{ 

    String[] metrics  = request.getParameterValues("metrics"); 
    String[] fileNames = request.getParameterValues("files"); 

    List<CategoryDataset> results = new ArrayList<CategoryDataset>(); 
    DMCalc calculator = new DMCalc(metrics, fileNames); 
    calculator.calculateResults(); 
    results.add(calculator.getEditDistanceDataset()); 
    results.add(calculator.getSimilarityDataset()); 
    results.add(calculator.getTimeChartDataset()); 

    request.setAttribute("results", results); 
    RequestDispatcher view = request.getRequestDispatcher("metricResult.jsp"); 

    view.forward(request, response); 
} 

ОБНОВЛЕНИЕ:

Имея метод doPost генерировать наборы данных из пользовательского поста, они могут быть сохранены в полях, впоследствии RequestDispatcher направляет пользователя к JSP, который затем вызывает метод doGet сервлета в теге img, который использует данные, хранящиеся ранее в полях, для создания png и затем отображается HTML в JSP.

+1

Похоже, ваше решение будет перерыв, как только два пользователя с помощью своей страницы в то же время - небезопасно хранить что-либо в полях класса сервлета! –

+0

ах, хорошо - есть ли способ достичь того же? – Robert

+0

Простым решением является объект HttpSession. HttpSession session = request.getSession(); а затем session.setAttribute («результаты», результаты); в форме сервлета и session.getAttribute («результаты») в сервлете диаграммы. –

ответ

4

У вашего JSP-файла есть тег, где атрибут src - это имя вашего сервлета. Тогда вы просто сервлет возвращает таблицу в формате PNG:

OutputStream out = response.getOutputStream(); 
    response.setContentType("image/png"); 
    ChartUtilities.writeChartAsPNG(out, chart, width, height); 

JSP-страница действительно предназначена только для вывода HTML или других текстовых данных. Хотя вы могли заставить JSP выводить PNG, нет никакой пользы для этого.

Похоже, вы хотите создать динамическую страницу, которая будет обновляться на основе изменения состояния выпадающего меню. Для этого вам нужно использовать Javascript, который запускается при изменении меню и обновляет значение атрибута src тега img. Затем браузер перезагрузит изображение с вашего сервлета новым графиком.

+0

Как сделать так, чтобы: пользователь отправлял форму сервлету, сервлет генерировал наборы данных, диаграммы, созданные из наборов данных, png из диаграмм и, наконец, pngs отправлен в jsp? – Robert

+0

Этот сервлет делает только одно: создает PNG-изображение диаграммы. Вам все равно потребуется отдельная страница JSP для хранения тега . Для этого не требуется RequestDispatcher. –

+0

Позвольте мне рассказать об этом по-другому - я не могу отображать png без наборов данных, которые должны быть сгенерированы формой, представленной пользователем. Я мог бы сделать сервлет, который обрабатывает только одно, создавая PNG, но как бы я дал ему набор данных, чтобы иметь возможность сделать это, поскольку он генерируется переданной формой? – Robert

5

Я предлагаю вам использовать класс ServletUtilities. Он сохраняет в java tempdir И очищает, когда сеанс недействителен. :) Еще один намек на то, чтобы отобразить файл, - это использовать сервлет DisplayChart для получения ваших изображений. Это идет в web.xml

 <servlet> 
    <servlet-name>DisplayChart</servlet-name> 
    <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>DisplayChart</servlet-name> 
     <url-pattern>/servlet/DisplayChart</url-pattern> 
    </servlet-mapping> 

Это то, как отображать изображения с помощью JSTL:

<img src="<c:url value='/servlet/DisplayChart?'><c:param name='filename' value='${yourFileNameHERE}' /></c:url>" alt=""/> 
Смежные вопросы