Struts 2 Action stoppen

M

milchkaffee

Hallo, ich bin noch ziemlicher Neuling in Sachen Struts 2. Nun komm ich nicht weiter bei einer Action.

Auf einer Webseite werden mehrere Checkboxen sein, jedoch nicht in einem Formular mit Submit-Button, sondern per Javascript abgeschickt. Die Webseite selbst darf durch Anklicken der Checkboxen nicht verlassen werden. Deshalb die Javascript-Übergabe, die soweit schon funktioniert. Hier etwas Code, noch als Textlink:

HTML:
    <s:url action="Sammler" includeContext="true" id="klick">
      <s:param name="nr">2222</s:param>
    </s:url>
    <a href='<s:property value="#klick"/>'
       onClick="location.href='<s:property value="#klick"/>';return false;">Klack</a>

xml-Auszug:
HTML:
        <action name="Sammler" class="coll.Sammler">
            <result name="SUCCESS">/coll/liste.jsp</result>
        </action>

Aufruf der Sammler.action klappt. Dort wird in eine Liste in den SessionContext geschrieben, denn die Ergebnisse müssen seitenübergreifend erhalten bleiben, klappt auch. Problem: Die Action leitet anschließend auf eine jsp-Seite weiter. Das darf sie aber nicht. Sie soll die Werte sammeln, nichts weiter. Ich habs schon mit "INPUT" versucht, aber auch da wird weitergeleitet. Und ohne result-Angabe gehts schon gar nicht.

Wie kann man eine Action stoppen zwischen Ausführung und Weiterleitung?

Grüße
Karsten
 
Hallo,

html ist synchron, d.h. ein Klick, der ein Formular abschickt oder ähnliches hat einen synchronen http-Aufruf zur folge. Der Browser rechnet dann mit einer neuen html-Seite. Auch wenn man es hinbekommt, dass struts keine neue Seite ausliefert, wird der Browser damit ein Problem haben.
Typischerweise würde man sowas mit einer asynchronen Technik realisieren wie http://de.wikipedia.org/wiki/Ajax_(Programmierung)
Ich würde aber nicht ausschliessen, dass es einen Trick gibt, um ein ähnliches asynchrones Verhalten zu produzieren.
 
Danke, mit Ajax bzw. JSON hatte ich auch schon rumgespielt. Aber da müsste der JSON-String deserialisiert werden, das lohnt sich nun wirklich nicht.

Jetzt probiere ichs mal mit Result-Typen. Ich habe einen geschrieben, dort rein die Datenverarbeitung, die seither in der Action lag. Result-Typ wird gefunden, abgearbeitet, aber danach kommt schon wieder eine autom. Weiterleitung. Diesmal zu Collector.action.

HTML:
  <package name="sammel" namespace="/example">
    <result-types>
      <result-type name="custom" class="coll.StopResult" />
    </result-types>
    <action name="Collector" class="coll.StopResult">
      <result type="custom">artist</result>
    </action>
  </package>

Ist alles mehr oder weniger aus dem Buch "Struts 2 im Einsatz". Dort steht, dass ein package, das struts-default erbt, autom. eine Weiterleitung (dispatch) durchführt. So, aber mein package erbt explizit nicht von struts-default. Ich versteh das nicht.

Gruß
Karsten
 
Es gibt zwei Weiterleitungstechniken, forward und redirect.

Bei forward wird die angefragte URL auf eine andere URL serverseitig weitergeleitet, dabei sieht der Client nur die URL, die er angefragt hat.
Bei redirect wird der Clientbrowser benachrichtigt, eine andere URL aufzurufen, was dieser auch tut. Den zweiten Aufruf bemerkt der Client.

Mit einem von beiden rechnet der Clientbrowser für eine normale html-form. Sollte der Server einfach nichts machen, also kein redirect oder forward zu einer gültigen Seite, dann wird der Browserclient - je nach Hersteller - die aktuelle Seite für ungültig erklären.
Asynchrone Techniken führen keinen HTTP Request durch und haben so dieses Problem nicht. Dort wird der Request über eine Browserkomponente abgebildet, Ajax-engine z.B.
 

Neue Beiträge

Zurück