JFreeChart в портлете - PullRequest
       18

JFreeChart в портлете

0 голосов
/ 06 сентября 2011

Я хочу изменить цвет моей диаграммы (круговой диаграммы) (цвета набора цветов фона и т. Д.) С помощью кнопки или выбора пункта меню из портлета (портал Vaadin / Liferay). Я вроде понятия не имею, как это сделать. Вот мой сервлет:

import org.jfree.data.jdbc.JDBCPieDataset;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Connection;

public class PieChart extends HttpServlet {


  /**
     * 
     */
    private static final long serialVersionUID = 1L;

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Connection connection = null;
    try {
      Class.forName("org.postgresql.Driver").newInstance();
      try {
            connection = DriverManager.getConnection(
                    "jdbc:postgresql://localhost:5432/db", "user",
                    "password");
      } catch (SQLException e) {
        e.printStackTrace();
      }
    } 
    catch (InstantiationException e) {
      e.printStackTrace();
    } 
    catch (IllegalAccessException e) {
      e.printStackTrace();
    } 
    catch (ClassNotFoundException e) {
      e.printStackTrace();
    }

    JDBCPieDataset dataset = new JDBCPieDataset(connection);
    try {
      dataset.executeQuery("Select * From my_table");
      JFreeChart chart = ChartFactory.createPieChart("Pie Chart", dataset, true, false, false);
      if (chart != null) {
        response.setContentType("image/png");
        OutputStream out = response.
        getOutputStream();
        ChartUtilities.writeChartAsPNG(out, chart, 450, 400);
      }
    } 
    catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if(connection != null){connection.close();} 
    }
    catch (SQLException e) {e.printStackTrace();}
}

я хочу отправить выбранный цвет сервлету, чтобы он менялся, когда я щелкаю по выбору меню (меню уже есть).

Было бы замечательно любое руководство или подобное.


теперь допустим, что я хочу изменить цвет фона диаграммы. я бы использовал chart.setBackgroundPaint (Color.blue); в сервлете поменять цвет вручную. но я хочу сделать это из портлета, вот что я пытался сделать:

PieChart pie;

в методе init я настраиваю меню и пытаюсь отправить цвет по клику

final MenuBar.MenuItem config = menubar.addItem("Config", null);

 newItem.addItem("PieChart", new Command(){
       public void menuSelected(MenuItem selectedItem) {
           pie.chart.setBackgroundPaint(Color.blue);
       }
 });

Я использую то же самое для изменения цвета фона подокна из другого класса, он работает нормально, но, похоже, не работает в сервлете.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

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

Я не знаю тонкостей Vaadin, но я предполагаю, что это серверная компонентная модель, такая как JSF. Таким образом, в вашем методе menuSelected вам нужно изменить цвет диаграммы (как я вижу, вы изменили свой вопрос). Это правильно, но как pie и его данные передаются сервлету? Это сервлет, который будет использовать цвет, поэтому вам нужно как-то передать его. Это может быть одним из нескольких методов, из которых пара перечислена здесь:

  • общее состояние сеанса
  • параметр URL

Обычно общее состояние сеанса является плохой идеей, поскольку оно тесно связывает компоненты вместе. И параметры URL могут быть плохим вариантом, если параметры содержат конфиденциальные данные. Но для вашего примера параметры URL идеально подходят.

Итак, следуя информации, которую вы написали в комментарии, вы используете компонент Label для отображения тега <img>. Вы говорите что-то вроде:

new Label("img link",Label.CONTEXT_XHTML));

Теперь можно добавить параметры URL в сервлет, например:

new Label("<img src='/path/to/servlet?background=blue'>",Label.CONTEXT_XHTML));

Таким образом, этот параметр URL будет виден сервлету, который может прочитать его из параметров запроса (как в примере ниже) и установить цвет на chart.

Помимо требования получения ввода от пользователя, я бы немного изменил ваш код. Главным образом, чтобы переместить инициализацию драйвера JDBC в метод init() сервлета и обеспечить закрытие соединения в блоке finally. @home также делает правильный комментарий, что в идеале вы бы использовали пул соединений для захвата соединения.

Я добавил несколько комментариев, чтобы показать, как вы можете получить параметр запроса и использовать его со своим графиком. (РЕДАКТИРОВАТЬ - и добавил немного элементарной логики для установки цвета).

public class PieChart extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void init() throws ServletException {
        super.init();
        try {
            Class.forName("org.postgresql.Driver").newInstance();
        } catch (InstantiationException e) {
            throw new ServletException(e);
        } catch (IllegalAccessException e) {
            throw new ServletException(e);
        } catch (ClassNotFoundException e) {
            throw new ServletException(e);
        }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String background = request.getParameter("background");
        // do some checks on colour here
        // such as null check and checking it is a valid colour value for your
        // chart

        Connection connection = null;
        try {
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db", "user", "password");
            JDBCPieDataset dataset = new JDBCPieDataset(connection);
            dataset.executeQuery("Select * From my_table");
            JFreeChart chart = ChartFactory.createPieChart("Pie Chart", dataset, true, false, false);

            if ("blue".equals(background)) {
                chart.setBackgroundPaint(Color.blue)
            }

            // why the null test? can chart ever be (sensibly) null?
            if (chart != null) {
                response.setContentType("image/png");
                OutputStream out = response.getOutputStream();
                ChartUtilities.writeChartAsPNG(out, chart, 450, 400);
            }
        } catch (SQLException e) {
            log("Exception retrieving chart data", e);
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    log("Could not close Connection", e);
                }
            }
        }
    }
}
2 голосов
/ 06 сентября 2011

Класс org.jfree.chart.StandardChartTheme является «реализацией по умолчанию интерфейса ChartTheme». source - хороший способ увидеть все возможности.

...