2009-08-10 5 views
5

Ich versuche, Graphen dynamisch mit JFreeChart als Ergebnis der Checkboxen zu generieren, die der Benutzer auswählt, aber ich kann nicht herausfinden, wie man die erzeugten Datensätze am besten in Diagrammform bringt (ich habe Code, der erstellt Diagramme aus diesen, muss aber PNGs erzeugen) und in die JSP-Ansicht. Momentan kann ich nur daran denken, die Datasets an die JSP zu senden, aber ich weiß nicht, was ich von dort machen soll ... Wie mache ich das so: Benutzer übergibt Formular an Servlet, Servlet erzeugt Datasets, aus Datasets erzeugte Diagramme , PNGs aus Diagrammen und schließlich PNGs, die an JSP versandt wurden? Oder etwas in dieser Richtung.Dynamisch JFreeChart in Servlet generieren

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:

indem das doPost Verfahren die Datensätze vom Benutzer senden erzeugen, können sie dann in Feldern gespeichert werden, anschließend leitet die Request die Benutzer auf die JSP, die dann das doGet Methode des Servlets aufrufen in einem img-Tag, das die zuvor in den Feldern gespeicherten Datenmengen verwendet, um ein png zu erzeugen, und das dann durch den HTML-Code in der JSP angezeigt wird.

+1

Klingt wie Ihre Lösung so schnell wie zwei Benutzer brechen sind Ihre Seite in der gleichen Zeit mit - Es ist nicht sicher, irgendetwas in den Feldern einer Servlet-Klasse zu speichern! –

+0

ah, ok - gibt es eine Möglichkeit, dasselbe zu erreichen? – Robert

+0

Die einfache Lösung ist das HttpSession-Objekt. Führen Sie HttpSession session = request.getSession(); und dann session.setAttribute ("Ergebnisse", Ergebnisse); im Formular servlet und session.getAttribute ("results") im Diagramm-Servlet. –

Antwort

4

Lassen Sie Ihre JSP-Datei ein Tag enthalten, dessen Attribut src der Name Ihres Servlets ist. Dann müssen Sie einfach das Servlet die PNG-Grafik zurück:

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

JSP-Seiten sind wirklich nur dazu gedacht, um die Ausgabe von HTML oder anderen Textdaten. Obwohl Sie zwingen können, die JSP die PNG auszugeben, gibt es keinen Vorteil, es auf diese Weise zu tun.

Es klingt, als ob Sie eine dynamische Seite erstellen möchten, die basierend auf einer Änderung des Dropdown-Menü-Status aktualisiert wird. Dazu müssen Sie Javascript verwenden, das auslöst, wenn sich das Menü ändert, und den Wert des src-Attributs des img-Tags aktualisiert. Dann lädt der Browser das Bild von Ihrem Servlet mit einem neuen Diagramm neu.

+0

Wie mache ich es so, dass: Benutzer Formular an Servlet übermittelt, Servlet erzeugt Datensätze, Diagramme aus Datensätzen, PNGs aus Diagrammen und schließlich PNGs, die an jsp gesendet werden? – Robert

+0

Dieses Servlet macht nur eine Sache - erstellt das PNG-Bild eines Diagramms. Sie benötigen weiterhin eine separate JSP-Seite, die das Tag enthält. Hierfür ist kein RequestDispatcher erforderlich. –

+0

lassen Sie mich es anders ausdrücken - ich kann die PNGs nicht ohne die Datensätze anzeigen, die vom vom Benutzer übermittelten Formular erzeugt werden müssen. Ich könnte ein Servlet machen, das nur eine Sache handhabt und ein PNG erzeugt, aber wie würde ich ihm den Datensatz geben, um das zu können, da er vom übermittelten Formular generiert wird? – Robert

5

Ich würde vorschlagen, dass Sie die ServletUtilities Klasse verwenden. Es speichert in der Java-Tempdir und räumt auf, wenn die Sitzung ungültig ist. :) Ein weiterer Hinweis, um die Datei anzuzeigen, besteht darin, das DisplayChart-Servlet zu verwenden, um Ihre Bilder zu erhalten. Dies geht 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> 

Dies ist dann, wie Sie das Bild anzeigen mit jstl:

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