Einheitliche Textausgabe mit Java auf der Konsole und in JSP

Ich habe heute mal ein wenig mit JSP rumgespielt und nach einer Lösung gesucht, Textausgaben per Sytem.out.println() auch in einer JSP auszugeben. Standardmäßig landen solche Ausgaben nämlich in JSP nicht im HTML-Text, sondern im Tomcat-Logfile.

Ich habe eine einfache Anwendung, die Textausgaben erzeugt. Diese soll sowohl über die Konsole, als auch über eine JSP-Seite aufgerufen werden können. Gebe ich die Texte nun per Sytem.out.println() aus, erscheinen sie auf der Konsole, aber nicht in der JSP (hier muss out.println() verwendet werden).

Die sauberste Lösung wäre sicherlich, die Ausgaben aus den „arbeitenden“ Klassen zu entfernen und je nach Umgebung einen geeigneten Konsolen- bzw. JSP-View für die Textausgaben zu verwenden. Aber zum Rumspielen ist mir das zuviel Aufwand 🙂

Die Lösung für mein Problem sieht nun so aus: Ich habe einfach alle Sytem.out.println()-Ausgaben durch Writer.println() ersetzt, wobei Writer eine statische Klasse ist, die ein Attribut vom Typ PrintWriter besitzt und alle Anfragen an println() an dieses weiterleitet. Mittels Writer.setWriter(PrintWriter pw) kann dieser Writer nun je nach Umgebung auf ein geeignetes Ausgabeobjekt gesetzt werden: Auf der Konsole wäre das PrintWriter(System.out) und in JSP PrintWriter(out).

Das Ganze funktioniert, da der Konstruktor von PrintWriter polymorph ist und sowohl mit einem java.io.Writer (von dem JspWriter (Objekt out unter JSP) abgeleitet ist), als auch mit einem java.io.OutputStream (von dem PrintStream (Objekt System.out der Konsole) abgeleitet ist) aufgerufen werden kann.

Beispiel

Klasse Writer:
import java.io.PrintWriter; public class Writer { private static PrintWriter s_pw; public static void setWriter(PrintWriter pw) { s_pw = pw; } public static void println(Object o) { s_pw.println(o); } public static void println() { println(""); } }

Textausgabe in irgendeiner Klasse:
public void gibWasAus() { Writer.println("Das ist der auszugebende Text."); }

Aufruf der obigen Klasse auf der Konsole in der main():
Writer.setWriter(new PrintWriter(System.out), true); // Instantiieren des Objektes "ausgObj" etc. ausgObj.gibWasAus();

Aufruf der obigen Klasse auf der Konsole in der JSP-Datei:
Writer.setWriter(new PrintWriter(out), true); // Instantiieren des Objektes "ausgObj" etc. ausgObj.gibWasAus();

Über uns Stefan

Polyglot Clean Code Developer

Ein Kommentar

  1. Pingback:Java News | Uncategorized | Programmierung & Software Entwicklung Mobil

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax