# struts2-jquery-Plugin Einbindung



## 7bkahnt (8. Okt 2010)

Hallo Leute,

ich benutze bisher Struts2 und möchte jetzt gern mittels AJAX eine Struts-Action auslösen.
Dazu wurde mir das jquery-Plugin empfohlen.
Ich weiß gerade absolut nicht was ich falsch mache beim einbinden der struts2-jquery-2.4.1.jar.
Die jar Datei liegt im Verzeichnis WEB-INF/lib
Wenn ich jetzt jquery benutzen möchte mittels:

```
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
...
```

gibt er mir einen Fehler aus: "Cannot find the tag libary for /struts-jquery-tags"
und beim eintippen von <sj: schlägt er mir auch nichts vor.. bzw. meldet auch "Unknown tag sj"

Habt ihr da eine Idee was ich da falsch machen kann? Wär echt ideal weil mit jquery kenn ich mich bisher leider gar nicht aus...
Muss ich evtl. noch eine zusätzl taglibary (.tld) einbinden? Dachte eigentlich, dass ich nur die jar benötige..

grüsse


----------



## gman (8. Okt 2010)

Hi,

deine Einbindung in die JSP-Seiten sieht soweit richtig aus. Passt denn das Plugin zur Struts-Version?
Wenn man das "Komplettpaket" von Struts runterlädt müsste es auch dabei sein.
Ansonsten würde ich mal in deiner IDE gucken ob die Lib in den Projekteigenschaften auftaucht.


----------



## 7bkahnt (11. Okt 2010)

Danke ersteinmal für die Antwort!
Also ich weißt ehrlich gesagt nicht welche Version von Struts ich verwende. Außer 2 .
In der web.xml steht auch nix von der Version.
In meinem Lib-Verzeichnis benutze ich xwork2.1.2.jar. Da die aktuellste Version von Struts 2.2.1 ist, könnte das die Version sein.
Die "struts2-jquery-plugin.jar" liegt in der WEB-INF/lib und ist jetzt auch in der IDE mit in den Libaries vorhanden.
Jetzt zeigt er mir auch keinen Fehler mehr an! Das heißt wahrscheinlich, dass er die tag libaries jetzt finden kann.
Aber verwenden kann ich sie trotzdem nicht. Denn wenn ich drunter schreibe:


```
<head>
     <sj:head locale="de" jqueryui="true" defaultIndicator="myDefaultIndicator" />
</head>
```
Schreibt er mir "Unknown tag 'sj:head'  "
Beim Komplettpaket von Struts 2.2.1. ist übrigens die jquery.jar nicht dabei. Nur struts2-dojo-plugin-2.2.1.
Hat da jemand einen Rat? Ich komm da einfach nicht weiter... weil ich nicht weiß was ich noch ändern kann^^

grüsse


----------



## gman (11. Okt 2010)

Die zentrale Jar-Datei für Struts ist : "struts-core-2.2.1.jar" (hinten steht die entsprechende Versionsnummer).
Und das jQuery-Plugin ist tatsächlich nicht dabei :-(
Runterladen kann man sich das hier. Das ist dann aber auch die Version passend zum aktuellen Struts.
Man kann sich aber auch aus den alten Downloads das passende raussuchen.
Und wenn alle Stricke reißen musste halt auf die neueste Version updaten. Da gab es sowieso eine ziemlich
üble Sicherheitslücke.


----------



## 7bkahnt (12. Okt 2010)

Okay, jetzt funktioniert es. Habe jetzt auf die neueste Struts-Version upgedated!
Danke!

Ich hab noch eine Frage bzgl. des results bei jquery. Kennt sich da jemand aus?
Ich habe folgenden einfachen Code:

AjaxTest.jsp:

```
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<html>   
<head>     
<sj:head locale="de" jqueryui="true" defaultIndicator="myDefaultIndicator"/>
</head>   
<body>   
	<div id="result">
		Name: <s:textfield name="testname"/>
	</div>
	
	<s:url id="ajax" value="test.action" />
	<sj:a id="ajaxlink" 
		href="%{ajax}" 
		targets="result" 
		
		indicator="indicator" 
		button="true" 
		buttonIcon="ui-icon-gear"
	>
	  	Run AJAX Action
	</sj:a>
</body> 
</html>
```

die struts.xml:

[XML]
 <action name="test" method="test" class="actions.HauptAction">
                    <result name="success">/AjaxTest.jsp</result>
 </action>
[/XML]

Und in der entsprechenden Actionklasse setze ich eben den String testname auf einen bestimmten Wert inkl der getter und setter-Methoden dazu.
Das funktioniert auch soweit. Also nach dem Klick auf den Button, wird in das Textfeld der Testname reingeschrieben. Aber der Button wird dupliziert. Weiß jemand warum?
Ich habe jetzt also ein Textfeld mit dem Testnamen drin und darunter zwei "Run AJAX Action"-Buttons.

Liegt es vielleicht an der struts.xml? Aber man muss ja ein result angeben!?!? Demnach muss ich auf die AjaxTest.jsp zurückverlinken. Vielleicht gibt es ja auch elegantere Lösungen...?

Mein eigentliches Ziel ist es später auf einer Seite mehrere Textfelder anzuzeigen in denen Daten aus einer Datenbank reingeschrieben werden. Dabei soll man sich von Seite zu Seite navigieren können.
Bisher aktualisiert sich die komplette Seite immer beim Klick auf den "Next"-Button. Deshalb bin ich auf AJAX und jquery überhaupt gekommen.

grüsse


----------



## gman (12. Okt 2010)

Mach mal um das Result-Div noch die <s:form>-Tags drum. Also so:


```
<s:form id="ajaxForm">
        <div id="result">
		Name: <s:textfield name="testname"/>
	</div>
    </s:form>
```

Kann auch sein das der Button auch mit rein muss, weiß ich nicht mehr auswendig. Probiers mal aus.


----------



## 7bkahnt (15. Okt 2010)

Also mit der form hat es nicht funktioniert. Aber wenn ich den Button mit in das div-tag reinpacke funktioniert es. Jedoch geht doch damit der eigentliche Sinn von jquery bzw AJAX verloren.
Es geht doch gerade darum das ich durch einen Klick auf einen Button in verschiedenen div-Tags Werte ändern möchte. Das wollte ich natürlich auch für mein Programm anwenden.
Ich habe mehrere div-tags und ganz unten meine Navigationsleiste in einem div-tag.
Dort hab ich jetz das jquery-Zeug drin. Nun wird aber wenn ich den Button klicke die Seite doppelt angezeigt.Oben die normale Seite wie sie vorher aussah und wenn ich runterscrolle die aktualisierte Seite mit den neuen Werten. Arrrghh^^ Es könnte so einfach sein...:noe:
Muss ich vielleicht sj:submit nehmen? Man findet irgendwie so wenig zu dem Thema im Netz....

Ich möchte ja eigentlich nur, dass mittels jquery eine struts-action aufgerufen wird und dann die Werte in den divs aktualisiert werden. Da die action dann aufgerufen wurde, werden ja alle getter-Methoden aufgerufen und die Felder in den entsprechenden divs werden aktualisiert.
Die action wird bisher auch aufgerufen. Nur heftet er das Ergebnis einfach unter der alten Seite an und macht keine "neue" Seite.

Vielleicht ist es auch ein Verständnisproblem. Ich habe alles in einer jsp. Braucht man für jquery mehrere? Eigentlich nicht oder?
Gibt es vielleicht mit meinem result-handling ein Problem?
Weil da ich eine Struts action auslöse muss ich ja in der config.xml ein entsprechende result realisieren. Dort verlinke ich einfach zurück auf die aufrufende Seite.
D.h. der Button wird in Test.jsp gedrückt und es wird wieder auf die Test.jsp verlinkt (weil Aktualisierung). Ich könnte mir vorstellen, das es evtl daran liegt das es immer verdoppelt. Aber ich muss ja ein result angeben in der config!
Grüsse


----------



## gman (15. Okt 2010)

Hi,

ich weiß es gerade nicht auswendig wie das geht. Aber guck dir mal den Showcase von dem Plugin an und wirf
einen Blick in dessen Wiki. Da kann man sich schon recht viel abgucken.


----------



## 7bkahnt (18. Okt 2010)

So also ich weiß jetzt warum mir alles doppelt angezeigt wird. Bsp:

```
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<html>
  <head>
    <sj:head jqueryui="true"/>
  </head>
  <body>
    <div id="div1">Div 1</div>
    <div id="div2">Div 2</div>
    <div id="div3">Div 3</div>
    <s:url id="ajaxTest" value="/test.action"/>

    <sj:a id="link1" href="%{ajaxTest}" targets="div1"  effect="highlight" effectOptions="{ color : '#222222' }" effectDuration="3000">
      Update Content
    </sj:a>
  </body>
</html>
```

Bevor ich auf den Button klicke steht da:
Div1
Div2
Div3
Update Content
Nachdem ich auf den Button klicke:
Div1
Div2
Div3
Update Content
Div 2
Div 3
Update Content

Es liegt daran, dass ich in der struts.xml auf dieselbe jsp wieder zurückverlinke.
Somit wird der komplette Inhalt nocheinmal angezeigt im div1.
Aber ich muss ja nach dem Aufruf einer action immer mit einem result auf eine jsp verlinken oder?Und der Inhalt soll ja nunmal in derselben jsp angezeigt werden...
Oder gibt es auch eine Möglichkeit, dass nach dem Aufruf einer Action einfach nur diese ausgeführt werden soll? Hatte schonmal nach verschiedenen result types geschaut, aber nix wirklich passendes gedunden...


----------



## gman (18. Okt 2010)

> Es liegt daran, dass ich in der struts.xml auf dieselbe jsp wieder zurückverlinke.



Als Result musst du eine JSP angeben in der das drinsteht was in das Result-Div rein soll! Da du
die Seite als Result angegeben hast, wird sie auch komplett in das Div eingefügt.


----------



## 7bkahnt (18. Okt 2010)

Ja und genau da liegt ja der Hund begraben^^ Es soll ja auf keine andere jsp verlinkt werden.
Sondern ich habe eine jsp mit mehreren Textfeldern. Und wenn ich in dieser jsp auf den Next-Button klicke, sollen die Daten vom nächsten Datensatz ausgelesen und in die Textfelder geschrieben werden.
Ist das nicht irgendwie möglich? Hat keiner mal ein Beispiel, indem 2 3 Textfeldern in unterschiedl. divs sind und drunter ein Button,durch den eine action aufgerufen wird und die Textfelder entsprechend aktualisiert werden?
Ich habe es mal mit dem result json probiert:


```
<package name="showcase" extends="struts-default,json-default" namespace="/">
     <action name="test" method="test" class="actions.HauptAction">
                   <result name="success" type="json" />
        </action>
    </package>
```
Da kommt zumindest kein doppelter Button mehr.
Aber es wird in das div einfach der komplette response reingeschrieben.
In der Test-Action werden zwei Strings belegt:

```
testname="Testname1";
testname2="Testname2";
```
Nach dem klicken auf den Button verschwindet das Textfeld was im div steht und wird durch den kompletten response-Text ersetzt. :
{"testname":"Testname1","testname2":"Testname2"}
Dabei werden die getter-Methoden verwendet. So wies auch eigentlich sein soll. Nur es soll eben in die Textfelder geschrieben werden.
Ein weiteres Problem stellen auch mehrere divs dar. Angenommen ich möchte 5 Textfelder in 5 unterschiedlichen divs verändern. Dann müsste ich diese ja eigentlich im tag targets vom <sj:a...
festlegen. Aber dann wird einfach 5 mal die Test-Action aufgerufen und 5 mal der gleiche response ausgeschrieben...

Ich komm einfach nicht weiter :noe:???:L
Ich hab bisher auch kein einziges Beispiel gefunden, was mein Vorhaben realisiert.
Aber eigentlich ist doch das jquery-Plugin für Struts2 genau dafür da^^ Unverständlich...

grüsse

EDIT:
Ich habe es auch mal ausprobiert mit dem result auf eine andere jsp.
z.B. verlinke ich dann auf folgende jsp

```
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
<html>
<body>
<s:textfield name="testname"/>
<s:textfield name="testname2"/>
</body>
</html>
```

Dann bleibt die Anwendung in der Start jsp, wo der Button usw. zu sehen sind und ersetzt aber die komplette div durch die zwei Textfelder mit den korrekten Daten.
Da gibt es nun wieder das Problem, das ja nicht die komplette div ersetzt werden soll, sondern nur die Textfelder (dessen Id´s nicht im target angegeben werden dürfen). Außerdem bleibt das Problem mehrere divs zu verändern. Denn wenn ich mehrere divs angebe, wird mehrere male die Test-Action aufgerufen (durch targets s.o.)


----------



## gman (19. Okt 2010)

> Dann bleibt die Anwendung in der Start jsp, wo der Button usw. zu sehen sind und ersetzt aber die komplette div durch die zwei Textfelder mit den korrekten Daten



Genau das meinte ich ja auch mit meinem vorhergehenden Post. Wenn du aber ein Formular aktualisieren willst, welches
sich in dem DIV befindet, so musst du schon mit dem JSON-Result arbeiten. Allerdings musst du dann auch auf der Seite
Code zum Empfangen und Verarbeiten des JSON-Objektes bereit stellen. 
Dafür musste mal weiter die Doku zum Plugin oder direkt von jQuery lesen, denn das hab ich so auch noch nicht gemacht.


----------

