# Rest Webservice, Spring - Tomcat ohne Einsatz von Servlets



## LitWeb (27. Juli 2013)

Hallo Leute,

ich habe vor eine Client Server Anwendung umzusetzen.

Der Clientseitige Teil wird in reinem Xhtml und JavaScript - Jquery - JQueryUI umgesetzt. Es soll im Client Teil nichts mit Java eingesetzt werden. Das ist kein Problem.

Nun der Serverseitige Teil soll eine Java Anwendung sein die über einen Tomcat läuft und als REST Webservice dienen, Json wird hier als Datenaustauschformat hauptsächlich zum Einsatz kommen.

Es soll Java Seitig auch das Spring Framework zum Einsatz kommen, kein MVC sondern DI und Hibernate soll auch eingesetzt werden.

Nun habe ich reichlich gegoogelt, aber ich komme immer auf Sachen die auf Servlets hinauslaufen, was aber nicht sein soll.

Es soll eine EE Application werden und in Eclipse entwickelt werden.

Habt ihr für mich ne gute Quelle wie ich das aufbauen kann, was ich wie machen muss ohne Servlets einsetzen zu müssen?

Vielen für eure Hilfe Grüß an alle.


----------



## Writtscher (29. Juli 2013)

Das geht: JAX-RS und speziell hierzu Jersey. Hier ist ein kleines Tutorial mit Spring Integration: http://www.mkyong.com/webservices/jax-rs/jersey-spring-integration-example/.

Ich versteh nur nicht warum du auf Spring MVC verzichten willst, wenn du sowieso Spring im Backend nutzt. Spring MVC ist mächtig.

Edit: Ich seh dort wird auch Servlets verwendet. Somit vergiss das auch.


----------



## LitWeb (29. Juli 2013)

Genau darum gehts ja, es soll ohne Servlets sein. Und da finde ich momentan auch im Zusammenhang mit Spring nichts dazu.


----------



## oneof6 (29. Juli 2013)

Gibt's nen bestimmten Grund, warum Du keine Servlets einsetzen willst/sollst?

Du kannst das Servlet ja einfach nur als Dateneingang verwenden und den Rest der Applikation in J2EE schreiben. Mit Jscript schießt Du dann einfach einen POST request an das Servlet und sendest Dein Jason Format als Payload mit. Der Vorteil ist, dass das Servlet dir die Daten schon in den Objekten Request/Response kapselt und Du direkt auf z.B. GET Parameter und POST Payload zugreifen kannst.


----------



## LitWeb (29. Juli 2013)

Es soll da eben alles über Controller passieren und ein Servlet ist kein Controller. Heist die Request Eingänge gehen z.B. an einen Rest Controller, dieser lädt einen speziellen Service Controller und so weiter dann.


----------



## Writtscher (29. Juli 2013)

LitWeb hat gesagt.:


> Es soll da eben alles über Controller passieren und ein Servlet ist kein Controller. Heist die Request Eingänge gehen z.B. an einen Rest Controller, dieser lädt einen speziellen Service Controller und so weiter dann.



Wie bitte? Schon mal mit Spring MVC auseinandergesetzt? Du registrierst lediglich ein DispatcherServlet und dieses kümmert sich um alles. Folgendes Beispiel: Du registriest dein Dispatcher auf "/*". Jetzt werden alle einkommenden Request an das DispatcherServlet geleitet und dieses sucht dann den passenden Controller zur URL. Du hast überhaupt nichts mehr mit Servlets zu tun bzw. erstellst nur noch Controller keine Servlets.


----------



## LitWeb (29. Juli 2013)

Ok, ich muss da eben zugeben das ich im gängigen MVC Prinzip schon Ahnung habe, aber mit Spring so eben noch nicht.

Das heist, das Servlet kann da die Funktion eines Front Controllers übernehmen und dieser kann je nach Request dann Controller etc. laden? Richtig, oder verstehe ich das falsch?


----------



## Writtscher (29. Juli 2013)

LitWeb hat gesagt.:


> Ok, ich muss da eben zugeben das ich im gängigen MVC Prinzip schon Ahnung habe, aber mit Spring so eben noch nicht.
> 
> Das heist, das Servlet kann da die Funktion eines Front Controllers übernehmen und dieser kann je nach Request dann Controller etc. laden? Richtig, oder verstehe ich das falsch?



Spring MVC funktioniert wie folgt: Du registriest ein DispatcherServlet. Dieses Servlet hängt sich vor jeden Request und dispatched den request zu dem richtigen Controller. Du registrierst jetzt Controller. Sagen wir, du hast ein Registrierformular. Dieses Formular schickt per post (ajax von mir aus) Daten an localhost:8080/registrierung/neu. Dann würde dein Controller wie folgt aussehen:


```
@Controller @RequestMapping("registrierung")
public class RegistrierungControllerController {

   @Autowired
   private DeinService deinService;

   @RequestMapping(value= "neu", method = RequestMethod.POST)
   public void doPost() throws Exception {
       deinService.tuEtwas();
   }

}
```

Kein Servlet.

Edit: Spring ist so gut, dass du deinen Post also deine Daten nicht mappen musst oder konvertieren, sondern das macht Spring für dich. Sagen wir, du hast ein Benutzerobjekt und du schickt ein Jasonobjekt Benutzer, dass dem Java Benutzerobjekt entspricht, per Post, kannst du dieses als Parameter in deiner Methode annehmen also das heißt:


```
@Controller @RequestMapping("registrierung")
public class RegistrierungControllerController {

   @Autowired
   private DeinService deinService;

   @RequestMapping(value= "neu", method = RequestMethod.POST)
   public void doPost(Benutzer benutzer) throws Exception {
       deinService.tuEtwas();
   }

}
```

Hierfür brauchst du nur Jackson im Classpath.. Du kannst auch den HttpServletRequest und HttpServletResponse übergeben bekommen (und vieles mehr).


----------



## LitWeb (29. Juli 2013)

Die Methode doPost() in dem Controller, ist das frei gewählt der Name oder hat etwas mit dem Request zu tun falls die Daten per Post geschickt werden?

Wie muss denn so ein DispatcherServlet denn aussehen?


----------



## Writtscher (29. Juli 2013)

LitWeb hat gesagt.:


> Die Methode doPost() in dem Controller, ist das frei gewählt der Name oder hat etwas mit dem Request zu tun falls die Daten per Post geschickt werden?
> 
> Wie muss denn so ein DispatcherServlet denn aussehen?



Frei gewählt. Kann alles sein. Eine typische Konfiguration sieht aus:


```
...
  <servlet>
        <servlet-name>deinDispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>deinDispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
...
```

Fertig. Natürlich musst du jetzt das DispatcherServlet konfigurieren. Das ist aber keine Raketenwissenschaft und ist sehr gut dokumentiert und zu Spring MVC gibts es unzählige Tutorials.

Empfehlen würde ich für reinen Code:

https://github.com/SpringSource/spring-mvc-showcase?source=c
https://github.com/SpringSource/greenhouse


----------



## LitWeb (29. Juli 2013)

Ok, ich werde mir das ma zur Gemüte führen und wenn ich fragen habe mich zurück melden.

Ich arbeite mit Eclipse, wenn ich da mit Servlets arbeite muss ich da ein Dynamic Wen Project anlegen oder was anderes?


----------



## Writtscher (29. Juli 2013)

Arbeitest du nicht mit Maven oder Gradle? Wenn nicht, dann ja und du wirst dir die ganzen Bibliotheken manuell ziehen und zum Classpath hinzufügen. (sind schon einige und solltest du eine transitive Abhängigkeit vergessen, gibts Probleme. Ich würde dir empfehlen ein Maven oder Gradle Projekt aufzusetzen. Aber musst du selbst wissen)


----------



## LitWeb (29. Juli 2013)

Und jetzt kommts, leider habe ich von Maven keine wirkliche Ahnung. Gibts eine einfache gut verständliche Erklärung dafür? Ich habe schon welche gefunden, aber durch die Komplexität auch nicht so richtig verstanden.


----------



## Writtscher (29. Juli 2013)

Benutz Gradle. Ist besser dokumentiert, flexibler als Maven und kein XML. Gradle doku erklärt alles aber hier ein Beispiel:


```
apply plugin: 'war'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'commons-io', name: 'commons-io', version: '1.4'
    compile group: 'log4j', name: 'log4j', version: '1.2.15', ext: 'jar'
    .....
}
```

So würde es in etwas aussehen. Unter dependencies würdest du alle Bibliotheken reinschreiben, die du brauchst. Lad dir einfach Gradle runter, das hat ganz viele Beispiele mit dabei.

http://www.gradle.org/docs/current/userguide/tutorials.html#N100CE


----------



## LitWeb (29. Juli 2013)

Obwohl eine Frage noch, Rest Webservice und Servlets sind das nicht 2 verschiedene Sachen?

Ich will ja einen REST Webservice im Tomcat laufen haben.


----------



## Writtscher (29. Juli 2013)

http://de.wikipedia.org/wiki/Representational_State_Transfer


			
				Wikipedia hat gesagt.:
			
		

> Representational State Transfer (mit dem Akronym REST, seltener auch ReST) bezeichnet ein Programmierparadigma für Webanwendungen.



http://de.wikipedia.org/wiki/Servlets


			
				Wikipedia hat gesagt.:
			
		

> Als Servlets bezeichnet man Java-Klassen, deren Instanzen innerhalb eines Webservers Anfragen von Clients entgegennehmen und beantworten.



Ich hoffe das reicht als Erklärung. Beschäftige dich ein wenig mit Spring MVC und deine Verlangen nach REST wird gestillt .


----------



## LitWeb (31. Juli 2013)

Hallo, ich noch mal mit einer Frage.

Ich will den REST Webservice auf Basis von Maven und Spring aufbauen. Mit Maven einfach deswegen, weil mein zukünftiger Arbeitgeber dies auch nutzt.

In Eclipse ist das Plugin m2e Maven Integration für Eclipse installiert. Was für ein Project unter File->New muss ich nun anlegen um effektiv mit Maven und Spring arbeiten zu können?

Und sollte ich für Spring auch noch ein Plugin oder so für Eclipse installieren? Das Spring Framework selber habe ich schon gedownloaded.

Vielen noch einmal für hilfreiche Antworten. Gruß LitWeb


----------



## Writtscher (1. August 2013)

Maven:

http://www.youtube.com/watch?v=X8lu7Oi23YQ

Für Spring gibt es die Spring Tool Suite:
http://www.springsource.org/sts

Das ist im Hintergrund ein Eclipse nur erweitert um Springfunktionalitäten. Willst du aber das standard Eclipse verwenden, dann Spring IDE.

Spring Tool Suite
http://www.springsource.org/sts

Spring IDE (einfach im Eclipse Marketplace installieren, wie alle anderen Plugins auch)
http://marketplace.eclipse.org/content/spring-ide#.Ufn7xo3vjBY


----------



## gorefest (1. August 2013)

Ohne jetzt klugscheissen zu wollen; wenn man einen Glassfish oder JBoss Community Server nimmt, muss man nix mehr konfigurieren.

Da sind CDI, JPA, JAX-RS, JAX-WS und noch einiges mehr schon komplett lauffähig. Wenns keinen zwingenden Grund für Tomcat+Spring+whatever gibt, würde ich mir die Konfigurationsorgie gar net erst antun.

Ah ja, und mit mvn archteype:generate bekommt man auch direkt ein funktionierendes JEE Projekt in den Workspace gestampft, so das man direkt loslegen kann.

Grüße,
gore


----------

