# Servlet aufrufen



## padde479 (7. Sep 2005)

Moin moin!

Ich habe eine Applikation geschrieben, die online ein gif-Bild erzeugen soll. Das habe ich die beiden folgenden Klassen geschrieben:


```
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class GifServlet extends HttpServlet{
 public void doGet(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException{
  String text = req.getParameter("text"); // koennte null sein

  res.setContentType("image/gif");
  OutputStream out = res.getOutputStream();
  
  // Hilfsklasse im Package fbwi.prog4 aufrufen:
  fbwi.prog4.CreateImage.create(text,out);
  // alternativ: import fbwi.prog4;
  //CreateImage.create(text,out);
 }
}
```


```
package fbwi.prog4;
/* Die package-Anweisung legt den Namen des Packets fest. Sie muss vor allen anderen Anweisungen in 
 * der Datei stehen. Die übersetzte class-Datei muss sich im Verzeichnis ../WEB-INF/classes/fbwi/prog4
 * befinden.
 * Beim Übersetzen mit JCreator werden die Verzeichnisse für die packages automatisch erzeugt.
 */
import java.awt.*;
import java.io.*;
import Acme.JPM.Encoders.GifEncoder; // in gif.jar

public class CreateImage{
 public static void create(String text, OutputStream out){
  Frame f = new Frame();

  // Grafik-Kontext herstellen, ohne ein Fenster zu öffnen:
  f.addNotify();
  
  // Abmessungen des Bildes:
  int breite = 400;
  int hoehe  = 150;

  // Leeres internes Fenster erzeugen:
  Image img = f.createImage(breite,hoehe);

  // Malen ins Bild:
  Graphics g = img.getGraphics();

  // Nun können alle Grafikmethoden der Klasse Graphics benutzt werden:
  g.setColor(Color.BLUE);
  g.fillRect(0,0,breite,hoehe);
  // gelbes Oval:
  g.setColor(Color.YELLOW);
  g.drawOval(5,5,breite-10,hoehe-10);
  // Schriftart und -größe festlegen:
  Font font = new Font("SansSerif", Font.ITALIC,50);
  g.setFont(font);
  // Fontmetrik:
  FontMetrics fm = g.getFontMetrics();
  int textBreite = fm.stringWidth(text);
  int textHoehe  = fm.getAscent();
  // Textkoordinaten:
  int x = breite/2 - textBreite/2;
  int y = hoehe/2  + textHoehe/2;
  // Schatten (4 Pixel Versatz) in rot schreiben:
  g.setColor(Color.RED);
  g.drawString(text,x+4,y+4);
  // Text in grün schreiben:
  g.setColor(Color.GREEN);
  g.drawString(text,x,y);

  // Bild in gif umwandeln:
  try{
   GifEncoder gifenc = new GifEncoder(img,out);
   gifenc.encode();
  }catch(IOException e){
   System.err.println(e.toString());
  }
 }// end create()
}
```

Meine web.xml-Datei sieht folgendermaßen aus:


```
<?xml version="1.0" encoding="ISO-8859-1"?>
<!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 >
 <servlet>
  <servlet-name>RequestHandlingExample</servlet-name>     
  <servlet-class>RequestHandlingExample</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>aufg1</servlet-name>
  <servlet-class>Prog4Ueb8Aufg1</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>aufg2</servlet-name>
  <servlet-class>Prog4Ueb8Aufg2</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>aufg3</servlet-name>
  <servlet-class>Prog4Ueb8Aufg3</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>aufg4</servlet-name>
  <servlet-class>GifServlet</servlet-class>
 </servlet>

 
 <servlet-mapping>
  <servlet-name>RequestHandlingExample</servlet-name>
  <url-pattern>/servlet/RequestHandlingExample</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>aufg1</servlet-name>
  <url-pattern>/servlet/aufg1</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>aufg2</servlet-name>
  <url-pattern>/servlet/aufg2</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>aufg3</servlet-name>
  <url-pattern>/servlet/aufg3</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>aufg4</servlet-name>
  <url-pattern>/gifmaker</url-pattern>
 </servlet-mapping>

</web-app>
```

Unter dem Verzeichnis WEB-INF/classes liegen die Verzeichnisse fbwi/prog4/. Darin liegt die Klasse CreateImage.class. Im Verzeichnis classes liegt die Datei GifServlet.java bzw. -.ckass. Beim Kompilieren funktioniert ja alles super. Wenn ich allerdings

http://localhost:8080/examOwn/gifmaker?text=Hallo+Welt

aufrufe, bekomme ich eine Fehlermeldung. Und zwar folgende:

*type* Exception report
*message*
*description* The server encountered an internal error () that prevented it from fulfilling this request.
*exception*
javax.servlet.ServletException: Servlet execution threw an exception
*root cause*
java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
	sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
	sun.awt.X11GraphicsEnvironment.access$000(X11GraphicsEnvironment.java:53)
	sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:142)
	java.security.AccessController.doPrivileged(Native Method)
	sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131)
	java.lang.Class.forName0(Native Method)
	java.lang.Class.forName(Class.java:164)
	java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:6 8)
	java.awt.Window.init(Window.java:270)
	java.awt.Window.<init>(Window.java:318)
	java.awt.Frame.<init>(Frame.java:419)
	java.awt.Frame.<init>(Frame.java:384)
	fbwi.prog4.CreateImage.create(CreateImage.java:13)
	GifServlet.doGet(GifServlet.java:15)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
*note* The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 logs.

Kann mir jemand sagen, was ich da falsch mache?


----------



## KSG9|sebastian (7. Sep 2005)

ich nehm mal an, dass du linux laufen hast ?
vll. isses ein problem mit Linux ! Probiers mal mit Swing statt mit AWT.

Was anderes:

Benutz kein default-package, ist ist laut Konvetion falsch.
In der web.xml solltest du bei servlet-class dann den kompletten pfad angeben, also:

<servlet-class>das.ist.ein.package.Klasse</servlet-class>


----------



## Bleiglanz (7. Sep 2005)

google mal nach 

tomcat+images+headless

am einfachsten ist es natürlich, du installierst X auf deinem Server...


----------



## padde479 (7. Sep 2005)

Ja, habe Linux laufen. Und mit der servlet-class ist auch alles okay. Schließlich liegt GifServlet.class unter classes und CreateImage unter fbwi.prog4. Das kann's also nicht sein. Will mich da aber gar nicht festlegen. Bin noch blutiger Anfänger was jsp und servlets angeht. :shock: 

Was ist denn damit gemeint:



> Benutz kein default-package, ist ist laut Konvetion falsch.


----------

