# jsf: Servlet aufrufen, wie geht das? web.xml Fehler?



## A.T. (14. Apr 2008)

Hallo zusammen,
arbeite immer noch an meinem Bilddarstellungsproblem und es scheint das mich meine Basiswissenslücke immer wieder einholt... Lieder!

Man kann Bilder wohl darstellen indem man ein Servlet schreibt das ein Bild auf den OutputStream schreibt. Habe es so viersucht wie in dem Link beschrieben.
balusc.blogspot.com/2007/04/imageservlet.html#ImageServletServingFromDatabase

Nur wann und wie wird dieses Servlet aufgerufen? Bei mir leider irgendwie gar nicht. Setze zwar eine ID mit einer Bean aber dann passiert an der Stelle nichts...

Kann dies mit der web.xml zusammen hängen?
web.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>JGeldAktuellVerwaltung</display-name>
	<filter>
		<filter-name>MyFacesExtensionsFilter</filter-name>
		<filter-class>
			org.apache.myfaces.webapp.filter.ExtensionsFilter
		</filter-class>
		<init-param>
			<param-name>maxFileSize</param-name>
			<param-value>20m</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>MyFacesExtensionsFilter</filter-name>
		<servlet-name>Faces Servlet</servlet-name>
	</filter-mapping>
	<filter-mapping>
		<filter-name>MyFacesExtensionsFilter</filter-name>
		<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	
	<servlet>
		<servlet-name>imageServlet</servlet-name>
		<servlet-class>
			de.JGeldAktuellVerwaltung.Servlets.ImageServlet
		</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>imageServlet</servlet-name>
		<url-pattern>/image/*</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
```
Eclips meckert aber immer auf Höhe dieser Zeile <web-app id="WebApp_ID"> an das "The contend of element typ "web-app" must match "(ganz viele Attribute)"." Wenn ich die Tags zum zweiten servlet (imageServlet) komplett entfehrne ist diese Fehlermeldung weg...
Komme leider einfach nicht weiter. 
Habt ihr einen Tip für mich?


----------



## maki (14. Apr 2008)

Was willst du genau machen?

Willst du img Tags haben welche die URL zum Servlet beinhalten?

Sehe auf den ersten Blick keinen Fheler, kommentiere doch aus bis Eclipse sich nicht mehr beschwert.
Andererseits finde ich die Servlet API 2.3 etwas alt... 2.4 wäre imho zeitgemässer, ist aber nur so ein Gefühl.


----------



## A.T. (14. Apr 2008)

Das mit der API stimmt, muss ich mal ändern. Aber erst mal den Rest hinbekommen...

Wenn ich den Teil wegnehme ist auch die Warung weg.

```
<servlet> 
      <servlet-name>imageServlet</servlet-name> 
      <servlet-class> 
         de.JGeldAktuellVerwaltung.Servlets.ImageServlet 
      </servlet-class> 
      <load-on-startup>2</load-on-startup> 
   </servlet> 
   <servlet-mapping> 
      <servlet-name>imageServlet</servlet-name> 
      <url-pattern>/image/*</url-pattern> 
   </servlet-mapping>
```


Ich möchte Bilder die in einer Datenbank als Blob gespeichert sind anzeigen! Das ist mein Gesamtziel.
Zu den Thema habe ich lieder nicht viel gefunden. 
Das was ich gefunden habe besagte das ich ein Servlet in der Form oder so ähnlich brauche.

```
public class ImageServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    try {    
        response.setContentType("image/png");
        BufferedImage image = ((ModelController)UtilityBean.getSessionScopeControler("ModelController")).getBerater    ().getImgUnterschrift();
        OutputStream out = response.getOutputStream();
        ImageIO.write(image, "png", out);
    } catch (Exception e) {
        e.printStackTrace();
     }
}
```
Nur bekomme ich es nicht hin, dass dieses Servlet auch mal gestartet wird...

Danke für deine Hilfe!


----------



## maki (14. Apr 2008)

Wichtig ist imho, wie und wo du die Daten anzeigen möchtest.

Man kann zB. auch direkt auf einer ManagedBEan Binärströme an den Browser zurücksenden, ganz ohne Servlet.

ALso, mit IMG Tag oder zum Speichern???


----------



## A.T. (14. Apr 2008)

Möchte die auf einer JSF Seite mit dem Tag <h:graphicImage /> anzeigen.
Erst mal geht es nur ums anzeigen.


----------



## maki (14. Apr 2008)

Dann ist das Servlet die bessere Wahl.

Was ist denn jetzt das genaue Problem?

Was passiert, wenn du per URL auf das Servlet zugreifen willst?


----------



## A.T. (14. Apr 2008)

Ich weiß einfach nicht genau wie ich auf das Servlet zugreifen soll. Muss ich so etwas wie <h:graphicImage url="mypagacke.Servlet"/> schreiben? Oder etwas ganz anderes?


----------



## maki (14. Apr 2008)

http://server:port/webappcontext/servletmapping

Bei dir kenn ich nur das servletmapping, den Rest musst du einfügen:

http://server:port/webappcontext/image/wasauchimmer

Solltest darauf achten webappcontext dynamisch und nicht statisch zu setzen.

Wenn dir das alles nix sagt, solltest du ein Buch über Servlet-Grundlagen lesen, sind nämlich absolute Grundlagen.


----------



## freez (14. Apr 2008)

Hallo.

Ich habe mal ein konkretes Beispiel, welches bei mir in einer Anwendung so läuft:

Dieses Bild rufst du mit 

```
/MeinImageServlet?pic=0
```
 auf:

```
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		HttpSession session = req.getSession();
		
		ServletContext context = session.getServletContext();
	    String path = context.getRealPath("\\");
		
		int picNumber = -1;
		try {
			picNumber = Integer.parseInt(req.getParameter("pic"));
		} catch (NumberFormatException e) {
			return;
		}
	
		resp.setContentType("image/jpeg");
		OutputStream out = resp.getOutputStream();
		//Hier Datei holen oder aus der Datenbank lesen
		File f = new File(path + "pic" + picNumber + ".jpg");
		InputStream in = new FileInputStream(f);
		
		byte[] buffer = new byte[2048];
		for (int n; (n = in.read(buffer)) != -1;out.write(buffer,0,n));
		
		out.close();
		in.close();
		
	}
```

web.xml:

```
<servlet>
  	<servlet-name>MeinImageServlet</servlet-name>
  	<servlet-class>de.system.MeinImageServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>MeinImageServlet</servlet-name>
    <url-pattern>/MeinImageServlet</url-pattern>
  </servlet-mapping>
```


----------



## A.T. (15. Apr 2008)

@maki Du hast ja Recht damit das mir Servlet-Grundlagen fehlen. Versuche mir die aber zu erarbeiten. Nur machmal muss man leider Learning bei Doing vorgehen...

Aber danke für den Tip. Damit habe ich gefunden was ich brauchte.

@freez Vielen Dank für das Beispiel! So ähnlich habe ich das umgesetzt. Allerdings habe ich mein Servlet wie von maki beschrieben aufgerufen. Kann ich den gesamten Aufruf durch /MeinServletName/id="#{bean.id}" ersetzten?


----------



## maki (15. Apr 2008)

"learning by doing" setzt vopraus, dass man zumindest die Grundlagen kennt und diese dann auch vertrieft, was du meinst ist "trial & error" 

Man könnte dir jetzt noch viel mehr Beispielcode geben, der dann auch funktioniert.
Verstehen würdest du dass aber nicht, wärst auf Hilfe angewiesen, ständig.


----------



## A.T. (16. Apr 2008)

Maki du hast Recht! Und du musst deine Aussage auch nicht mit einem Smily entschärfen. Ist leider exakt so wie du es sagst!

Wenn ich also sag ich fange von 0 an.
Sollte ich mir dann erst mal möglichst viel über Servlets und JSP reinpfeifen oder an einer anderen Stelle anfangen? Und wo sollte es dann weiter gehen?


----------



## maki (16. Apr 2008)

Lies mehr über Servlets, zumindest die Grundlagen, dann etwas über JSP (ist sehr einfach wenn du Servlets einigermassen verstanden hast) und zum Schluss widme dich JSF, das ist zwar komplizierter als Servlets&JSPs, baut aber darauf auf.

Die erschiedenen Scopes (Session, etc.pp.), web.xml konfiguration, Webappcontext etc.pp., kurz die ganzen Grndlagen sind alles Teil der Servlet Spek, die ersten paar Kapitel aus einem Servlet Buch würden dir imho sehr helfen.


----------



## A.T. (17. Apr 2008)

Gut! Dann werde ich das so schnell wie möglich nachholen! Bleibt nur noch die Frage welches Buch mal lesen sollte...
http://www.amazon.de/Servlets-JavaServer-Pages-Platform-Enterprise/dp/0130893404/ref=sr_1_23?ie=UTF8&s=books-intl-de&qid=1208447991&sr=8-23
Wäre das z.B. in Ordnung? Oder ist das schon zu alt?

So ich lade mir das jetzt hier http://pdf.coreservlets.com/ runter und lese das. Dann sollten ein paar Grundlagen da sein, hoffe ich...
Und dann noch gegebenfalls das more Buch... http://pdf.moreservlets.com/


----------

