Включить график JfreeChart и результаты расчетов на той же веб-странице JSP
У меня есть сервлет, который выполняет некоторые вычисления на основе данных формы, представленных пользователем.
Я хотел бы нанести на график введенные входные значения вместе с результатами расчета, которые отображаются в виде текста на той же веб-странице.
Я могу создать график с помощью JFreeChart, но он перезаписывает страницу формы, если я использую его с OutputStream. Если я сохраняю изображение и пытаюсь связать URL-адрес в JSP, диаграмма не отображается. Есть идеи как этого добиться?
Вот мой сервлет, который считывает различные весовые параметры, отправленные из браузера, и создает диаграмму с помощью OutputStream:
@WebServlet(name = "resultServlet", urlPatterns = {"/results"})
public class resultServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
List<Double> weightsList = new ArrayList<Double>();
int listpos = 0;
DefaultPieDataset myServletPieChart = new DefaultPieDataset();
double w1 = Double.valueOf(request.getParameter("w1"));
myServletPieChart.setValue("WEIGHTONE", w1);
weightsList.add(listpos, w1);
listpos++;
double w2 = Double.valueOf(request.getParameter("w2"));
myServletPieChart.setValue("WEIGHTTWO", w2);
weightsList.add(listpos, w2);
listpos++;
double w3 = Double.valueOf(request.getParameter("w3"));
myServletPieChart.setValue("WEIGHTTHREE", w3);
weightsList.add(listpos, w3);
listpos++;
double w4 = Double.valueOf(request.getParameter("w4"));
myServletPieChart.setValue("WEIGHTFOUR", w4);
weightsList.add(listpos, w4);
request.setAttribute("WeightSel", weightsList); //list of selected weights
request.setAttribute("WeightSum", weightSum(weightsList)); //sum of selected weights
request.setAttribute("CalcResult", resultCalculator(weightsList)); //result of some calculations performed on selected weights
// set piechart attributes
JFreeChart inputWeightsPie = ChartFactory.createPieChart("Selected Weights",myServletPieChart,true,true,false);
response.setContentType("image/png"); /* Set the HTTP Response Type */
OutputStream out = response.getOutputStream();
ChartUtilities.writeChartAsPNG(out, inputWeightsPie, 400, 300);/* Write the data to the output stream */
//or alternatively:
// ImageIO.write(inputWeightsPie.createBufferedImage(400, 300), "png", out);
out.close();
}
} catch (NumberFormatException nfe) {
request.setAttribute("errorMessage", "value must be a number!");
}
ServletContext ctx = this.getServletContext();
RequestDispatcher dispatcher = ctx.getRequestDispatcher("/index.jsp");
dispatcher.forward(request, response);
}
1 ответ
Ваш текущий (основной) сервлет должен использоваться только для html-контента.
Создайте отдельный сервлет для диаграммы (где вы можете использовать writeChartAsPNG
).
На странице JSP используйте его как<img src="servChart?w1=100&w2=200">
с вашими параметрами.
ОБНОВИТЬ
Также вы можете сделать расчет графика в том же сервлете. Положил JFreeChart
объект в сессию. И в servChart?name=myChart
Сервлет получает JFreeChart (по имени атрибута) из сеанса и выводит его в байтах.