• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Struts Actionaufruf durch JS

Status
Für weitere Antworten geschlossen.

7bkahnt

Neues Mitglied
Hallo Leute,
ist es möglich mittels JavaScript eine Action aufzurufen?
Ich benutze Struts vers.2 und möchte soetwas wie ein google-suchfeld programmieren.
Wenn ich in das Textfeld etwas eingebe, wartet er 2 sec und sucht dann nach dem Eingegebenen in einer DB.
Bisher klappt das auch fast, nur wird die Methode getArdNamen() direkt in der Action aufgerufen, ohne dass er vorher in setNamensuche() in der Action reingeht.
Da der Wert der in dem Textfeld steht somit nicht übergeben wird krieg ich ne NullpointerException.
Ist es möglich die Action aufzurufen und nicht direkt die Methode in der Action, sodass er vorher in die struts.xml geht und erst alle Variablen settet.
Hier mal der Code bisher:
HTML:
function test()
{
zaehler=zaehler+1;
if(zaehler<=1){
timer=setTimeout("window.location='/PVV/getAdrNamen.action'", 2000);
}
else{
clearTimeout(timer);
timer=setTimeout("window.location='/PVV/getAdrNamen.action'", 2000);
zaehler=zaehler-1;
}
}
<body>
.....
<s:textfield name="namensuche" onkeyup="return test()" cssStyle="width:250px; height:40px;"/>
....
</body>
Das Problem ist eben, dass er nur in der Action in die getAdrNamen() geht und nicht vorher in setNamensuche();
 
Ich denke deine Suche ist nicht die optimalste, da du ja die Seite jedes mal neu lädst.
Ich rate dir folgendes. Mache das über Ajax. Es gibt schöne frameworks die dir dabei helfen. zum beispiel prototype (Prototype JavaScript framework: Easy Ajax and DOM manipulation for dynamic web applications). Du kannst dann auch damit alle 2 Sekunden eine Seite aufrufen lassen, welche dir XML zurück liefert. (Oder einen direkten HTML output) Diesen kannst du dann in dein Suchfeld einfügen. Da ich zur zeit nicht weiss wie das in Struts ist, weiss ich nicht wie das mit der Ausgabe gehandelt wird. Kannst du bei einer Action direkt auf ein DAO zugreifen und dir die Daten in eine schöne Form "pressen" und danach ausgeben? Falls ja: Dein Ajax Request liefert als Antwort alles zurück, was im browser sichtbar wäre.
Nur eins steht fest. Deine version ist suboptimal für eine dynamische Suche.
Wenn du sagen würdest wie das abläuft in Struts könnte ich dir da vielleicht auch eine weniger umständliche Erklärung geben :D
 
Erstmal danke für die schnelle Antwort.
Kannst du bei einer Action direkt auf ein DAO zugreifen und dir die Daten in eine schöne Form "pressen" und danach ausgeben?
Ja das kann man problemlos.
Die Suche finde ich aber eigentlich so wie sie ist ideal. Gebe ich ein "a" ein sucht er nach zwei Sekunden in der DB nach allem was "a" beinhaltet.
Sollte ich aber innerhalb dieser zwei Sekunden noch ein "b" eingeben, dann bricht er den ersten Timer ab und sucht nach "ab".
Genauso wie es eigentlich sein soll. Das einzige ist eben, wenn ich genau nach 2s das "b" eingebe sucht er eben erst nach "a" und direkt danach nach "ab" aber das lässt sich nicht verhindern und ist auch nicht weiter wild.
Was ich machen müsste, ist die form zu submitten. Das geht auch irgendwie mit form.submit(). Nur leider habe ich das noch nicht so recht hinbekommen.
 
Du kannst auch mit einem Timeout einen ajax request losschicken. Musst dafür nicht immer die seite neu laden.
Ich würde auch immer überprüfen, ob etwas neues geschrieben wurde oder nicht. Wenn nicht brauchst du die DB ja nicht abuzfragen.
setzt du einfach ne js variable: suchbegriff und vergleichst den wert mit dem was in der textbox steht. Und wegen submit. in eine Form pressen und submit button hin. Fertig :D
Was dich vielleicht interessiert:
Scriptaculous hat eine funktion autocompleter
Ajax.Autocompleter - scriptaculous - GitHub
script.aculo.us - web 2.0 javascript
 
Okay habe es auch ohne Ajax hinbekommen.
Die Lösung war doch recht simpel^^ mit document.aufruf.submit():

HTML:
<script type="text/javascript">
var zaehler=0;
var timer=0;

function test()
{
zaehler=zaehler+1;
if(zaehler<=1){
timer=setTimeout("document.aufruf.submit();", 2000);
}
else{
clearTimeout(timer);
timer=setTimeout("document.aufruf.submit();", 2000);
zaehler=zaehler-1;
}
}
</script>

<body>

<s:form name="aufruf" action="testaufruf">
 <s:textfield name="testen" onkeyup="return test()"/>
</s:form>

</body>
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben