JSP Custom Tag für Bilder

Status
Nicht offen für weitere Antworten.

Marsman

Bekanntes Mitglied
Hallo Ihr!

Ich habe eine Taglib mit einigen eigenen JSP-Tags. Bisher habe ich allerdings nur Text ausgegeben und möchte mir nun ein Tag zur Anzeige eines Bildes bauen. Ich habe gelesen, dass dazu als Response der ContentType "image/gif" gesetzt werden muss. Das alleine reicht offenbar aber nicht.

Wie kann ich ein Image-Tag programmieren? Leider finde ich keine Beispiele dazu. Eher so Konstruktionen mit einem speziellen Servlet, das vom Standard-IMG Tag aufgerufen wird. Und JSF kann ich hier nicht verwenden.

Danke, Titus
 
M

maki

Gast
IMG Tags zeigen auf eine URL, also wieder nur Text, wieso sollte das nicht gehen? ;)

>> Und JSF kann ich hier nicht verwenden.

Wieso nicht?
 

HLX

Top Contributor
Willst du einfach nur das HTML-Tag wrappen oder soll dein Tag irgendwas besonderes können?
 

Marsman

Bekanntes Mitglied
Willst du einfach nur das HTML-Tag wrappen oder soll dein Tag irgendwas besonderes können?

Mein Tag soll skalieren und cachen können. Sicherlich könnte ich in der JSP hinter meinem Tag auch ein IMG-Tag mit der URL zum skalierten Bild hinzufügen. Das finde ich aber blöd.

Titus
 

HLX

Top Contributor
Das Caching wird doch automatisch vom Browser übernommen, es sei denn es wird über die Browsereinstellungen oder folgenden Eintrag auf der HTML-Seite verhindert
Code:
<meta http-equiv="cache-control" content="no-cache">

Zur Skalierung kannst du das Bild in deinem Tag als BufferedImage einlesen.
 

Marsman

Bekanntes Mitglied
Das Caching wird doch automatisch vom Browser übernommen, es sei denn es wird über die Browsereinstellungen oder folgenden Eintrag auf der HTML-Seite verhindert... Zur Skalierung kannst du das Bild in deinem Tag als BufferedImage einlesen.

Jo, das weiß ich. User, die das erste Mal auf der Seite sind, haben sie aber nicht im Cache. Und weil das Skalieren mit guter Qualität den Server belastet, möchte ich die Bilder dort cachen.

Aber davon abgesehen: Die Logik ist soweit fertig. In meiner Frage ging es mir darum, wie ich eine Image-Tag realisiere. Bisher arbeitet das ganze etwa so:

Code:
<tk:image inFile="/image.jpg" outFile="outImage.jpg" width="100" height="100" />
<img src="/cachePath/outImage.jpg" ... />

Auf das img-Tag und ggf. auch outFile-Attribut möchte ich verzichten können.

Hoffe, jetzt ist es etwas klarer geworden. :)

Gruß, Titus
 

HLX

Top Contributor
Wo ist jetzt das Problem? Du kopierst das Bild im Tag von a nach b sofern es in b nicht vorhanden ist und skalierst es dabei. Wenn das Bild vorhanden ist, zeigst du es mit dem img-Tag an. Sollte alles in deiner Tag-Klasse möglich sein.

Falls das nicht hilft, solltest du den Quellcode deiner Tag-Klasse mal hier reinstellen.

Du kannst Bilder übrigens auch vorab und ohne Programmieraufwand in guter Qualität skalieren. Das Tool IrfanView hat eine sog. Batch-Conversion, die das mit wenigen "Handgriffen" schnell erledigt.
 

Marsman

Bekanntes Mitglied
Okay, ich habe mir mal die Mühe gemacht und den Code auf das wesentliche zu reduzieren:

Code:
public class ImageTag extends TagSupport {
  
  private String src = null;
  
  private BufferedImage image = null;

