Bild speichern und auf JSP zeigen

Guten Tag,
Seit ein paar Tagen versuche ich in meinem Programm ein Bild zu peichern um auf der Jsp Seite darstellen zu können:
Java:
//methode die das Bild speichert
JFreeChart chart= ChartFactory.createPieChart(titel,data,true,true, false);//Tortendiagramm mit // JfreeChart wird erstellt..funktioniert 100%
File file1 = File.createTempFile(
                    ServletUtilities.getTempFilePrefix(), ".png", 
                    new File(System.getProperty("java.io.tmpdir")));//File wird deklariert..funktioniert
ChartUtilities.saveChartAsPNG(file1,chart, 500, 400, info);//Das Bild wird gespeichert..vermute //das Problem liegt bei dem Speicherort..
return file1.getAbsolutePath();//Rückgabe
Im weiterem Verlauf wird das Bild auf der JSP-Seite aufgerufen
Code:
<img src=<%=methoden.TestChart.statistikDarstellung(topKomplex,titel,header) %> alt="top" />
Es kommt keine Fehlermeldung nur das Bild wird nicht angezeigt.
Hat jemand Ahnung woran es liegen könnte?
 
Seit Tagen versuche ich vergeblich das hinzukriegen: Dass ist web.xml wo ich TestChart als Servlet deklariere
xml.png
Das ist der Servlet:
Java:
public class TestChart extends HttpServlet{
    private static final long serialVersionUID = 1L;

@Override
 protected void doPost(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException {
antwort.setContentType("image/png");      
        String aktion=anfrage.getParameter("aktion");
        String header=new String("");
        String titel=new String("");
        OutputStream out=antwort.getOutputStream();
        String top[][]=daten.einlesen.ProgrammAnalyse.topTenKomplex();
            header="Top Komplexität";
            titel="Top Komplex";
            ChartUtilities.writeChartAsPNG(out, statistikDarstellung(top,titel,header), 600, 500);
}
public static JFreeChart statistikDarstellung( String dataArray[][],String titel,String header) throws IOException {
DefaultPieDataset data=new DefaultPieDataset();      
        for(int i=0;i<dataArray.length;i++){
            data.setValue(dataArray[i][0],Double.parseDouble(dataArray[i][1]));
        }
JFreeChart chart= ChartFactory.createPieChart(titel,data,true,true, false);
chart.setBorderPaint(Color.GREEN);
        chart.setBorderStroke(new BasicStroke(5.0f));
        chart.setBorderVisible(true);
return chart;
}
}
Danach versuche ich im Browser das Bild anzeigen
Code:
...Statisik.jsp
<%
out.print("<tr><td colspan=\"3\">"+
"<form action=\"Statistik.jsp?aktion=topKomplex\" method=\"post\">"+
        "<input type=\"submit\" value=\"Top 10 Komplexität Diagramm\"/>"+
                "<form action=\"TestChart.java?aktion=topKomplex\" method=\"post\">"+//Bin mir nicht sicher ob ich  so eine Anfrage an den Servlet schicken kann
                "<input type=\"hidden\" value=\"topKomplex\"/>"+//Weitere Buttons
String aktion=new String("");
    aktion=request.getParameter("aktion");
    if(aktion.equals("topKomplex")){
      
        header="top Komplex";
        titel="Top 10 Programmen nach Komplexität";
           BufferedInputStream bin=new BufferedInputStream(request.getInputStream());
            BufferedImage img=ImageIO.read(bin);
//Versuch mit <%!BufferedImage img=ImageIO.read(bin)%> scheiterte ...bin unbekannt
%>
<br />
<iframe  align="left" width="49%" height="600"  frameborder="1" ><img src="<%hier soll das Bild vom InputStream hin%>"></iframe><!--Versuch mit<%=img%> brachte nichts..img nicht erkant -->
<iframe   align="right" width="49%" height="600" frameborder="1" src="DatenbankStatistik.jsp"></iframe>
Was mache ich falsch oder was habe ich nicht gemacht?
Danke im Voraus
 
Danke mrBrown für den Link,habe reingeschaut ..einzige Änderung die ich gemacht habe :
Im TestChart.java
Java:
package Auswertung;
@WebServlet("/TestChart") // das hatte ich nicht
import java.....usw
sonst ist alles was auf der Seite von deinem Link geschrieben ist habe ich gemacht.Nun bekomme ich
im <iframe> Tag
HTTP Status 404 – Not Found
Type Status Report

Message /sasco/Auswertung/TestChart

Description The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

Apache Tomcat/8.5.30
 
also im <iframe> steht
Code:
<iframe  align="left" width="49%" height="600"  frameborder="1"  src="TestChart?aktion=topKomplex"></iframe>
 
habe gelesen dass die iframes deprecated sind aber die sind gut um die Seiten darzustellen die öfters aktualisiert werden wärend die div`s komplette Seite neuladen .Meinst du mir fehlt dan Methode doGet überschreiben im Servlet?
 
Ich habe folgende Änderungen
Java:
out.print("<tr><td colspan=\"3\">"+
"<form action=\"Statistik.jsp?aktion=topKomplex\" method=\"post\">"+
        "<input type=\"submit\" value=\"Top 10 Komplexität Diagramm\"/>"+
                "<form action=\"TestChart.java?aktion=topKomplex\" method=\"get\">"+//auf get geändert
                "<input type=\"hidden\" value=\"topKomplex\"/>"+
danach zum Testen auf der Seite:
Code:
<img src="TestChart?aktion=topKomplex" />
Und im Servlet
Java:
protected void doGet(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException { //vom doPost auf doGet geändert
Unten das Bild warum iframe->Ich wollte auf Button click nur die Bilder im iframe ändern nicht die komplette Seite neu laden..weil da sind mehrere Tabellen mit den werten aus DB für die man Ladezeit braucht.Kann sein das es der falsche Weg ist..bin auch noch kein Profi
Im Bild sieht man das es 3 Fehler gibt..wie kann die Lesen?
 

Anhänge

Mal ein Beispiel. Nicht besonders schön und ein HTML-Validator wird vermutlich schreiend davonlaufen, für den Zweck sollte es jedoch genügen.

Erst mal ein simples Servlet. Dieses liefert zur Veranschaulichung einfach ein "zufälliges" Bild, damit man sieht, das was passiert.
Java:
@WebServlet("/image")
public class RandomImage extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        byte[] data = getImage();
        resp.setContentType("image/jpeg");
        resp.setContentLength(data.length);
        try(OutputStream out = resp.getOutputStream()) {
            out.write(data);
        }
    }

    private byte[] getImage() throws IOException {
        BufferedImage img = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = img.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, 400, 400);
        g2.setColor(Color.RED);
        g2.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 16));
        g2.drawString(Long.toString(System.currentTimeMillis()), 10, 100);
        g2.dispose();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(img, "jpeg", os);
        return os.toByteArray();
    }
}
Dann das JSP-File (hier eigentlich nur HTML):
HTML:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JSP Test</title>
</head>
<body>
  <button id="refresh" type="button">Refresh</button>
  <img id="image" src="image" />
  <script>
    document.getElementById("refresh").addEventListener("click", function(e) {
      document.getElementById("image").src = 'image?' + new Date().getTime();
    });
  </script>
</body>
</html>
Das Script am Ende ist selbsterklärend: es fügt einen click-Listener zum Button hinzu, der das src-Attribut des Bildes anpasst. Der Query-Teil der URI ist dazu da, dass der Browser-Cache umgangen wird. Letzteres ist nicht immer in der Form erwünscht, in diesem Beispiel aber schon :)
 
Ich weiß nicht, was Du da ausprobiert hast, mein Beispiel auf jeden Fall nicht.

Der Fehlermeldung und dem beschränkten Screenshot nach zu urteilen, gibt es kein Element mit der ID, die in der als fehlerhaft markierten Zeile in document.getElementById angegeben ist. Man sieht das auf dem Screenshot nicht.
 
TestChart.java geändert
Java:
package Auswertung;
@WebServlet("/TestChart")
public class TestChart extends HttpServlet{

    private static final long serialVersionUID = 1L;
@Override
 protected void doGet(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException,        IOException {
    System.out.println("Get gekommen");
        String top[][]=daten.einlesen.ProgrammAnalyse.topTenKomplex();
        String header=new String("Top Komplexität");
        String titel=new String("Top Komplex");
        byte [] ding=statistikDarstellung(top,titel,header);
        antwort.setContentType("image/png"); 
        antwort.setContentLength(ding.length);
        try(OutputStream outs=antwort.getOutputStream()){
            outs.write(ding)
          }catch(Exception e){e.printStackTrace();}
   }
public static byte[] statistikDarstellung( String dataArray[][],String titel,String header) throws IOException {
        DefaultPieDataset data=new DefaultPieDataset();       
        for(int i=0;i<dataArray.length;i++){
            data.setValue(dataArray[i][0],Double.parseDouble(dataArray[i][1]));
        }  
        JFreeChart chart= ChartFactory.createPieChart(titel,data,true,true, false);
        chart.setBorderPaint(Color.GREEN);
        chart.setBorderStroke(new BasicStroke(5.0f));
        chart.setBorderVisible(true);    
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ChartUtilities.writeChartAsPNG(os,chart , 600, 500);
        System.out.println("chart gesendet");
        return os.toByteArray();
   
        }
}
Statistik.jsp liegt im package Auswertung

Code:
.....
out.print("<tr><td colspan=\"3\">"+
"<button id=\"topKomplex\" type=\"button\">Top Komplexität Diagramm</button>"+
//und weitere buttons

%>
    <script>
    document.getElementById("topKomplex").addEventListener("click", function(e) {
      document.getElementById("image").src ='TestChart?' + new Date().getTime();
    });
  </script>
    <%  //...und weitere Sachen..
Button ist da ,beim draufdrücken passiert nicht
 
gemacht..Ändert aber nichts..Meine einzige Frage ist : wie bekommt man ein Foto aus dem
response.getOutPutStream ()..
 
Passende Stellenanzeigen aus deiner Region:

Oben