RESTful Web Service Tutorial - Erstellung eines Gästebuchs mit RESTful Web Service

Realisiert mit Eclipse 3.6, JAX-RS 1.1, Jersey 1.7 und Tomcat 7.0

Autor: Kai Stapel und Tristan Wehrmaker
Version: 04.06.2011

Hinweis: Dieses Tutorial ist im Rahmen der Übung zur Vorlesung Entwicklung service-orientierter Architekturen und Anwendungen (SOA 2011) entstanden.

In diesem Tutorial wird beschrieben, wie ein RESTful Gästebuch Webservice unter Verwendung von Eclipse und JAX-RS (Jersey) erstellt wird. Um die Funktionsweise des Gästebuch-Web-Services zu testen, wird ein Deployment auf Apache Tomcat beschrieben.

Übersicht

  1. XSD: Gästebuch-Schema erstellen
  2. JAXB: Generierung der Java-Klassen mit xjc
  3. JAX-RS Implementierung Jersey installieren
  4. Service: Implementierung des RESTful Gästebuch-Webservice
  5. Service auf Tomcat-Server deployen
  6. Service ausprobieren

Voraussetzungen

Dieses Tutorial setzt folgendes voraus:

Tutorial

1. XSD: Gästebuch-Schema erstellen

Wir starten dieses Tutorial, indem wir die Ressourcen, die unseren RESTful-Service ausmachen sollen, in Form eines XML-Schemas modellieren. XML-Schema bietet sich als Startpunkt an, da wir so unser Datenmodell Programmiersprachen-unabhängig erstellen können, und, da die JAX-RS Referenzimplementierung Jersey nativ über das in der aktuellen JDK enthaltene JAXB mit XML umgehen kann.

  1. Neues dynamisches Web-Projekt für den Service: Erstellen Sie in Eclipse ein neues dynamisches Web-Projekt, indem sie im Kontextmenü der Projektansicht New -> Project... -> Web -> Dynamic Web Project wählen. Klicken Sie auf Next.

    Screenshot: Neues Dynamische-Web-Projekt

    Geben Sie einen Projektnamen für den Service ein, z. B. RESTfulGuestBookService. Die Target Runtime sollte auf Apache Tomcat 7.0 stehen. Falls nicht, wählen Sie Apache Tomcat 7.0 aus der Liste aus oder erstellen Sie eine neue Runtime.

    Screenshot: New-Wizard für Dynamische-Web-Projekte

  2. Neuer Ordner für XML-Dateien: Erstellen Sie einen neuen Ordner für die XML-Dateien, indem sie im Kontextmenü der Projektansicht New -> Folder wählen. Geben Sie als Namen des Ordners xml ein und klicken Sie auf Finish.

    Screenshot: XML-Ordner

  3. Neues XML-Schema: Erstellen Sie ein neues XML-Schema, indem sie im Kontextmenü des XML-Ordners New -> XML Schema wählen. Erstellen Sie ein Schema mit dem Namen GuestBook.xsd.

    Screenshot: Neues XML-Schema

  4. Schema Namespace: Ändern Sie den Schema-Namespace auf
    http://soa11.se.unihannover.de/GuestBook/Schema
    indem Sie über dem Schema (oben) mit Rechtsklick auf Show properties klicken.

    Screenshot: Schema-Namespace

  5. Gästebuch-Schema-Typ: Erstellen Sie einen Gästebuch-Schema-Typ mit dem Namen GuestBook, indem Sie über Types einen Rechtsklick machen und Add Complex Type wählen.

    Screenshot: XSD: Neuer Complex Type

    Machen Sie einen Doppelklick auf den neu erstellten Typ. Fügen Sie dem Gästebuch-Typ ein Gästebucheintrag-Element hinzu, indem sie per Rechtsklick auf GuestBook und Add Element klicken. Nennen Sie das Element entry.

    Screenshot: XSD: Neues Element

  6. Gästebuch-Eintrag-Schema-Typ: Erstellen Sie einen neuen Schema-Type mit dem Namen GuestBookEntry, indem Sie per Rechtsklick auf string -> Set Type -> New.. klicken.

    Screenshot: XSD: Set Type -> New...

    Screenshot: XSD: New Type

    Fügen Sie dem GuestBookEntry ein Attribut ID, ein Attribut href (Add Attribute) und die drei Elemente (Add Element) name, eMail und message hinzu.

    Screenshot: XSD: Gästebuch-Eintrag-Typ

  7. Multiplizität des Gästebuch-Typs anpassen: Stellen Sie die Multiplizität des Gästebuch-Typs auf 0..* (Zero or more).

    Screenshot: XSD: Multiplizität des Gästebuch-Typs setzen

    Speichern Sie das Schema und wechseln Sie in die Übersicht.

    Screenshot: XSD: Zurück zur Übersicht

    Das GuestBook.xsd-Schema sollte schließlich so aussehen:

    Screenshot: Das fertige Schema (XSD)

2. JAXB: Generierung der Java-Klassen mit xjc

In diesem Schritt generieren wir aus dem XML-Schema die Java-Modell-Klassen mit Hilfe des JAXB-Tools xjc.

  1. Generierung mit xjc: Öffnen Sie ein Terminal und wechseln Sie in das Service-Projekt-Verzeichnis. Generieren Sie die Klassen mit folgendem Befehl:
    xjc -d src xml/GuestBook.xsd
    
    Der Schalter -d gibt den Zielordner an für die gnerierten Klassen an. Es werden automatisch Packages entsprechend der Namespaces der Schematypen angelegt.

    Screenshot: xjc-Aufruf

  2. Projekt aktualisieren: Aktualisieren Sie das Projekt in Eclipse, damit die Klassen sichtbar werden.

    Screenshot: Übsericht der generierten Klassen

3. JAX-RS Implementierung Jersey installieren

In diesem Schritt laden wir die Jersey JARs herunter und kopieren sie in den WEB-INF-Ordner des dynamischen Web-Projekts, damit die Jersey-Klassen beim Ausführen der Webanwendung vom Tomcat-Server gefunden werden können.

  1. Jersey-JARs downloaden: Laden Sie die folgenden JARs herunter und kopieren Sie sie in den WebContent/WEB-INF/lib-Ordner.

     

    Aktualisieren Sie den Ordner WebContent/WEB-INF/lib.

    Screenshot: Jersey JARs

  2. Jersey-JARs zum Java-Build-Path hinzufügen: Fügen Sie die JARs dem Java-Build-Path hinzu, indem Sie alle drei JARs selektieren und per Rechtsklick Build Path -> Add to Build Path wählen.

    Screenshot: Jersey Add JARs to Build Path

4. Service: Implementierung des RESTful Gästebuch-Webservice

In diesem Schritt wird der RESTful Service erstellt, indem zu den beiden Modellklassen GuestBook und GuestBookEntry je eine Ressourcen-Klasse erstellt wird. Anschließend werden Methoden zum Abruf des gesamten Gästebuchs, einzelner Gästebucheinträge und zum Hinzufügen eines neuen Gästebucheintrags erstellt. Diese Methoden werden über JAX-RS-Annotationen als REST Service gekennzeichnet. Jersey nutzt die Annotationen, um die Funktionen über einen Webserver per HTTP zur Verfügung zu stellen.

  1. Gästebuch-Ressourcen erstellen: Erstellen Sie zunächst ein neues Package de.unihannover.se.soa11.guestbook.rest. Erstellen Sie dann in dem neuen Package die beiden Klassen GuestBookResource und GuestBookEntryResource. Annotieren Sie die GuestBookResource-Klasse mit @Path("guestbook"), um den späteren Pfad der Gästebuch-Ressource festzulegen. Die Ressource ist dann später z.B. unter http://localhost:8080/RESTfulGuestBookService/guestbook erreichbar.

    Screenshot: Path-Annotation

    Fügen Sie GuestBookResource eine statische Klassenvariable vom Typ GuestBook hinzu und initialisieren sie sie. Die Klasse GuestBookResource sieht nun wie folgt aus:
    package de.unihannover.se.soa11.guestbook.rest;
    
    import javax.ws.rs.Path;
    
    import de.unihannover.se.soa11.guestbook.schema.GuestBook;
    
    @Path("guestbook")
    public class GuestBookResource {
    	
    	private static GuestBook guestBook = new GuestBook();
    
    }
    
    Fügen Sie GuestBookEntryResource eine Klassenvariable vom Typ GuestBookEntry hinzu und erstellen Sie einen Konstruktor, mit dem diese Variable initialisiert werden kann. Die Klasse GuestBookEntryResource sieht nun wie folgt aus:
    package de.unihannover.se.soa11.guestbook.rest;
    
    import de.unihannover.se.soa11.guestbook.schema.GuestBookEntry;
    
    public class GuestBookEntryResource {
    
    	private GuestBookEntry entry;
    
    	public GuestBookEntryResource(GuestBookEntry entry) {
    		super();
    		this.entry = entry;
    	}
    }
    
  2. GET-Methoden implementieren: Erstellen Sie in der GuestBookResource-Klasse die Methoden public GuestBook getGuestBook() und public GuestBookEntry getGuestBookEntry(int index). Annotieren Sie die getGuestBook-Methode mit @GET und @Produces{MediaType.APPLICATION_XML}, um sie als Methode zu kennzeichnen, die die Gästebuch-Ressource per HTTP-GET verfügbar macht und Daten im Mime-Typ application/xml liefert. Lassen Sie die Methode die Klassenvariable guestBook zurückgeben. Die fertige Methode sieht nun wie folgt aus:
    	@GET
    	@Produces(MediaType.APPLICATION_XML)
    	public GuestBook getGuestBook() {
    		return guestBook;
    	}
    
    Implementieren Sie die getGuestBookEntry-Methode wie folgt:
    	@Path("{id}")
    	public GuestBookEntryResource getGuestBookEntry(@PathParam("id") int id) {
    		if(id >= guestBook.getEntry().size())
    			throw new NotFoundException();
    		
    		return new GuestBookEntryResource(guestBook.getEntry().get(id));
    	}
    
    Die Annotation @Path({id}) sorgt hier dafür, dass ein Aufruf an die URI /guestbook/{id}, an die Methode getGuestBookEntry weitergeleitet wird. {id} ist dabei ein Ausdruck in der Expression Language (EL). Mit der Parameter-Annotation @PathParam("id") wird die in der URI übergebene ID in die Variable id injiziert, so dass sie in der Methode zur Verfügung steht. Alternativ gäbe es auch die Annotationen @QueryParam, um Werte über die Query-Parameter des Aufrufs der Form /guestbook?vorlesung=SOA11, oder @FormParam, um Parameter aus übermittelten application/x-www-url-encoded-Formularen abzufragen. Ein Beispiel für die Verwendung von @FormParam finden sie bei der zweiten postGuestBookEntry-Methode weiter unten.

    Die Methode getGuestBookEntry gibt eine Instanz der Klasse GuestBookEntryResource zurück. In einem solchen Fall wird die Ausführung an diese Unterressource weitergeleitet. Hier wird dann weiter geprüft welche HTTP-Methode aufgerufen wird und welche Java-Methode somit ausgeführt werden muss. Außerdem ist es in einer solchen Unterressource wiederum möglich Weiterleitungen zu weiteren Unterressourcen zu definieren.

    Screenshot: GET-Methoden von GuestBookResource

    Erstellen Sie in der GuestBookEntryResource-Klasse die Methode public GuestBookEntry getGuestBookEntry() und lassen Sie sie die Klassenvariable entry zurückgeben. Annotieren Sie die Methode mit @GET und @Produces{MediaType.APPLICATION_XML}, um sie als Methode zu kennzeichnen, die die Gästebucheintrag-Ressource per HTTP-GET verfügbar macht und Daten im Mime-Typ application/xml liefert. Die fertige Methode sieht nun wie folgt aus:
    	@GET
    	@Produces(MediaType.APPLICATION_XML)
    	public GuestBookEntry getGuestBookEntry() {
    		return this.entry;
    	}
    
    Annotieren Sie abschließend die Schema-Klasse GuestBook mit @XmlRootElement und GuestBookEntry mit @XmlRootElement(name = "entry", namespace = "http://soa11.se.unihannover.de/GuestBook/Schema"), damit sie von Jersey, mit Hilfe von JAXB, automatisch in XML-Repräsentationen serialisiert werden können. Die beiden Klassendeklarationen sollten dann wie folgt aussehen:
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "GuestBook", propOrder = {
        "entry"
    })
    @XmlRootElement
    public class GuestBook {
    [...]
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "GuestBookEntry", propOrder = {
        "name",
        "eMail",
        "message"
    })
    @XmlRootElement(name = "entry", namespace = "http://soa11.se.unihannover.de/GuestBook/Schema")
    public class GuestBookEntry {
    [...]
    

    Screenshot: XmlRootElement-Annotation für Schema-Klasse GuestBookEntry

  3. POST-Methoden implementieren: Erstellen Sie zunächst eine Klassenvariable UriInfo uriInfo und annotieren Sie sie mit @Context.
    	@Context
    	UriInfo uriInfo;
    
    Erstellen Sie nun eine Hilfsmethode private URI addEntry(GuestBookEntry entry), mit der ein neuer Gästebucheintrag dem Gästebuchmodell hinzugefügt werden kann.
    	private URI addEntry(GuestBookEntry entry) {
    		System.out.println("DEBUG: adding new entry ("
    			+ entry.getName() + ", " + entry.getEMail() + ", "
    			+ (entry.getMessage() != null ? (entry.getMessage()
    				.length() < 20 ? entry.getMessage() : entry
    				.getMessage().substring(0, 20) + " [...]") : "")
    			+ ").");
    
    		int index = guestBook.getEntry().size();
    		
    		// overwrite ID
    		entry.setID("gbe-" + index);
    
    		// create location of new resource
    		URI location = uriInfo.getAbsolutePathBuilder()
    				.path("" + index).build();
    		
    		// set location as href
    		entry.setHref(location.toString());
    		
    		guestBook.getEntry().add(entry);
    		
    		// return new location
    		return location;
    	}
    
    Diese Methode enthält Debug-Ausgaben, setzt die ID des neuen Gästebucheintrags, setzt die URI der neuen Resource, speichert den neuen Eintrag im Datenmodell und liefert den URI der neuen Gästebucheintrag-Resource zurück.

    Erstellen Sie schließlich in der GuestBookResource-Klasse die Methode public Response postGuestBookEntry(GuestBookEntry entry). Annotieren Sie die postGuestBookEntry-Methode mit @POST und @Consumes{MediaType.APPLICATION_XML}, um sie als Methode zu kennzeichnen, die eine neue Gästebucheintrag-Ressource per HTTP-POST und Daten im Mime-Typ application/xml entgegen nimmt. Fügen Sie den Eintrag mit der addEntry-Methode dem Gästebuch hinzu. Als Rückgabewert wollen wir den HTTP-Status-Code 201 inklusive dem URI der neuen Resource liefern. Die fertige Methode sieht wie folgt aus:
    	@POST
    	@Consumes(MediaType.APPLICATION_XML)
    	public Response postGuestBookEntry(GuestBookEntry entry) {
    
    		URI location = addEntry(entry);
    
    		// return HTTP status 201 "created" with location of new resource
    		return Response.created(location).build();
    	}
    
    Mit dieser Methode kann ein neuer Gästebucheintrag erstellt werden, indem ein HTTP-POST Request an http://localhost:8080/RESTfulGuestBook/guestbook mit Content Type application/xml und dem neuen Eintrag als valides XML im Content des Requests gesendet wird:
    <entry xmlns="http://soa11.se.unihannover.de/GuestBook/Schema">
    	<name>Kai</name>
    	<eMail>kai@example.org</eMail>
    	<message>Hallo</message>
    </entry>
    
    Damit wir später einen neuen Gästebucheintrag auch einfach über ein HTML-Formular erstellen können, fügen wir noch eine weitere POST-Methode hinzu. Sie nimmt Daten nicht als XML, sondern als application/x-www-form-urlencoded entgegen, also z.B. im Format name=Kai&email=kai%40example.org&message=Hallo:
    	@POST
    	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    	public Response postGuestBookEntry(
    			@FormParam("name") String name,
    			@FormParam("email") String email,
    			@FormParam("message") String message) {
    
    		if (name == null || email == null || message == null) {
    			throw new WebApplicationException(
    				Response.status(400).entity("Guest book entry could not be created, " +
    						"because either name, email or message were missing. " +
    						"The following information needs to be supplied: " +
    						"name, email, and message.").build());
    		}
    
    		GuestBookEntry entry = new GuestBookEntry();
    
    		entry.setName(name);
    		entry.setEMail(email);
    		entry.setMessage(message);
    
    		URI location = addEntry(entry);
    
    		// return HTTP status 201 "created" with location of new resource
    		return Response.created(location).build();
    	}
    
    Damit das Web-Formular auch unter Firefox funktioniert, benötigen wir noch die folgende OPTIONS-Methode:
    	@OPTIONS
    	public Response optionsOptions() {
    		return Response.ok().
    			header("Allow-Control-Allow-Methods", "POST,GET,OPTIONS").
    			header("Access-Control-Allow-Origin", "*").build();
    	}
    
    Die fertige GuestBookResource-Klasse sieht dann inklusive Debug-Ausgaben wie folgt aus: GuestBookResource.java
    package de.unihannover.se.soa11.guestbook.rest;
    
    import java.net.URI;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.FormParam;
    import javax.ws.rs.GET;
    import javax.ws.rs.OPTIONS;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.WebApplicationException;
    import javax.ws.rs.core.Context;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    import javax.ws.rs.core.UriInfo;
    
    import com.sun.jersey.api.NotFoundException;
    
    import de.unihannover.se.soa11.guestbook.schema.GuestBook;
    import de.unihannover.se.soa11.guestbook.schema.GuestBookEntry;
    
    @Path("guestbook")
    public class GuestBookResource {
    	
    	private static GuestBook guestBook = new GuestBook();
    
    	@Context
    	UriInfo uriInfo;
    	
    	@GET
    	@Produces(MediaType.APPLICATION_XML)
    	public GuestBook getGuestBook() {
    		return guestBook;
    	}
    
    	@Path("{id}")
    	public GuestBookEntryResource getGuestBookEntry(@PathParam("id") int id) {
    		if(id >= guestBook.getEntry().size())
    			throw new NotFoundException();
    		
    		return new GuestBookEntryResource(guestBook.getEntry().get(id));
    	}
    
    	@POST
    	@Consumes(MediaType.APPLICATION_XML)
    	public Response postGuestBookEntry(GuestBookEntry entry) {
    
    		URI location = addEntry(entry);
    
    		// return HTTP status 201 "created" with location of new resource
    		return Response.created(location).build();
    	}
    
    	@POST
    	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    	public Response postGuestBookEntry(
    			@FormParam("name") String name,
    			@FormParam("email") String email,
    			@FormParam("message") String message) {
    
    		if (name == null || email == null || message == null) {
    			throw new WebApplicationException(
    				Response.status(400).entity("Guest book entry could not be created, " +
    						"because either name, email or message were missing. " +
    						"The following information needs to be supplied: " +
    						"name, email, and message.").build());
    		}
    
    		GuestBookEntry entry = new GuestBookEntry();
    
    		entry.setName(name);
    		entry.setEMail(email);
    		entry.setMessage(message);
    
    		URI location = addEntry(entry);
    
    		// return HTTP status 201 "created" with location of new resource
    		return Response.created(location).build();
    	}
    
    	@OPTIONS
    	public Response optionsOptions() {
    		return Response.ok().
    			header("Allow-Control-Allow-Methods", "POST,GET,OPTIONS").
    			header("Access-Control-Allow-Origin", "*").build();
    	}
    	
    	private URI addEntry(GuestBookEntry entry) {
    		System.out.println("DEBUG: adding new entry ("
    			+ entry.getName() + ", " + entry.getEMail() + ", "
    			+ (entry.getMessage() != null ? (entry.getMessage()
    				.length() < 20 ? entry.getMessage() : entry
    				.getMessage().substring(0, 20) + " [...]") : "")
    			+ ").");
    
    		int index = guestBook.getEntry().size();
    		
    		// overwrite ID
    		entry.setID("gbe-" + index);
    
    		// create location of new resource
    		URI location = uriInfo.getAbsolutePathBuilder()
    				.path("" + index).build();
    		
    		// set location as href
    		entry.setHref(location.toString());
    		
    		guestBook.getEntry().add(entry);
    		
    		// return new location
    		return location;
    	}
    }
    

5. Service auf Tomcat-Server deployen

Um den RESTful Service ausprobieren und später auch produktiv einsetzen zu können, muss er in einen Web-Application-Server deployt werden. Wir nutzen hier Apache Tomcat. Stellen Sie zunächst sicher, dass Eclipse korrekt mit Tomcat verbunden ist. In diesem Tutorial benutzen wir Tomcat 7.0.

  1. Application-Klasse erstellen: Mit Tomcat 7 und dem Servlet 3.0 Standard ist es möglich ohne web.xml das Jersey-Servlet zu konfigurieren. Erstellen Sie dazu im Package de.unihannover.se.soa11.guestbook die Klasse GuestBookApplication mit folgendem Inhalt:
    package de.unihannover.se.soa11.guestbook;
    
    import javax.ws.rs.ApplicationPath;
    
    import com.sun.jersey.api.core.PackagesResourceConfig;
    
    @ApplicationPath("*")
    public class GuestBookApplication extends PackagesResourceConfig {
    
    	public GuestBookApplication() {
    		super("de.unihannover.se.soa11.guestbook.rest");
    	}
    	
    }
    

    Screenshot: Die GuestBookApplication-Klasse

    Falls Sie das Deployment über die Datei WebContent/WEB-INF/web.xml konfigurieren möchten, fügen Sie dort den folgenden Inhalt ein (Nur für Servlet 2.5, z.B. bei Tomcat 6, notwendig):
    	<servlet>
    		<servlet-name>RESTful Guest Book with Jersey</servlet-name>
    		<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>RESTful Guest Book with Jersey</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
    
    Öffnen Sie die Servers-View und fügen Sie dem Tomcat-Server via Add and Remove... das Projekt RESTfulGuestBookService hinzu.

    Screenshot: Tomcat-Server in der Servers-View

    Screenshot: Projekt dem Tomcat-Server zuordnen

    Starten Sie den Server.

    Screenshot: Tomcat-Server starten

6. Service ausprobieren

Der Server sollte nun unter http://localhost:8080/RESTfulGuestBookService/guestbook die Gästebuch-Ressource bereit stellen. Testen Sie den Service mit einem HTTP-Client (Beispiele: Firefox Plug-In: Poster, Kommandozeile: curl Mac OS: HTTP Client). Um sich den Inhalt des Gästebuchs anzusehen, reicht auch ein Browser, der XML anzeigen kann, wie Firefox.

Screenshot: Gästebuch-Ressource im Firefox

Direkt nach dem Start des Servers ist das Gästebuch natürlich noch leer. Sie können mit dem folgenden Formular neue Gästebucheinträge erstellen. Dabei wird die Methode der Gästebuch-Ressource aufgerufen. Dies funktioniert nur, wenn der REST-Service unter der URL http://localhost:8080/RESTfulGuestBookService/guestbook verfügbar ist.

Erstellen Sie einen neuen Gästebucheintrag:

Neuer Gästebucheintrag
Name
E-Mail
Nachricht
 

 

Der HTML-Quellcode dieses Formulars sieht wie folgt aus:

<form action="http://localhost:8080/RESTfulGuestBookService/guestbook" method="POST" enctype="application/x-www-form-urlencoded">
	<table>
		<tr><th colspan="2">Neuer Gästebucheintrag</th></tr>
		<tr><td>Name</td><td><input type="text" size="60" maxlength="100" name="name"></td></tr>
		<tr><td>E-Mail</td><td><input type="text" size="60" maxlength="100" name="email"></td></tr>
		<tr><td>Nachricht</td><td>
			<textarea cols="45" rows="4" name="message"></textarea>
		</td></tr>
		<tr><td> </td><td><input type="submit" id="submitButton" name="submit" value="Abschicken"></td></tr>
	</table>
</form>

 

Beispielgästebucheinträge in der XML-Ansicht von Firefox:

Screenshot: Gästebucheinträge im Firefox

Eclipse-Projekte

Das fertige JAX-RS REST Gästebuch Web Service Beispiel kann direkt in Eclipse als Projekt importiert werden. Klicken Sie dazu jeweils auf Import -> General -> Existing Projects into Workspace -> Select Archive File....

Einige wichtige Dateien können hier auch direkt geladen werden:

Weitere Tutorials des Fachgebiets


Letzte Änderung: 06.06.2011 von Kai Stapel