2009-08-10 13 views
5

Sto provando a generare grafici dinamicamente utilizzando JFreeChart come risultato di alcune caselle di controllo selezionate dall'utente, ma non riesco a capire come ottenere i set di dati generati in forma di grafico (ho codice che crea grafici da questi, ma è necessario produrre png) e nella vista JSP. Attualmente, posso solo pensare di inviare i Dataset al JSP, ma non posso pensare a cosa fare da lì ... Come faccio a fare in modo che: l'utente invii il form al servlet, il servlet generi i dataset, i diagrammi prodotti dai dataset , png dalle classifiche e infine i png spediti a jsp? O qualcosa del genere.Generazione dinamica di JFreeChart nel servlet

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); 
} 

UPDATE:

Avendo il metodo doPost generare i set di dati dal palo utente, che può quindi essere memorizzato nei campi, successivamente il RequestDispatcher inoltra l'utente al JSP che poi chiama il metodo doGet del servlet in un tag img, che utilizza i set di dati memorizzati precedentemente nei campi per produrre un png e che viene quindi visualizzato dall'HTML nel JSP.

+1

Suona come la soluzione si romperà appena due utenti utilizzano la tua pagina, allo stesso tempo - Non è sicuro conservare nulla nei campi di una classe servlet! –

+0

ah, ok - c'è un modo per ottenere la stessa cosa? – Robert

+0

La soluzione facile è l'oggetto HttpSession. Fai HttpSession session = request.getSession(); e quindi session.setAttribute ("risultati", risultati); nel servlet del modulo e session.getAttribute ("results") nel servlet del grafico. –

risposta

4

Il file JSP include un tag in cui l'attributo src è il nome del servlet. Allora, avete semplicemente il servlet restituisce il grafico PNG:

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

pagine JSP siano veramente destinati solo ad altri dati di testo HTML di uscita o. Sebbene tu possa forzare il JSP a generare il PNG, non c'è alcun vantaggio nel farlo in quel modo.

Sembra che si desideri creare una pagina dinamica che si aggiorna in base a una modifica dello stato del menu a discesa. Per questo, è necessario utilizzare Javascript che si attiva quando il menu cambia e aggiorna il valore dell'attributo src del tag img. Quindi il browser ricaricherà l'immagine dal tuo servlet con un nuovo grafico.

+0

Come faccio a fare in modo che: l'utente invii il form al servlet, il servlet generi i dataset, i diagrammi prodotti dai dataset, i png dai grafici e infine i png inviati a jsp? – Robert

+0

Questo servlet fa solo una cosa: crea l'immagine PNG di un grafico. Sarà comunque necessario disporre di una pagina JSP separata per contenere il tag . Non è necessario RequestDispatcher per questo. –

+0

lasciatemelo dire in modo diverso: non riesco a visualizzare i png senza i set di dati, che devono essere generati dal modulo inviato dall'utente. Potrei creare un servlet che gestisca solo una cosa, producendo un PNG, ma come potrei assegnargli il set di dati per poterlo fare, poiché è generato dal modulo inviato? – Robert

5

Suggerisco di utilizzare la classe ServletUtilities. Salva in java tempdir E pulisce quando la sessione viene invalidata. :) Un altro suggerimento per la visualizzazione del file consiste nell'utilizzare il servlet DisplayChart per ottenere le immagini. Questo va in 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> 

Questo è allora come si visualizza l'immagine usando JSTL:

<img src="<c:url value='/servlet/DisplayChart?'><c:param name='filename' value='${yourFileNameHERE}' /></c:url>" alt=""/>