Bild speichern und auf JSP zeigen

@Dimax, die Sache ist doch wirklich trivial (https://www.java-forum.org/thema/bild-speichern-und-auf-jsp-zeigen.182998/page-2#post-1166296): Bilder werden in HTML mit einem img-Tag eingebunden. Der Browser ruft die Bilddaten von der angegebenen URL ab und zeigt das Bild an. Die URL wird auf Serverseite "bedient", indem die Bilddaten als Antwort zurückgegeben werden. Mehr passiert da nicht.

Das JavaScript im HTML-Code sorgt lediglich dafür, dass der Browser das Bild neu abruft, indem die URL des img-Tags neu gesetzt wird.

Wenn irgendwas nicht funktioniert, musst Du halt schauen, was es ist: ist die URL richtig usw. Dafür gibt es das Serverlog auf der einen und die Entwicklertools auf der anderen Seite.
 
Wenn ich nach deinem Beispiel mache Server sagt nichts und die Enwicklertools sind auf dem Bild --src sieht mein Servlet nicht oder was ist gemeint mit: "Cannot set property `src` of null at HTMLButtonElement"
 
Du zeigst da leider den relevanten Code nicht, aber es wird daran liegen, dass es keinen Image-Tag mit der passenden id im Frame gibt.
Grund dafür kann ua das iFrame sein.
 
Wenn ich nach deinem Beispiel mache
Nach meinem Beispiel machen, würde ja bedeuten, dass Du vorher schon mein Beispiel gemacht hättest... ;)

Jetzt mal ernsthaft: so kommst Du doch nicht weiter. Kopier einfach mal Dein JSP zwischen Code-Tags hier rein: [code=HTML]Inhalt Deiner JSP-Datei[/code]

Dann wird man das Problem schon finden.
 
Ich habe jetzt extra jsp für das Bild gemach
HTML:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   %>
<%@ page import="org.jfree.chart.encoders.*" %>
<%@ page import="com.keypoint.PngEncoder" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page import="java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Chart</title>
</head>
 
        <body>
            <%
                String aktion=new String("");
                aktion=request.getParameter("aktion");
            %>
            <form action="TestChart?aktion=topKomplex"><input type="hidden">
            <%
                BufferedImage bi=new
                BufferedImage(600,500,BufferedImage.TYPE_INT_RGB);
            //    ImageIO.write(bi, "png", response.getOutputStream());
            %>
<img src="TestChart?aktion=topKomlpex"></img>
        </body>
</html>
Beim Aufruf der Seite :BIlder liegen bei.Eclipse Console leerEntwickler.png Seite.png
 
Wenn ich form und img tägs lösche und ImageIO auskommentiere :
also
HTML:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
   %>
<%@ page import="org.jfree.chart.encoders.*" %>
<%@ page import="com.keypoint.PngEncoder" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="javax.imageio.ImageIO"%>
<%@ page import="java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Chart</title>
</head>   
        <body>
            <%
                String aktion=new String("");
                aktion=request.getParameter("aktion");
            %>
           
            <%
                BufferedImage bi=new
                BufferedImage(600,500,BufferedImage.TYPE_INT_RGB);
            ImageIO.write(bi, "png", response.getOutputStream());
            %>
        </body>
</html>
Dann bekomme ich folgende Fehlermeldung in der Console:
HTML:
Nov 09, 2018 2:48:29 PM org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet [jsp] in context with path [/sasco] threw exception [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:624)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:111)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:184)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
und die Bilder
 

Anhänge

Jetzt schmeiß das ImageIO raus. Du brauchst den Code von hier: https://www.java-forum.org/thema/bild-speichern-und-auf-jsp-zeigen.182998/page-3#post-1166499

Das Problem ist doch ganz einfach: Deine JSP-Seite liegt unter /sasco/Auswertung. Wenn Du in img dann als src="TestChart" angibst, wird das Servlet unter /Auswertung/TestChart gesucht. Du hast @WebServlet("/TestChart") angegeben. Folglich 404 - not found.

Geh mal her und gib als src "/sasco/TestChart" an.

EDIT: habe noch form durch img ersetzt.
EDIT2: was soll der Käse mit dem Formular?!?
 
Wenn Du in der Java-Klasse eine Annotation @WebServlet mit Pfadangabe hast, dann entferne doch bitte aus dem XML das Servlet und das Servletmapping. Im XML musst Du dann gar nichts mehr machen. Das URL-Pattern im XML wäre sowieso falsch, denn diesem entsprechend wäre es unter /sasco/Auswertung erreichbar.
 
warum wäre es falsch liegt ja auch dort oder sollte ich so ein Eintrag machen?

<display-name>TestChart</display-name>
<servlet-name>TestChart</servlet-name>
<servlet-class>Auswertung.TestChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestChart</servlet-name>
<url-pattern>WebContent/Auswertung</url-pattern>
</servlet-mapping>
 
warum wäre es falsch
Im konkreten Beispiel wäre es falsch.

Mal ganz allgemein: Das URL-Pattern gibt an, welche URLs von dem betreffenden Servlet behandelt werden sollen. Wenn Du /Auswertung reinschreibst, dann wird Dein Servlet auch nur die Adresse /sasco/Auswertung behandeln, nicht aber z. B. /sasco/Auswertung/TestChart.

Gibst Du also als URL-Pattern /Auswertung an, musst Du im src-Attribut des img-Tags in Deinem JSP auch /sasco/Auswertung schreiben.
 
Also ich bin ein Stück weiter aber das Ziel immer noch nicht erreicht.
Das ist der java-Servlet liegt im gleichen Ordner wie die jsp wo es aufgerufen wird.
Java:
package Auswertung;

import java.awt.BasicStroke;
import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.*;
@WebServlet("/TestChart")
public class TestChart extends HttpServlet{

    private static final long serialVersionUID = 1L;

 
@Override
protected void doPost(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException {
    doGet();
}
 protected void doGet(HttpServletRequest anfrage, HttpServletResponse antwort) throws ServletException, IOException {
        String header=new String("");
        String titel=new String("");
        String top[][];
        byte[]data=statistikDarstellung(top,titel,header);
        antwort.setContentType("image/png");
        antwort.setContentLength(data.length);
try(OutputStream outs=antwort.getOutputStream()){
      outs.write(data);
}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);
     
        return os.toByteArray();
 
        }
}
aus web.xml alles was ich reingeschrieben habe auch gelöscht
auf der jsp rufe ich java-Servlet ohne iframe..gleich nach dem body teg
Code:
<img src="TestChart.java?aktion=topKomplex">
wenn ich im Browser das Progamm mit entwickler tools öffne
bekomme ich Bilder unten .Frage: ich setze content auf image warum bekomme aber als type text? und warum wird eigentlich das Bild nicht angezeigt?
 

Anhänge

Zuletzt bearbeitet:
Nochmal:

Wenn Deine JSP-Datei unter /sasco/Aswertung/xyz.jsp erreichbar ist UND dieses ein img-Tag ausgibt, dessen src-Attribut einen relativen Pfad angibt, dann ist der Pfad relativ zu /sasco/Auswertung zu verstehen.

Gibst Du also src="TestChart" aus, dann macht der Browser daraus "/sasco/Auswertung/TestChart".

Dem entsprechend musst das URL-Pattern des Servlets "/Auswertung/TestChart" lauten und nicht "/TestChart".
 
Passende Stellenanzeigen aus deiner Region:

Oben