Home / Programmazione / Java / Creare grafici in JSP e Servlet
Mattepuffo

Creare grafici in JSP e Servlet

Creare grafici in JSP e Servlet

Ho già parlato di come creare grafici in Java usando la libreria JFreeChart.

In quel caso il grafico si visualizzava in un JPanel.

Invece adesso vediamo come usare la stessa libreria per creare grafici all'interno di una JSP e usando le Servlet.

Scaricate la libreria da qua; ricordatevi che dovete scaricare anche JCommon (dovrebbe stare all'interno dello stesso file zip).

Aggiungete entrambe le librerie al progetto.

Il grafico lo creeremo prendendo i dati da db.

Quindi abbiamo bisogno di una connessione.

Poi servono una Servlet e una JSP.

Salto la parte della connessione perchè ne ho parlato varie volte.

Create una Servlet e aggiungetela al file web.xml:

<servlet>
  <servlet-name>ServletGraph</servlet-name>
  <servlet-class>com_mattepuffo_book.ServletGraph</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>ServletGraph</servlet-name>
   <url-pattern>/ServletGraph</url-pattern>
</servlet-mapping>

A Questo punto vediamo la Servlet:

public class ServletGraph extends HttpServlet {

   private DBManager db = DBManager.getInstance();

   @Override
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
     JDBCCategoryDataset dataset = new JDBCCategoryDataset(db.takeConnection());
     dataset.executeQuery("SELECT author_name AS AUTHORS, COUNT(*) AS CONT FROM bookv GROUP BY AUTHORS ORDER BY CONT DESC LIMIT 15");
     JFreeChart chart = ChartFactory.createBarChart3D("BOOK", "AUTHOR", "NUMBER OF BOOK", dataset, PlotOrientation.HORIZONTAL, true, true, true);
     chart.getTitle().setPaint(Color.ORANGE);
     chart.removeLegend();
     CategoryPlot plot = chart.getCategoryPlot();
     plot.setForegroundAlpha(0.5f);
     response.setContentType("image/png");
     BufferedImage image = chart.createBufferedImage(900, 900, null);
     PngEncoder enc = new PngEncoder(image, false, 0, 9);
     response.getOutputStream().write(enc.pngEncode());
    } catch (ClassNotFoundException ex) {
     response.sendRedirect("error.jsp?err=" + ex.getMessage());
    } catch (SQLException ex) {
     response.sendRedirect("error.jsp?err=" + ex.getMessage());
    }
  }

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  }

}

DBManagerè la classe che uso per la connessione e usa il pattern Singleton.

Ho ridefinito solo il metodo doGet e qui dentro creo il grafico.

Apro la connessione con JDBCCategoryDataset ed eseguo la query.

Creo un oggetto JFreeChart con barre 3D e sotto imposto altre opzioni.

Unp pò più sotto imposto il Content Type della risposta come immagine png.

Poi attraverso BufferedImage creo una immagine, la codifico attraverso PngEncoder e la passo alla pagina con getOutputStream().write().

A questo punto nella pagina avremo una cosa del genere:

<img src="ServletGraph" />

In sostanza in un tag img richiamo la Servlet.