Announcement

Collapse
No announcement yet.

Struts+jquery-Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Struts+jquery-Problem

    Hallo Leute,

    ich habe ein Problem. Ich möchte gern ersteinmal ein schlichtes Beispiel realisieren. Ein div-Tag in dem ein Textfeld steht (<s:textfield....) und drunter ein Button. Durch drücken dieses Buttons soll eine action aufgerufen werden und in das Textfeld ein Wert (String) geschrieben werden.
    Das habe ich versucht in folgender jsp zu lösen:
    HTML Code:
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <%@ taglib prefix="sj" uri="/struts-jquery-tags"%> 
    <html>   
    <head>     
    <sj:head/>   
    </head>   
    <body>    
    	<sj:div id="div1">Div 1:<s:textfield name="testname"/></sj:div>     
    	<s:url id="ajaxTest" value="/test.action"/>
    	<sj:a id="ajaxlink" href="%{ajax}" targets="result1,result2" button="true" buttonIcon="ui-icon-gear">
    	 Update
    	</sj:a>      
    </body> 
    </html>
    Es funktioniert auch soweit. Die action wird aufgerufen, ein String wird in das Textfeld geschrieben. Das Problem ist aber, dass der Button dann verdoppelt wird.
    D.h. mir werden aus unerfindlichen Gründen jetzt zwei Update-Buttons untereinander angezeigt.

    Das ganze hatte ich auch probiert in meinem Projekt auszutesten. Dort sind mehrere divs, deren Werte aktualisiert werden sollen. Nach drücken des Buttons wurde dann die komplette Seite verdoppelt. D.h. die alte Seite bleibt stehen und wenn ich runterscrolle steht die aktualisierte Seite.
    Habt ihr da eine Idee? Wäre echt ideal. Ich komme nämlich kein Schritt weiter, da man im Netz auch wenig zu dem Problem findet.

    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
    Zuletzt editiert von 7bkahnt; 15.10.2010, 12:16.

  • #2
    M.E. mischt du hier zwei Dinge. Einen Request und einen AjaxRequest.
    Christian

    Comment


    • #3
      Ja das habe ich mir auch schon gedacht. Weil <sj:a.../> soll ja ein AjaxRequest realisieren.
      Aber ich verstehe iwie nicht wie ich mit jquery eine jsp aufrufen soll, diese dann die action aufruft und dann das entsprechende response zurückschickt. Hast du evtl ein Beispiel?
      Also das obige Bsp. muss in einer jsp stehen oder? Und dann bräuchte ich ja iwie noch eine zweite jsp in der das response dann rein kommt.

      Comment


      • #4
        Ajax

        Damit wird keine neue Seite vom Server geholt. Nein, habe kein Beispiel. Das könnte sowas sein

        http://www.benmccann.com/dev-blog/st...leter-example/


        http://www.google.de/search?q=struts...&start=20&sa=N
        Christian

        Comment


        • #5
          Wie Ajax an sich funktioniert weiß ich ja.
          Ich habe es ja bereits mittels Ajax realisiert, nur ist der Aufwand zu groß. Immer wenn ich ein Button drücke wird ersteinmal zig Zeilen JS-Code ausgeführt(AjaxRequest an andere jsp). Die andere jsp ruft die action auf, und schreibt die Antworten aus. Diese Antworten empfängt dann wiederum die aufrufende jsp und speichert sie in ein Array. Und dann muss ich jedem Wert, der in dem Array steht jedem einzelnen div zuordnen. Das ist einfach zu viel.
          Und mit jquery müsste es so funktionieren, dass ich damit eine Struts Action aufrufen kann und damit alle setter und getter-Methoden aufgerufen werden.
          Damit kann ich mir die Array-Zuordnung sparen, da in jedem div-Tag beispielsweise steht <s:textfield name="test".../> und durch die getter-Methoden der entsprechende Wert rausgezogen wird.
          Mein Problem ist nur, dass ich kaum ein komplettes vollständiges Beispiel zu Struts2 mit jquery finde. Hätte ja sein können, das hier einer im Forum soetwas schoneinmal realisiert hat.

          Grüsse

          Comment


          • #6
            Mein Problem ist nur, dass ich kaum ein komplettes vollständiges Beispiel zu Struts2 mit jquery finde.
            Siehe Links
            Christian

            Comment


            • #7
              Warum hast du als target in deinem Link result1,result2 eingetragen? Diese Element gibt es doch gar nicht in deiner JSP?

              Du meinst bestimt div1 oder?

              <sj:div id="div1">Div 1:<s:textfield name="testname"/></sj:div>
              <s:url id="ajaxTest" value="/test.action"/>
              <sj:a id="ajaxlink" href="%{ajax}" targets="div1" button="true" buttonIcon="ui-icon-gear">
              Update
              </sj:a>
              Im Wiki des Struts2 jQuery Plugins gibt es doch einige Anleitungen.

              http://code.google.com/p/struts2-jquery/wiki/AnchorTag
              Java und Struts2 Blog

              Comment


              • #8
                Oh, ja klar meine ich div1. Hatte nur mehrere Beispiele mal durchgespielt. Hatte ich wohl beim kopieren vergessen rauszunehmen :-)
                Danke ersteinmal für die Antworten!
                Genau die Beispiele die du aufgelistet hast hatte ich auch gefunden. Und genau da tritt das Problem auf mit dem doppelten Button. z.B. bei diesem:
                HTML Code:
                <%@ taglib prefix="s" uri="/struts-tags"%>
                <%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
                <html>
                  <head>
                    <sj:head/>
                  </head>
                  <body>
                    <div id="div1">
                		<s:textfield name="testname"/>
                	</div>
                    <s:url id="ajaxTest" value="/test.action"/>
                
                    <sj:a id="link1" href="%{ajaxTest}" targets="div1">
                      Update Content
                    </sj:a>
                  </body>
                </html>
                Am Anfang wird mir also ein leeres Textfeld und darunter der "Update Content"-Button angezeigt.
                Jetzt soll ja eigentlich nur das Textfeld gefüllt werden.
                Es wird die action test aufgerufen. In der Action wird auf den String testname ein Wert geschrieben. Der wird mir auch wunderbar angezeigt. Aber darunter eben nicht mehr nur ein "Update Content"-Button, sondern aus unerklärlichen Gründen 2 untereinander. Das muss irgendwie mit den targets zusammenhängen, denn bei zwei targets werden es 3 Buttons und sogar 4 Textfelder obwohl es eigentlich nur 2 sein dürften laut dem Code:
                HTML Code:
                <%@ taglib prefix="s" uri="/struts-tags"%>
                <%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
                <html>
                  <head>
                    <sj:head/>
                  </head>
                  <body>
                    <div id="div1">
                		<s:textfield name="testname"/>
                	</div>
                	<div id="div2">
                		<s:textfield name="testname"/>
                	</div>
                    <s:url id="ajaxTest" value="/test.action"/>
                
                    <sj:a id="link1" href="%{ajaxTest}" targets="div1,div2">
                      Update Content
                    </sj:a>
                  </body>
                </html>
                Bei einem normalen Ajax-Request-Response-Ablauf habe ich ja zwei jsp´s benötigt. In der einen wurde mittels JS ein AjaxRequest auf eine zweite jsp gemacht und der Ajax Response kam dann zurück.
                Brauch ich jetzt evtl. wieder zwei jsp´s? Ich weiß irgendwie nicht so richtig was das sj:a-tag macht. Sowohl den Reuquest als auch den Response? Im wiki steht nur ein Request. Nur wo und vor allem wie handle ich dann den Response? Ich mein an sich kommt der repsonse ja zurück, indem das Textfeld gefüllt wird. Aber der Rest stimmt dann nicht...
                Sorry für die vielen Fragen. Nur das ist komplett Neuland für mich. Umso zerreißender ist es wenn man es eigentlich fast hinbekommen hat, aber am letzten kleinen Problem sich Tage dran aufhängt...

                Grüsse

                EDIT:
                Noch ein Beispiel:
                HTML Code:
                <%@ 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...
                Wäre echt über jede Hilfe dankbar!
                Zuletzt editiert von 7bkahnt; 18.10.2010, 09:26.

                Comment


                • #9
                  Das Ergebnis deines requests wird in das target eingefügt.

                  Wenn du also ein JSP hast die dir den Rahmen liefert:

                  Code:
                  <%@ taglib prefix="s" uri="/struts-tags"%>
                  <%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
                  <html>
                    <head>
                      <sj:head/>
                    </head>
                    <body>
                      <div id="div1">
                  	</div>
                      <s:url id="ajaxTest" value="/test.action"/>
                  
                      <sj:a id="link1" href="%{ajaxTest}" targets="div1">
                        Update Content
                      </sj:a>
                    </body>
                  </html>
                  und eine andere die dir nur ein html fragment liefert :

                  Code:
                  <s:textfield name="testname"/>
                  wird dieses Fragment in das Element div1 eingefügt.
                  Java und Struts2 Blog

                  Comment


                  • #10
                    Okay super danke.
                    Habe jetz in der zweiten jsp einfach das komplette div der ersten jsp reinkopiert. Mit allen Textfeldern.
                    Jetzt funktioniert es aus.

                    Grüsse

                    Comment

                    Working...
                    X