Ich habe meine Anwendung in Struts1 und habe Dispatch Action in allen meinen Aktionen verwendet. Bitte sag mir jetzt, wie ich zu Struts 2 wechseln kann und welche Änderungen an allen meinen Aktionen und Formulardaten vorgenommen werden müssen.
Antworten
Zu viele Anzeigen?Ich werde Ihnen diese Dokumentenserie vorschlagen:
- http://www.infoq.com/articles/converting-struts-2-part1
- http://www.infoq.com/articles/migrating-struts-2-part2
Der erste Link erklärt das Thema und es gibt ein Beispiel im zweiten Link. Ich habe hier unten eine Erklärung daraus geschrieben:
Das Framework konfigurieren
Die erste und wichtigste Konfiguration ist diejenige, die das Webanwendungsframework in der web.xml-Datei des Servlet-Containers ermöglicht.
Die Konfiguration, die jedem für Struts bekannt sein sollte, lautet:
action
org.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
2
action
*.do
Bei Struts2 gibt es nur sehr wenige Änderungen. Die signifikanteste ist, dass der Dispatcher von einem Servlet zu einem Servlet-Filter geändert wurde. Die Konfiguration ist genauso einfach wie für ein Servlet und wird hier gezeigt:
webwork
org.apache.struts.action2.dispatcher.FilterDispatcher
webwork
/*
Die Aktionen dekonstruieren
Im Request-Durchlauf haben wir über einige Unterschiede zwischen Struts und Struts2 auf hoher Ebene gesprochen. Lassen Sie uns nun einen Schritt tiefer gehen und die Unterschiede zwischen den Strukturen der Aktionen in jedem Framework betrachten.
Zunächst wollen wir die allgemeine Struktur der Struts-Aktion überprüfen. Die allgemeine Form der Struts-Aktion sieht folgendermaßen aus:
public class MyAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // die Arbeit erledigen return (mapping.findForward("success")); } }
Bei der Implementierung einer Struts-Aktion sollten Sie folgende Punkte beachten:
- Alle Aktionen müssen die Action-Basisklasse erweitern.
- Alle Aktionen müssen threadsicher sein, da nur eine einzelne Aktion-Instanz erstellt wird.
- Weil die Aktionen threadsicher sein müssen, werden alle Objekte, die für die Verarbeitung der Aktion benötigt werden können, in der Methodensignatur übergeben.
- Der Name der Methode, die für die Verarbeitung der Aktion aufgerufen wird, ist "execute" (es gibt eine DispatchAction-Klasse in Struts, die die Methode zur Ausführung einer anderen Methode in derselben Aktion umleiten kann, aber der ursprüngliche Einstiegspunkt vom Framework in die Aktion ist immer noch die "execute"-Methode).
- Ein ActionForward-Ergebnis wird über eine Methode der ActionMapping-Klasse zurückgegeben, meistens über den Aufruf der Methode "findForward".
Im Gegensatz dazu bietet die Struts2-Aktion eine viel einfachere Implementierung. So sieht es aus:
public class MyAction {
public String execute() throws Exception {
// die Arbeit erledigen
return "success";
}
}
Das Erste, was Ihnen möglicherweise aufgefallen ist, ist, dass die Aktion keine Klassen oder Schnittstellen erweitert. Tatsächlich geht es noch weiter. Nach Konvention wird die Methode, die bei der Verarbeitung einer Aktion aufgerufen wird, die "execute"-Methode ist - aber es muss nicht so sein. Jede Methode, die der Methode-Signatur public String methodName() folgt, kann über die Konfiguration aufgerufen werden.
Zuletzt und vielleicht der revolutionärste Unterschied zur ursprünglichen Struts-Implementierung ist, dass die Methode, die bei der Verarbeitung einer Aktion aufgerufen wird (die "execute"-Methode), keine Parameter hat. Wie also erhalten Sie Zugriff auf die Objekte, mit denen Sie arbeiten müssen? Die Antwort liegt im "Inversion of Control"- oder "Dependency Injection"-Muster (für mehr Informationen hat Martin Fowler einen informativen Artikel unter http://www.martinfowler.com/articles/injection.html). Das Spring Framework hat dieses Muster populär gemacht, jedoch begann der Vorgänger von Struts2 (WebWork) zur gleichen Zeit, dieses Muster zu verwenden.
Du kannst dynamische Methodenaufrufe verwenden, um die alte DispatchAction
-Art des "Methodennamens übergeben" - Funktionalität vage nachzubilden (oder du könntest einen Interceptor schreiben, der einen Parameter verwendet, um so etwas Ähnliches zu tun).
Es gibt in Struts 2 an sich keine "Form-Beans", obwohl du ModelDriven
implementieren kannst (einige Dokumente) und es irgendwie wie eine Form-Bean funktioniert.
Alle JSPs müssen neu geschrieben werden, aber nur wenn du die Struts 1-Tags verwendest. Wenn du nur JSTL-Tags verwendet hast, könnte es sein, dass du es nicht musst, es würde darauf ankommen.
Der von Ischin bereitgestellte Link ist ein guter Ausgangspunkt, um weitere Details zu erhalten.