  @Override
  public int doStartTag() throws JspException {
    try {
      image = ImageIO.read(new URL(getSrc()).openStream());
    } catch (IOException e) {
      new JspTagException("Image tag: " + e.getMessage());
    }
    return EVAL_BODY_INCLUDE;
  }

  @Override
  public int doEndTag() throws JspException {
    try {
      // image conversion ...
      ServletResponse response = pageContext.getResponse();
      response.setContentType("image/jpeg");
      ImageIO.write(image, "jpeg", response.getOutputStream());
    } catch (IOException e) {
      new JspTagException("Image tag: " + e.getMessage());
    }
    return EVAL_PAGE;
  }

}

Ich erhalte folgenden Exception:

Code:
java.lang.IllegalStateException: getWriter() has already been called for this response

Klar. Aber ich will ja auch nicht die Bytes des Bildes als Text, sondern das Bild selbst sehen.

Vielleicht liege ich auch völlig daneben: Aber ich vermute, die Ursache liegt darin, dass der Browser bei dem Standard IMG-Tag einen neue Request absetzen würde, und in diesem dann die Response mit dem ContentType "image/jpeg" zurückgesendet wird. Also eben ein Bild, dass in den HTML-Code eingefügt wird. Wie muss ich das denn in meinem Tag realisieren?

Titus
 

HLX

Top Contributor
Wir kommen der Sache näher. Mit dem von dir beschriebenen Code, erreichst du genau das Gegenteil von dem was du willst. Das Senden über den OutputStream unterbindet jegliches Caching, selbst im Browser. Das Bild wird bei jedem Seitenaufruf neu konvertiert und gesendet.

Ich wäre jetzt eher davon ausgegangen, du willst die Datei auf dem Server speichern. In etwa so (nicht getestet):
Code:
public int doStartTag() throws JspException {
    
    File cacheFile = new File(getCacheFileLocation());
    if(!file.exists()) {
         BufferedImage image = ImageIO.read(new URL(getOriginalSrc()).openStream());
         // Bild hier konvertieren
         OutputStream out = new FileOutputStream(cacheFile);
         ImageIO.write(image, "jpeg", out);
         out.close();
    }
    JspWriter out = pageContext.getOut();
    out.print("<img src='"+getCacheFileLocation()+"'/>"); 
    return SKIP_BODY;
  }
Code:
<xy:myImageTag cacheFileLocation='cacheFolder/cache.jpg' originalSrc='images/myImage.jpg'/>
 

Marsman

Bekanntes Mitglied
Ich wäre jetzt eher davon ausgegangen, du willst die Datei auf dem Server speichern. In etwa so (nicht getestet):

Ich hatte die Vorgehensweise irgendwie zwischendurch aus den Augen verloren: Natürlich schreibt man einfach in IMG-Tag mit der URL zum gecachten Bild. Danke für den Tipp.

Eine Frage hätte ich in dem Zusammenhang allerdings noch: Wie wäre es, wenn man das Bild nun doch nicht zwischenspeichern möchte und es zum Beispiel aus einem Blob stammt. Dann existiert es im Gegensatz zur Variante oben gar nicht auf dem Server. Wie muss ich in meinem Tag dann vorgehen? Geht das auch?

Titus
 

Marsman

Bekanntes Mitglied
Klar geht das, zB. mit einem Servlet bzw. JSF.

Jo, ich weiß. Wir ich Eingangs aber geschrieben hatte, möchte ich für diese Anwendung kein JSF verwenden (zu fett) und das Technik mit dem Servlet find ich auch blöd. Deshalb hatte ich ja hier gefragt, ob man nicht doch irgendwie ein eigenständiges Tag schreiben kann?
 

HLX

