Dieser Artikel implementiert hauptsächlich die Anfrage von Struts. Andere Funktionen werden sich langsam erfinden.
Kürzlich habe ich den Inhalt von Javassist gelernt und einen Artikel gesehen.
Hier ist ein einfaches Struts2 -Framework, und gleichzeitig fügen Sie einige Ihrer eigenen Verständnisse hinzu.
Dieser Artikel implementiert hauptsächlich die Anfrage von Struts. Andere Funktionen werden sich langsam erfinden.
Zunächst werden im Struts2 -Framework die Implementierung und der Sprung von Anforderungen hauptsächlich von Struts.xml konfiguriert. A <Aktion> Label gibt eine Definition einer Anforderung an, die den Namen "Name" der Anforderung enthält. Das <Ergebnis "Label definiert den Typ" Name "des Ergebniss, einschließlich" Erfolg "," None "," Login "," Eingabe "," Fehler "; ② Der Typ" Typ ", einschließlich" Dispatcher (Standard) "" "," Kette "," Umleitung "," Umleitung "," Stream "; Nach der Konfiguration der Struts.xml kann das Formular in der Schnittstelle das entsprechende Aktions -Tag über den von der Aktionseigenschaft definierten Namensattributwert ermitteln, um die entsprechenden Klassen- und Ausführungsmethoden zu finden. Stimmen Sie dann mit der von der Ausführungsmethode zurückgegebenen String -Zeichenfolge überein, um mit dem Namen im Ergebnis -Tag übereinzustimmen, und führen Sie die nächste Anforderungsoperation gemäß dem definierten Typ -Typ aus.
Nach dem Verständnis, wie Struts2 die Schnittstelle verbindet, die dieselbe Programmfunktion anfordert, können wir diesen Teil der Funktion über unseren eigenen Code implementieren.
Wie fangen wir an?
Wir werden in zwei Teile mit einfachen Funktionen ①Action -Teil ②Result -Teil unterteilt
der Aktionsteil
① Wir müssen die entsprechenden Klassen- und Ausführungsmethoden gemäß der Anfrage der Schnittstelle finden
Ergebnis Teil
① Wir müssen die Typ -Zeichenfolge von "Erfolg", "Keine", "Anmeldung", "Eingabe" und "Fehler" zurückgeben
② Für verschiedene Arten der Rückgabe müssen verschiedene Arten von Anforderungsadresse angegeben werden
③ Die Typen, die definiert werden müssen, einschließlich "Dispatcher (Standard)", "Kette", "Umleitung", "Umleitung", "Stream"
In diesem Artikel erkennen die Rückgabetypen nur die beiden Arten von "Erfolg" und "Anmeldung" und berücksichtigen vorerst die Art der Anforderung nicht. Die perfekte Funktion wird später aufgefüllt.
Lassen Sie uns dann sehen, wie die obige Funktion durch den Code erreicht werden kann.
Erstens fordern die beiden benutzerdefinierten Annotationen der AktionAnnotation und des Ergebnisnotations die entsprechende Methode und Methode der Zeichenfolge an, die durch die beiden benutzerdefinierten Annotationen von Aktionen zurückgegeben wurden
/ ** * Aktion Hinweis: ActionName entspricht der URL -Pattern * @author linling * */ @retention (retentionPolicy.Runtime) @targetType.method blic @Interface Actionsnotation {String ActionName () Standard "; () Standard {};} /*** kehren Sie zum Annotationsobjekt zurück: Der Name entspricht dem Namen des Ergebnisses in der Struts -Konfiguration, einschließlich "Erfolg", "None", "Fehler", "Eingabe". Anmeldung; () Standard "index.jsp";}
Dann definieren wir eine ActionContext -Klasse, um den für eine Anfrage erforderlichen Inhalt zu speichern
/*** Implementieren Sie die Simulationsstruts, die zu dem Inhalt springen, der zur Ausführung der entsprechenden Methode gemäß der Konfigurationsdatei*@Author Linling **/public Class ActionContext {/*** äquivalent zu URL -Pattern in der web.xml, der, die Aussage von URL -Pattern, der Ausführung Nur* /private String -URL; Zum Beispiel: Schlüssel: 'Erfolg'; Private Objektaktion; * / Private String [] ActionParamsname;
Analysepackage ist eine Methode, die zum Zusammenstellen von ActionContext erforderlich ist
/** * durchquerte die Klassendatei unter dem Paket scan_package, mit dem die Aktionsmethode analysiert wird, sie in ein ActionContext -Objekt zusammengestellt und in die urlmap * @param real_path scan_package * @tro WS -KlassennotfoundException * @throw InstantiationException * einfügt. @throws IllegalaccessException * @Throws NotFoundexception */ Public Static Void AnalysePackage (String Real_Path, String Scan_package Foundexception, InstantificationException, iLlegalaccessException, NotFoundexception {file file = new file (reaL_Path); if (file.isdirectory ()) {file [] f ( ] f iles = file.listfiles (); Classstype = class.Forname (Dateiname); .GetAnnotation (ActionAnnotation.CLASS); Methode Annitation ERRAGE! " + Methode +", ActionName: " + url +", result.length: " + results.lengts.lenger h);} actionContext.seturl (url); actionTextext.setMethod (method.getName ()) MAP <res) map = neuer Hashmap <res) () für (Ergebnisnotationsergebnis: Sults) {String value = result.value (); ist null ");} map.put (result.name (), value);} actionContext.setResults (MAP); ACT IONCONTEXT.SETCLASSTYM (classtype); actionContext. setAction (classtype.Newinstance (); actionContext.setParamstype (); Method.getParameterTypes ());
GetParams ist ein Anforderungsparameter -Array, das auf dem Anforderungsinhalt in der HTTPServletRequest -Anforderung basiert.
/** * Basierend auf dem Parastypen- und Parameternamen des Parametertyps ActinParamSname, um die Anforderung zu analysieren, um ein Parameterobjekt [] * @param request * @paramstype * @param actionParamsname * @Retourn * @auszulöscht, löscht die Instanziation des Illegals * @ @Throws illegal AccessException * @ @ @aus. löscht IllegalArgumentException * @ @ @ @ @ @ @ @ @ @ @ löscht InvantentArtargetException * @throws nosuchmedHodException * @throws SecurityException */ public static Object [] Questanfrage, Class <> [] paramstype, String [] actionparamsname) aus Invocat Iontargexception, NoSuchMethodException, SecurityException {Object] Objects = New Object [ParamEtype.Length]; Parampe -Stil [i]) {Objekte [i] = paramsutils.getParam (Anfrage, ParamEtype [i], ActionParamsname [i]);} else {class <? classstype.getDetDeclardfields (); ) {{String key = iterator.next (); Länge! String value = map.get (Schlüssel) [0]; } Rückgabeobjekte;}
Okay, als nächstes. Wir können die Aktionsmethode implementieren
Öffentliche Klasse LoginAction {@ActionNotation (actionName = "login.action", resulting = {@resultanitation (name = resultType.success, value = "i ndex.jsp"),@resultannotation (name = resultType.login, value = "login . (ActionName = "loginforuse.action", results = {@resannotation (name = resultType.success, value = "indexp") otary (name = resultType.login, value = "login.jsp")})}) öffentlich resultType loginforuser (Int Number, Loginpojo Loginpojo) {if ("Hello" .equals (loginpojo.getUsername ()) && "world" .equojo.getpa ssword ())) {Return Resulttype.success;} Return ResultType.login ;}}
Als nächstes müssen wir das Programm beim Starten im Arbeitsverzeichnis ermöglichen, alle Methoden im Arbeitsverzeichnis zu durchqueren, und die ActionAnnotation -Methode zu verwenden, um es in Aktion zu ermitteln und zusammenzubauen. Dies ist die Methode, die wir ausführen müssen. Auf diese Weise finden wir beim Eintreffen der Anfrage den entsprechenden ActionContext gemäß der Anforderungsadresse und rufen die Methode durch den Reflexionsmechanismus auf.
Wir setzen zwei Servlets. Eine wird verwendet, um Initialisierungsprogramme durchzuführen. Eine zum Filtern aller Aktionsanfragen
<servlet> <servlet> strutsinitServlet </servlet-name> <servlet-classe> com.bayern.struts.servletsinitServlet </servlet-classe> <par am-Name> scan_package </param-name> <param-value> com .Bayern.struts.one </param-value> </init-param> <load-on-startup> 10 </load-startup> <servlet-name> sassiatcherServlet </servlet-name> <Servlet-Klasse> com.bayern.struts.one.servlet.dispatcherServlet </Servlet-Mapping </Servlet-Mapping> <Servlet-Name> DispatcherServlet </servlet-name> <URL-Patterns>*. Servlet-Mapping>
Dispatcherservlet implementiert die Filterung der verwendeten Aktionsanforderung und ermöglicht es ihm, die entsprechende Aktionsmethode auszuführen und den nächsten Sprung durchzuführen
Ublic void dopost (httpServletRequest -Anforderung, HTTPServletResponse -Antwort). (ActionContext.getParamstype (), ActionContext.getActionParamsname ()); .GetAction (), Params);
Nun, jetzt haben wir die einfachste Strut2 -Framework -Anfrage -Weiterleitungsfunktion implementiert. Die Funktion ist sehr rau und viele Fälle haben sie noch nicht in Betracht gezogen.
Das obige ist der gesamte Inhalt dieses Artikels.