# Bild aus Datenbank ausgeben/anzeigen



## Raphalon (5. Apr 2012)

Hallo,

ich möchte ein Bild aus einer Datenbank auf einer JSF-Seite ausgeben. Wenn ich das richtig verstanden habe, gibt es dafür keine "out-of-the-box"-Lösung mit Mojarra. Habe daher die Möglichkeit unter The BalusC Code: ImageServlet umgesetzt. Hierzu scheint es jedoch erforderlich zu sein, immer einen extra Request an den Server zu senden, also z.B. mittels http://localhost:8080/project/image?id=fob3q20e30ac20f9y624889545c59vtj "manuell" über den Browser einen Request zu senden (der Hash-Wert steht als Identifikator in der Datenbank). Über einen expliziten Request, bei dem der Hash-Wert auch schon bekannt ist, funktioniert das bei mir auch.

Wenn das Bild aber automatisch direkt in eine jsf-Seite eingebettet werden soll (etwa mitten <h:graphicImage value="image?id=#{bild.hash}" />), welche es selbst nicht direkt angefordert hat, ist mir unklar, wie ich das umsetzen kann. Das Bild wird also vom User nicht explizit angefordert - der Hash-Wert ist noch unbekannt im ursprünglichen Request. Er muß vom Server ermittelt werden und das Bild dann direkt in die Response eingebettet werden.

Wollte dem Autor obiger Lösung diese Frage entsprechend stellen, aber trotz verfügbarer openId scheitert ein Post in seinem Blog.

Soll ich irgendeinen Code angeben (letztlich ist er so wie in dem angegebenen Blog)?

Gruß,

Raphalon


----------



## homer65 (5. Apr 2012)

Du kannst das mit normalem HTML - dem img Tag - und einem Servlet machen, das das Image aus der Datenbank liest und anzeigt.
Unter http://www.edv-ehm.de/ findest die JMyScanner Anwendung, die sowas macht als Beispiel mit Quellcode.


----------



## homer65 (5. Apr 2012)

Habe mir mal den BalusC Code angeguckt. Der sieht ja soweit ok aus.
Allerdings muß man in web.xml noch declarieren, das das Servlet aufgerufen wird, falls xyz.png angesprochen wird.


----------



## Raphalon (5. Apr 2012)

Habe es auch in der web.xml angegeben - es wird auch aufgerufen, *wenn* ich direkt im Browser die URL aufrufe, die letztlich das Bild aus der Datenbank extrahiert und anzeigt (also z.B. http://localhost:8080/project/image?id=fob3q20e30ac20f9y624889545c59vtj). Es wird aber nicht angezeigt, wenn der Anwender sich z.B. einloggt und in der folgenden Inhaltsseite (JSF) ein <h:graphicImage value="image?id=#{bild.hash}" /> steht. Der Hash wird zwar durch das Servlet passend zu dem Benutzer herausgesucht und entsprechend ersetzt, so dass in der Antwortseite dann ein <img src="image?id=fob3q20e30ac20f9y624889545c59vtj" /> steht, aber das Servlet wird nicht ausgeführt.

Hier mal meine web.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">

    <description>adm</description>

    <!-- Faces Servlet -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!-- Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>120</session-timeout>
    </session-config>

    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>

    <filter>
        <filter-name>Extensions Filter</filter-name>
        <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Extensions Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

    <servlet>
        <servlet-name>imageServlet</servlet-name>
        <servlet-class>de.comp.tools.ImageServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>imageServlet</servlet-name>
        <url-pattern>/image</url-pattern>
    </servlet-mapping>
</web-app>[/XML]


----------



## homer65 (5. Apr 2012)

Bei <img src="image?id=fob3q20e30ac20f9y624889545c59vtj" />  wird das Servlet auch nicht aufgerufen.
Es würde nur aufgerufen bei:
<img src="image" /> 
Die Information über den Hash müßtest du dem Servlet auf andere Weise zukommen lassen.

Edit:
z.B. könntest du deinem Servlet einen generischen Namen zuweisen.
<servlet-mapping>
 <servlet-name>imageServlet</servlet-name>
 <url-pattern>/image*</url-pattern>
</servlet-mapping>
Man beachte den *


----------



## Raphalon (5. Apr 2012)

Das Mapping hatte ich falsch angegeben in meinem Posting *grumpf*. Es lautet natürlich so:
[XML]<servlet>
		<servlet-name>imageServlet</servlet-name>
		<servlet-class>de.comp.tools.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
		<servlet-name>imageServlet</servlet-name>
		<url-pattern>/image/*</url-pattern>
</servlet-mapping>[/XML]
Mit 
	
	
	
	





```
<img src="image" />
```
  wird nichts gefunden - bei direktem Request über  http://localhost:8080/admshow/image?id=aeb3... wird ein 404 zurückgeliefert. 

Ist die Konfig wie oben angegeben, wird zwar das Servlet aufgerufen, aber nach wie vor nur dann, wenn ich den Request via URL-Eingabe in die Adresszeile des Browsers explizit mit der ID angebe, nicht aber innerhalb einer JSF-Seite.

Mal eine generelle Frage, die ich wohl bisher nicht ganz verstanden habe: Wann würde denn das Servlet im JSF-LifeCycle der Backing-Bean aufgerufen werden? Kann also ein erster Request (Bearbeitung durch Backing Bean) dazu führen, dass server-intern ein weiterer Request gesendet und bearbeitet (also durch das Servlet) wird, bevor der erste Request gerendered wird?


----------

