themaster Geschrieben 2. Juli 2003 Geschrieben 2. Juli 2003 Hallo, ich entwickele gerade eine JSP-Anwendung mit Struts, dabei habe ich ein paar Fragen/Probleme: 1) Darf ich eigentlich in die Action-spezifischen Forwards verweise auf Actions angeben (z.B. /bla.do) oder darf dort nur auf jsp-Seiten verweisen werden. Easystruts (ein Strutsplugin für Eclipse) meckert immer wenn in dem Forward keine jsp-Datei steht. Warum soll man dies so machen? 2)Etwas gemeiner. Teil der Anwendung ist eine Benutzerverwaltung. Mit zwei JSPs mit (fast) gleichen Actionformularen newuser.jsp und edituser.jsp. Bei newuser klappt alles wunderbar. Aber was ist der (beste) Weg die Daten des Benutzers der editiert werden soll in das Formular von edituser.jsp zu bekommen? Wenn ich edituser.jsp aufrufe ist das formular leer wie bei newuser.jsp. Was ist die Pest Practice dafür? Danke, themaster Zitieren
Snowghost Geschrieben 2. Juli 2003 Geschrieben 2. Juli 2003 zu 1) Natürlich kannst du in deine Action-Forwards auch auf Actions verweisen - einfach den entsprechenden Pfad (z.B. path="/myPath/myAction.do). Du solltest aber das Servlet-Mapping möglichst nicht /*.do nennen sondern /do/*. Bei *.do könntest du evtl. beim File-Download Probleme kriegen... zu 2) Du hast ja sicherlich eine Auflistung aller User und (wahrscheinlich) dahinter einen Link "edit". Diesem Link verpasst du als Parameter die eindeutige User-ID und leitest an eine Action "LoadUserAction" weiter. Diese lädt genau diesen einen User über seine ID und leitet an die entsprechende EditUser.jsp weiter - die User-Bean (bzw. Form) natürlich gesetzt.... Gruß Snowghost Zitieren
jan76 Geschrieben 2. Juli 2003 Geschrieben 2. Juli 2003 1) Darf ich eigentlich in die Action-spezifischen Forwards verweise auf Actions angeben (z.B. /bla.do) oder darf dort nur auf jsp-Seiten verweisen werden. Easystruts (ein Strutsplugin für Eclipse) meckert immer wenn in dem Forward keine jsp-Datei steht. Warum soll man dies so machen? Damit betreibst Du "Action-Chaining", d.h. eine Action A ruft Action B auf, die dann evtl. noch Action C um dann schlussendlich wieder auf einer JSP-Seite zu landen. Das ist ein Mechanismus der von Struts zwar nicht unmöglich gemacht wird, aber nicht in die Architektur passt und daher fast immer zwangsläufig zu Problemen führen wird (z.B. gehen die Request-Parameter beim "Weiterleiten" verloren). Falls Action B auch Teile der Logik von Action A als Voraussetzung braucht, ist das eine gute Gelegenheit diese Methoden in eine Service-Klasse auszulagern (sollte man sowieso machen, die Actions sind bestenfalls als "rein-->Entscheidung-->raus" - Methoden zu verstehen), um sie dann von den Actions aus aufzurufen ("Code duplication is the root of all evil.." oder wie war das). 2)Etwas gemeiner. Teil der Anwendung ist eine Benutzerverwaltung. Mit zwei JSPs mit (fast) gleichen Actionformularen newuser.jsp und edituser.jsp. Bei newuser klappt alles wunderbar. Aber was ist der (beste) Weg die Daten des Benutzers der editiert werden soll in das Formular von edituser.jsp zu bekommen? Wenn ich edituser.jsp aufrufe ist das formular leer wie bei newuser.jsp. Was ist die Pest Practice dafür? Baue eine "PrepareEditUserAction" und z.B. verlinken und als Request-Parameter die User-ID übergeben, in dieser wird das in der struts-config.xml definierte ActionForm mit den vorhandenen Daten gefüllt und beim Weiterleiten zur JSP stehen alle benötigten Daten schon im Formular drin, können bearbeitet und in einer "UpdateEditUserAction" wieder vom Formular zurück in die Datenbank geschrieben werden (falls Du Struts 1.1 benutzt kannst Du aus den 2 Action-Klassen hier schön eine XXXDispatchAction basteln). Grüsse, Jan Zitieren
themaster Geschrieben 2. Juli 2003 Autor Geschrieben 2. Juli 2003 Original geschrieben von jan76 Damit betreibst Du "Action-Chaining", d.h. eine Action A ruft Action B auf, die dann evtl. noch Action C um dann schlussendlich wieder auf einer JSP-Seite zu landen. Das ist ein Mechanismus der von Struts zwar nicht unmöglich gemacht wird, aber nicht in die Architektur passt und daher fast immer zwangsläufig zu Problemen führen wird (z.B. gehen die Request-Parameter beim "Weiterleiten" verloren). Falls Action B auch Teile der Logik von Action A als Voraussetzung braucht, ist das eine gute Gelegenheit diese Methoden in eine Service-Klasse auszulagern (sollte man sowieso machen, die Actions sind bestenfalls als "rein-->Entscheidung-->raus" - Methoden zu verstehen), um sie dann von den Actions aus aufzurufen ("Code duplication is the root of all evil.." oder wie war das). Es ist nicht so, dass die zweite Action Logik von der ersten benötigt. Das dies faul ist, leuchtet ein. Meine jsp-Seite benötigt Daten aus einer Action damit sie richtig angezeigt werden kann. (Damit ist die Action weniger eine Action mehr ein Datenlieferant) Wahrscheinlich auch nicht im Sinne der Architektur, aber es läuft (auch eine schlechte Entschuldigung für blödes Design...):confused: Baue eine "PrepareEditUserAction" und z.B. verlinken und als Request-Parameter die User-ID übergeben, in dieser wird das in der struts-config.xml definierte ActionForm mit den vorhandenen Daten gefüllt und beim Weiterleiten zur JSP stehen alle benötigten Daten schon im Formular drin, können bearbeitet und in einer "UpdateEditUserAction" wieder vom Formular zurück in die Datenbank geschrieben werden (falls Du Struts 1.1 benutzt kannst Du aus den 2 Action-Klassen hier schön eine XXXDispatchAction basteln). Damit hatte ich heute größere Probleme. Ich habe diese Prepare-Action gemacht auch mit der Userid als Parameter und ein UserForm erzeugt und mit Daten gefüllt und in den Request gestellt. Danach habe ich auf die jsp-Seite weitergeleitet, aber das Userform war in dem Moment leer. Ich weiß nicht wirklich wieso. Werden beim Forward aus der Action heraus, alle Daten im Request-Context gelöscht? (Struts 1.1 benutze ich nicht, diese Möglichkeit steht mir also nicht zur Verfügung) Grüße themaster Zitieren
Jaraz Geschrieben 2. Juli 2003 Geschrieben 2. Juli 2003 Original geschrieben von themaster (Struts 1.1 benutze ich nicht, diese Möglichkeit steht mir also nicht zur Verfügung) Wieso nicht? Erleichtert vieles. Ich hoffe du kannst Englisch. Quelle: Struts in Action ------------------------------------- 8.4 Chaining Actions As an application grows, its Actions tend to evolve into an internal API. Developers find themselves wanting to join Action classes in a chain, creating a workflow or macro process. Generally, this is a sign that the business logic is too strongly coupled with the Action or that the Action hierarchy is too shallow. If there is functionality that should be shared between Actions, it should be factored into separate business classes or provided as helper methods in an Action super class. However, there are techniques you can use to chain Actions together if need be. The ActionForward returned by an Action’s perform method can be any URI, including another Action. Developers often use this technique to create workflows where each Action plays its own part in processing the request. If you forward from one Action to another in this way, the ActionServlet treats the forwarded request just as if it had come directly from the client. The Action- Form bean is reset, repopulated, and revalidated, and, if all goes well, passed to the second Action. This often upsets developers, since they usually want to set a property on the form bean and pass that value along to the next Action in the chain. ------------------------ Gruß Jaraz Zitieren
themaster Geschrieben 3. Juli 2003 Autor Geschrieben 3. Juli 2003 Original geschrieben von Jaraz Wieso nicht? Erleichtert vieles. Das glaube ich gern aber als das Projekt began war es noch eine Beta. (Das dachte ich zumindest.) Seit wenn ist 1.1 überhaupt stable? Quelle: Struts in Action ------------------------------------- 8.4 Chaining Actions [cut] ------------------------ 1) Gibt es das ganze BUch irgendwo online? 2) Es ist ja weniger ein Action Chaining (im eigentlichen Sinn), es ist mehr so wie bei meiner zweiten Frage. Eine Action soll auf eine PrepareAction verweisen, damit eine jsp mit gültigen Werten angezeigt werden kann. Grüße themaster Zitieren
Jaraz Geschrieben 3. Juli 2003 Geschrieben 3. Juli 2003 Original geschrieben von themaster Das glaube ich gern aber als das Projekt began war es noch eine Beta. (Das dachte ich zumindest.) Seit wenn ist 1.1 überhaupt stable? Jepp, aber ich schlage mich lieber mit ner Beta rum, als mit nem unvollständigen, teilweise unkomfortablen alten Release. Original geschrieben von themaster 1.1 ist im Moment im letzten RC Stadium. 1) Gibt es das ganze BUch irgendwo online? Ich habe es hier gekauft: http://www.manning.com/ebooks.html Gruß Jaraz Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.