Jasperreport: Dateihandling bei Webanwendungen

Status
Nicht offen für weitere Antworten.

tec1

Aktives Mitglied
Hallo Leute,

ich generiere in der Action einer Struts-Anwendung eine Jasper-XML-Datei und erzeuge daraus eine PDF-Datei aus den Eingaben des Benutzers. Soweit funktioniert alles sehr gut.
Mit
Code:
JasperExportManager.exportReportToPdfFile(jasperPrint, pdfFile);
erzeuge ich das PDF-Dokument(String pdfFile (Datei mit Pfad)).

Jetzt aber zu meinem Problem. Wenn in meiner Webanwendung 20 Leute "gleichzeitig" einen Report generieren lassen, wie kann ich dann sicherstellen welche Person (Session) welchen Report erhält und im Browser anschauen kann?
Da der String pdfFile einem bestimmten Pfad auf dem Server zugeordnet ist, greifen ja alle 20 User auf die gleiche PDF-Datei zu. Jeder Benutzer muss natürlich seinen individuell generierten Report angezeigt bekommen

Wie würdet ihr das Problem lösen?

Gruß
 

DP

Top Contributor
hi. bei mir benenne ich das file mit einem prefix + timestamp in millisekunden. ist relativ unwahrscheinlich, dass mehrere user gleichzeitig da reinlaufen...
 

tec1

Aktives Mitglied
Hallo,

im Prinzip braucht man nicht eine einzige Datei auf dem Server speichern:

Teil der execute-methode der Action
Code:
    PrintTest print = new PrintTest();
    byte[] bytes=print.startPrinting(null);
    
    response.setContentType("application/pdf");
    response.setContentLength(bytes.length);
    ServletOutputStream outputStream=null;
	try {
		outputStream = response.getOutputStream();
	} catch (IOException e1) {
		e1.printStackTrace();
	}
    try {
		outputStream.write(bytes, 0, bytes.length);
		outputStream.flush();
		outputStream.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
    
    return null;

relevante Teile der Klasse PrintTest
Code:
public byte[] startPrinting (String servletpath)
  {
    if (null==servletpath){
    	ByteArrayOutputStream boutStream=createXML(null);
    	byte[] bytes = print_with_Stream(boutStream);
    	return bytes;
    }
    
    return null;
  }

Code:
   public ByteArrayOutputStream createXML(String filename){
    
    //  JDom Dokument erzeugen
    SAXBuilder builder = new SAXBuilder();
    Document doc = new Document();
    
    //doctype(elementname, public ID, system ID)
    DocType doctype = new DocType("jasperReport", 
                                  "-//JasperReports//DTD Report Design//EN",
                                  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd");
    
    doc.setDocType(doctype);
    Element root = new Element("jasperReport");
    
    root.setAttribute("name", "Testreport");
    root.setAttribute("pageWidth", "2500");
    root.setAttribute("pageHeight", "2100");
    root.setAttribute("columnWidth", "2460");
    root.setAttribute("leftMargin", "20");
    root.setAttribute("rightMargin", "20");
    root.setAttribute("topMargin", "50");
    root.setAttribute("bottomMargin", "50");
    
    doc.setRootElement(root);
    Element title = new Element("title");
    root.addContent(title);
    
    Element band = new Element("band");
    band.setAttribute("height", "2000");
    title.addContent(band);
    
    for (int i=0; i<100; i++){
	    for(int i2=1; i2<=17; i2++){
	    	Element staticText1 = new Element("staticText");
		    band.addContent(staticText1);
		    
		    Element reportElement = new Element("reportElement");
		    reportElement.setAttribute("x", String.valueOf(i2*100));
		    reportElement.setAttribute("y", String.valueOf(i*20));
		    reportElement.setAttribute("width", "100");
		    reportElement.setAttribute("height", "20");
		    staticText1.addContent(reportElement);
		    
		    //leeres Textelement
		    Element textElement = new Element("textElement");
		    staticText1.addContent(textElement);
		    
		    Element text1 = new Element("text");
		    CDATA cdata = new CDATA("");
		    //cdata-element mit inhalt füllen und an textelement anfügen (append geht auch)
		    cdata.setText("Test - Report");
		    text1.addContent(cdata);
		    staticText1.addContent(text1);
	    }
    }
    
    try {
      
      if(null==filename){
      	//xml-Doc in Bytearrayoutpustream speichern
      	ByteArrayOutputStream boutStream = new ByteArrayOutputStream();
      	XMLOutputter out = new XMLOutputter();
        out.output(doc, boutStream);
        return boutStream;
        
      }
      else{
        //speichern des XML-Doc in XML-Datei
        FileOutputStream file = new FileOutputStream(filename);	
        XMLOutputter out = new XMLOutputter();
        // ordentliche Einrückungen
        out.setFormat(Format.getPrettyFormat());
        out.output(doc,file);
      }
      
    } 
    catch (IOException e) {e.printStackTrace();}
    
    return null;
  }


Code:
       public byte[] print_with_Stream(ByteArrayOutputStream boutStream){
  	JasperReport jReport=null;
  	byte[] bytes=null;
  	
  	try {
		ByteArrayInputStream inStream = new ByteArrayInputStream(boutStream.toByteArray());
		jReport = JasperCompileManager.compileReport(inStream);
	} catch (JRException e1) {
		e1.printStackTrace();
	}
	
  	try {
		bytes=JasperRunManager.runReportToPdf(jReport, null, new JREmptyDataSource());
  	} catch (JRException e) {
		e.printStackTrace();
	}
  	return bytes;
  }



Gruß
 

tec1

Aktives Mitglied
Mit der Generierung von PDF-Reports klappt das sehr gut.
Weiss jemand, wie ich HTML-Reports erstellen kann,ohne diese in einer Datei auf dem Server speichern zu müssen?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben