Необходимо понимать, что фаза действия портлета (которая запускается при щелчке по меню) и запрос сервлета - это полностью отдельные запросы.
Я не знаю тонкостей 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);
}
}
}
}
}