Top Contributor
Tags sollten möglichst ohne Randbedingungen in verschiedenen Umgebungen einsetzbar sein - man spricht ja auch von einer Tag-Bibliothek. Eine Randbedingung ist z.B. deine Datenbankverbindung (für die Abfrage des BLOB). Um nicht davon abhängig zu sein, müsstest du viele Informationen über Attribute anliefern, was sehr hässlich ist. DB-Abfragen haben außerdem m.E. in einem Tag nichts zu suchen - du befindest dich schließlich in der GUI und nicht in der Persistenzebene.

Für dein Anwendungsbeispiel ist ein Servlet die ideale Lösung. Was gefällt dir daran nicht?
 
M

maki

Gast
>> Jo, ich weiß. Wir ich Eingangs aber geschrieben hatte, möchte ich für diese Anwendung kein JSF verwenden (zu fett) und das Technik mit dem Servlet find ich auch blöd. Deshalb hatte ich ja hier gefragt, ob man nicht doch irgendwie ein eigenständiges Tag schreiben kann?

JSF hatte ich vorgeschlagen weil du es abgelehnt hattest *g*
Ne quatsch, dachte du nutzt es bereits.

Wie bereits anfangs gesagt, ein Tag rendert dir höchstens Text in deine HTML Seite, nicht einen Binärendatenstrom welcher ein Bild enthält.
Dieser Text kann ja eine URL für ein img Tag sein dass auf ein Servlet zeigt, welches noch weitere GET Parameter enthält (zB. Skalierung).
 

Marsman

Bekanntes Mitglied
Okay, ich sehe es ein. Wahrscheinlich werde ich es doch die Variante mit dem Servlet anwenden.

Auf die Idee mit dem Image-Tag war ich gekommen, weil ich genau so etwas mit einem Renderer unter JSF schon mal realisiert hatte. JSF verwende ich aber nur noch für Anwendungen, die "inhouse" genutzt werden.

Titus
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JSF Custom Validation Messages Migration von JSF 1.2 auf 2.0 Web Tier 5
T Fragen zum Bau von Custom Userpages Web Tier 10
J JSF Custom Component ValueExpression wird nur als String erkannt Web Tier 2
R JSF Custom Tags + Facelets Web Tier 2
M Rundeklammern im Custom-Tag Web Tier 10
AyKay Iteration: JSP Custom Tag mit Scripting. Variablenübergabe? Web Tier 3
A JSF Suche Beispiel für Primefaces Tree als Navigation Web Tier 3
S Seite nur aufrufbar machen für eingeloggte User Web Tier 1
R JavaScript für Java Enterprise Entwickler Web Tier 1
G JSF Webanwendung Editor für JSON gesucht Web Tier 1
S JSP Hm... Vorlage für Java Basierende Webseite? Web Tier 0
J Funktion für AJAX - Problem mit Return Web Tier 14
D Servlet 1 Servlet für alles - Wie Cookies per Ajax? Web Tier 1
R JSF Zugriff für Helpdesk-Mitarbeiter Web Tier 15
I Autocomplete Google Maps für JSF Web Tier 0
W Servlet SPEICHERN UNTER-Dialog für mehrere Dateien Web Tier 4
M JSF Framework für User Management etc. Web Tier 0
D Welches Webframework für REST geeignet Web Tier 1
L java.io.NotSerializableException für domain Objekte - Design Problem? Web Tier 12
M Converter für SelectOneMenu Web Tier 3
J eigene taglib für jsf 2.0 schreiben Web Tier 21
S Empfehlung für stateless Webframework Web Tier 2
J mögliche 'eigene' Konfigurationen für die Web.XML auflisten lassen Web Tier 4
H Singleton für In-Memory-Caching in WebApp Web Tier 4
F Wo und wie Daten die für alle Benutzer bestimmt sind verwalten Web Tier 4
S beste Preis/Leistung für Server Web Tier 3
H Relativer Pfad für XML-Datei in JSP-Anwendung Web Tier 3
S Welcher ansatz für Web Application + Web Service Web Tier 5
M JSF Converter für String to List<String> Web Tier 2
R Servlet Resource laden für SMTP - Session Web Tier 4
T JSF Eigener Converter wird nur für Eingabekomponenten aufgerufen? Web Tier 3
O Welche JSF Implementation ist am besten für mich geeignet ? Web Tier 3
T Sprachenauswahl für Projekt Web Tier 3
M JSF Komponentenframework für Web/JSF? Web Tier 7
M JSF Simple Testklasse für Button - MethodNotFoundException? Web Tier 6
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
I Anwendungsfälle für OO Vererbungshierarchien bei Webapps Web Tier 4
D Struts Mehrsprachigkeit in textfield für key ja, aber für label nein? Web Tier 4
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
S ClassPath für Servlet Web Tier 3
J Welches Framework für Webentwicklung? Web Tier 13
T Plugins für Eclipse Web Tier 9
T JSF Zwei Listen/Vectoren für f:selectItems verknüpfen - möglich? Web Tier 2
ruutaiokwu JSF nur für die präsentation verwenden? Web Tier 4
S Ein ControllerServlet für andere Servlets - Sinnvoll oder nicht? Web Tier 34
C Webspace bzw. Server für GWT Web Tier 5
O Testframework für Webanwendung? HTMLUnit? Web Tier 3
C CMS für GWT Anwendung Web Tier 2
T SVG für JSF2 Web Tier 8
Java.getSkill() Lerngruppe für Tapestry 5 Web Tier 21
T Template für die ganze Seite Web Tier 6
Spin JSF oder PHP für Web Web Tier 4
M Java Framework für größere Projekte verwenden Web Tier 5
Z Erlaubte Klassen für h:selectOneListbox Iteration? Web Tier 2
R Exception? Was für ein Fehler? Web Tier 3
J DataScroller: rowCount für Folgeseiten übernehmen Web Tier 2
M Tomcat - Mehrere Verzeichnisse für die jsp Web Tier 12
N JMX MBean für JBoss 4.2.2 Web Tier 4
E Mime-Type für unbekanntes Programm Web Tier 6
M Best Practice für "Teilnahmebediengung akzeptieren" Web Tier 2
H Gibt es für das message-bundle eine Standard - Ordnung? Web Tier 2
J Welcher WebServer(-anbieter) für Servlets? Web Tier 5
N Webfrontend für vorhandenes Programm Web Tier 2
A Einfaches Filter-Servlet für Benutzer-Validierung Web Tier 3
R <fmt:formatDate> und 2 Zeichen für den Wochentag? Web Tier 2
T Ajax / Javascript Plugin für Eclipse Web Tier 1
T Was nehmen für eine Datenbankapplikation mit Webinterface Web Tier 5
G wert für hiddenfield per javascript setzten Web Tier 4
K Escape Charakter für EL Web Tier 4
leifg Parameter für Tags aus String lesen (JSP 1.2) Web Tier 2
N JSF: Servlet für Bilder: Verbindung zu Spring Service ? Web Tier 1
S Mehrere Styleklassen für Tabellenreihen Web Tier 4
R JSF Bilder aus CSS Datei werden nicht angezeigt. Web Tier 2
H JSF jsf/sessionScoped Bean - Bilder (jpg) werden nicht richtig dargestellt Web Tier 1
N Bilder aus Datenbank dynamisch in JSF streamen Web Tier 7
S JSF Primefaces Thema, Css wird geladen, nur die Bilder nicht, bzw Resource wird nicht aufgelöst Web Tier 5
H im IE werden leere Bilder mit X gekennzeichnet Web Tier 4
K Bilder nach dem Upload nutzen Web Tier 10
K Bilder in Java-Webapplikationen Web Tier 12
M Bilder in Servlets Web Tier 8
D Bilder werden nicht angezeigt Web Tier 2
D Bilder werden nicht angezeigt Web Tier 21
H Vorgehensweise: Bilder anzeigen/erstellen in JSP/Servlet ? Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben