# Class Funktion mit Ajax rufen



## Kenan89 (27. Mrz 2012)

Hallo,

ich wollte wissen, wie man eine Methode einer Klasse mit Ajax aufrufen kann?

Also ich habe in meiner package xy die Klasse Autos. In dieser Klasse ist jetzt eine Methode mit tanken(int liter){}.
Die Klasse Autos wurde schon in index.jsp initialisiert mit 
	
	
	
	





```
Autos autos = new Autos()
```
.
Ich hätte mir soetwas vorgestellt:

```
"$.get('autos.tanken', {param: 50}, refreshTable);" +
```

Ist es möglich?


----------



## SlaterB (27. Mrz 2012)

Webanwendungen sind eine komplizierte Sache mit Standards und Frameworks,
Browser können nur Http-Requests senden, jedenfalls ist das der weltweite Standard,
Webserver müssen wissen wer der User war und irgendeine Ahnung haben welches JSP du damit meinen könntest, was das damalige Auto-Objekt (vor 5 sec, zwischendurch 100 andere Requests) wohl war, ist, sein wird 
und inwiefern daraus noch Information in der Ajax-Antwort zurück übertragen werden kann

sich irgendwas dazu auszudenken ist in der Regel zum Scheitern verurteilt,
halte dich an Frameworks wie JSF oder Seam, die definieren in Büchern mit hunderten Seiten ausgefallene
Konzepte um solche Abstraktionsebenen für Beans, die Requests überdauern, abzubilden

Ajax ist fast ein Thema für sich, nicht unbedingt überall eingebunden, und wenn dann kaum genau so wie du es gern hättest,
wahrscheinlich kannst du auch nicht in die JSP-nahen Gefilde eingreifen sondern musst etwas separat im Server neue Daten laden + speichern,
aber das muss dir reichen, andere Wege kommen quasi nicht in Frage


----------



## Kenan89 (27. Mrz 2012)

Jetzt habe ich das folgendermaßen ausprobiert, was nicht geklappt hat(aber wahrscheinlich habe ich ja einen Fehler gemacht).
Ist es theoretisch möglich, einen Button auf der index.jsp anzuklicken, sodass dieser Button mit dem EventHandler onclick ein request zum Server schickt mit dem Ziel index.jsp(also auf sich selbst). Dann empfängt ein Codeblock, welches schon in der index.jsp geschrieben ist diesen request und ruft eine Java Funktion in der index.jsp auf...

So ungefähr:

index.jsp:


```
<% out.println("Test: "+request.getParameter("par1")); %>
<%!
public String showIt(String txt){
return txt;
}

%>

<button id="testButton">Test</button>

<script>
$.get("index.jsp", {par1: "Hallo"}, bestaetigung);
function bestaetigung(){
 alert("OK");
}
</script>
```


----------



## SlaterB (27. Mrz 2012)

hmm, ich habe es einmal (mehr oder weniger) gewagt aber verabschiede mich nun zu 'ist es theoretisch möglich'-Fragen

nochmal: gerade in so hochkomplexen Umgebungen solltest du das vorhandene lernen und dich danach richten
statt beliebige Abläufe auszudenken und dann die zugehörigen Befehle zu suchen


----------



## JimPanse (27. Mrz 2012)

Bsp. Java Servlet & JQuery

Implementing Ajax in Java web application using JQuery

Command-Pattern

Peter M. Rose, The Command Design Pattern


----------



## Kenan89 (27. Mrz 2012)

Hey das könnte klappen, ich probiere das auch, danke für die Links.


----------



## mvitz (27. Mrz 2012)

Ansonsten hilft auch noch DWR (stimme aber SlaterB zu)


----------



## Kenan89 (28. Mrz 2012)

Okay, es ist tatsächlich möglich, mit ajax eine Klassenmethode aufzurufen(man muss ein bisschen in der web.xml-Datei schrauben)

Jetzt ist mein Problem, dass der Response ein String sein soll. Es wird nämlich ein request gesendet und die Methode ruft mit dem Parameter eine methode auf, die eine Tabelle aufbaut. Diese Tabelle wird in ein string gespeichert und soll in den response gespeichert werden, damit sie per callback funktion ein ein DOM-Knoten angehängt werden kann.
Problem ist, wenn ich schreibe:
response = baueTabelle(parameter);
Dann zeigt mir Eclispe dass er nicht einen String in ein HttpServletResponse umwandeln kann.
Was für einee Lösungsmöglichkeit gibt es hierfür?

Danke im voraus.


----------



## SlaterB (28. Mrz 2012)

response.getWriter().print(String)


----------



## ARadauer (28. Mrz 2012)

SlaterB hat gesagt.:


> nochmal: gerade in so hochkomplexen Umgebungen solltest du das vorhandene lernen und dich danach richten


Ist es wirklich so ein hochkomplexes Thema? mit jquery einen ajax request auf eine JSP oder Servlet absetzen die über den response.getWriter() einen String zurück schreibt, bzw direkt html dass man super mit jquery weiterverarbeiten kann...

das wird insgesammt ein 10 Zeiler... wobei ich jetzt die beiden JSP den Aufrufer und der Aufgerufende trennen würde....
seam usw.. schafft man sich da oft nicht künstlich komplexität die man oft nicht braucht?


----------



## Kenan89 (28. Mrz 2012)

Ja, das hatte ich gerade eben gelöst. Trotzdem danke.

Jetzt wird mir in der Callbackfunktion mit alert nur angezeigt: Object XMLDocument. Ich habe mich bereits im Google darüber schlau gemacht und habe erfahren, dass das normal ist, weil meine Tabelle wohl eine komplexe Struktur für alert hat.

In Firebug habe ich mir meinen getRequest genauer angeschaut und im Reiter XML steht leider:


> XML-Verarbeitungsfehler: Kein Element gefunden



Was hat das zu bedeuten?

Hier der Code:

Klasse tabelle

```
public void doGet(HttpServletRequest request, HttpServletResponse response){
String req = request.getParameter("par1");
String response = response.getWriter().print(buildTable(req));
}

public String buildTable(String language){
//hier wird in ein String eine Tabelle gespeichert, die nach Sprache 
//in der Datenbanktabelle selektiert wird, die Sprache soll per get an diese
//Funktion übergeben werden, damit diese Tabelle sich dann neu aufbaut.
//Sie gibt einen String zurück, welche in repsonse gespeichert wird.
}
```

Javascript dazu:

```
$.get("tabelle", {par1: "de"}, function(data){
alert(data);})
```


----------



## SlaterB (28. Mrz 2012)

@ARadauer
allein die Überlegung, dass der Ajax-Request an eine JSP geht, die hier dann auf komplizierte unnötige Weise mit Java-Code verfrachtet wird,
ist in meinen Augen der komplett falsche Weg, 
unter dem Eindruck dass die JSP ein Akteur X wäre der da am Server sitzt und wartet

dazu das vorherige, ein Objekt autos aus einer früheren JSP-Sitzung, welches wartet und noch mal rückgefragt werden kann usw.,
das endet im Chaos

wenn man so herangeht:
"ich habe in einer HTML-Seite einen Ajax-Request A, der führt auf dem Server zu einem Servlet 'A-Bearbeitung', 
dort wird (ohne jede Nebenwirkungen) ein Objekt B erzeugt und dessen String-Erzeugnis C zurückgesendet"
dann gibts natürlich wenig zu meckern, 
eine JSP wäre dabei auch nicht beteiligt, von Erzeugung der ursprünglichen HTML-Seite mal abgesehen

sofern es um Lebenszyklus, Wiederaufbau der vorherigen Objekte usw. geht, wirds kompliziert,
mag sein dass ich zuviel hineininterpretiert habe

------------

@Kenan89
> Was hat das zu bedeuten?

wie sieht denn die Rückgabe aus? richtest du dich einmal mehr nach Standards, 
etwas XML-Aufbau für Ajax-Responses, oder sendest du HTML?


----------



## Kenan89 (28. Mrz 2012)

Also es ist so.
In HTML(index.jsp) habe ich ein Div mit der Id "Tabellenplatz". 

Die Überlegung ist, in diesen div den response String per append mit JQuery einzubinden. 

Unter dem Div sind buttons, wo du die Sprache auswählen kannst.

Du klickst ein Button (z.B. "deutsch"), dann schickt Jquery mit $.get einen Request mit dem parameter "deutsch" an meine Klasse "tabelle". 

Die "tabelle"-Klasse empfängt den request in der "doGet Methode" und ruft die andere Methode_(in der gleichen Klasse)_ "public String buildTable". 

Diese selectiert aus der Datenbanktabelle alle Vokabeln mit der Sprache "deutsch" und erstellt eine HTML-Tabelle, in einem String gespeichert und gibt diesen String zurück.

Da doGet die Methode buildTable so aufgerufen hat: "repsonse.getWriter().print(buildTable(language)" und ich in meiner callback Funktion folgendes geschrieben habe: "function(data){alert(data);}" müsste mir doch im Alert Fenster der String angezeigt werden, der an die methode buildTable zurückgegeben wurde.

EDIT:
Im alert Fenster müsste ich dann sowas in der Art sehn:

```
<table>
<tr>
<td colspan="2">Deutsch:</td>
</tr>
<tr>
<td>Wort 1</td><td>Wort 1</td>
</tr>
<tr>
<td>Wort 1</td><td>Wort 1</td>
</tr>
<tr>
<td>Wort 1</td><td>Wort 1</td>
</tr>
<tr>
<td>Wort 1</td><td>Wort 1</td>
</tr><tr>
<td>Wort 1</td><td>Wort 1</td>
</tr>

</table>
```


----------



## Kenan89 (28. Mrz 2012)

Jetzt habe ich gerade eben in Eclipse gesehen, dass eine NullPointerException aufgetreten ist. Ich versuche die Ursache herauszufinden.

Mist, anscheinend werden alle bereits berechneten Variablen bei dem get-request wieder auf 0 gesetzt. Meine buildTabelle-Methode kann keinen String zurückgeben, weil sie nicht in die for-Schleife kommt. Die For-Schleife geht so lange, wie es Zeilen gibt. 
Ich glaube $.get ruft ein neues Object der Klasse tabelle auf.


----------

