In Struts2 verwendet der Aktionsteil, dh die Controller -Schicht, eine niedrige Intrusion -Methode. Warum sagst du das? Dies liegt daran, dass in der Aktionsklasse in Struts2 keine Basisklasse erben oder eine Schnittstelle implementieren muss, und es ist auch nicht direkt mit der Servlet -API gekoppelt. Es ähnelt normalerweise eher wie ein normales Pojo (sollte normalerweise eine Ausführungsmethode ohne Parameter enthalten) und kann eine Reihe von Methoden (keine Parametermethoden) im Inhalt definieren und können als unabhängige Aktion durch Konfiguration verwendet werden, wodurch die Wiederverwendung von Code realisiert wird.
Zum Beispiel:
Paketbeispiel; public class userAction {private String -Benutzername; privates Zeichenfolgenkennwort; public String execute () löst Ausnahme aus {// ……… .. return "Erfolg"; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; }}Aktionszugriffsservlet
Die Eigenschaften in dieser Aktionsklasse können Parameter und Prozessergebnisse zusammenfassen. Das System unterscheidet sie nicht streng.
Um die von der Benutzer entwickelte Aktionsklasse standardisierter zu gestalten, bietet Struts2 jedoch eine Schnittstellenaktion, die wie folgt definiert ist:
publicInterface action {publicStaticFinal String error = "error"; publicStaticFinal String input = "Eingabe"; publicStaticFinal String none = "keine"; publicStaticFinal String login = "Login"; publicStaticFinal String Success = "Erfolg"; public String execute () löst Ausnahme aus;}Wenn wir jedoch Aktionen schreiben, implementieren wir die Schnittstelle normalerweise nicht, sondern erben die Übertragung der Implementierung der Schnittstelle.
Der Code dieser Klasse lautet wie folgt:
öffentliche Klassenaktion implementiert Aktion, validierbar, validationAwe, textProvider, localeProvider, serialisierbar {............. public void setActaceErrors (Sammlung errormessages) {validationAware.setActActionErrors (Fehlessagen); } public collection getActActionErrors () {return validationAwe.getActionErrors (); } public void setActionMessages (Sammlungsmeldungen) {validationAware.setactionMessages (Nachrichten); } public collection getActionMessages () {return validationaware.getActionMessages (); } public collection getRrormessages () {return getActaTerrors (); } public map getRrors () {return get fielderrors (); } // Formularfeldüberprüfungsfehler öffentliche void setFielderrors (MAP errormap) {validationAware.setFielderrors (errormap); } public map getfielderrors () {return validationAware.getFielderrors (); } public Locale getlocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("Aktionskontext nicht initialisiert"); null zurückkehren; }} // Methode zum Erhalten internationaler Informationen public String getText (String textName) {return textProvider.getText (textName); } public String getText (String textName, String defaultValue) {return textProvider.GeteText (textName, defaultValue); } public String getText (String textName, String defaultValue, String obj) {return textProvider.getText (textName, defaultValue, obj); } ......... // Methoden zum Zugriff auf internationale Ressourcenpakete public ressourcebundle getTexts () {return textProvider.GeteTexts (); } public ressourcebundle getTexts (String -Häufigkeitsname) {return textProvider.getTexts (Häufigkeitsname); } // Fügen Sie eine Fehlermeldung der Aktion hinzu public void addActActionError (String Anerrormessage) {validationAware.addActionError (Anerrormessage); } // Ordentliche Aktionsinformationen hinzufügen public void AddActionMessage (String Amessage) {validationAware.addactionMessage (Amessage); } public void addFielderror (String FieldName, String errorMessage) {validationAware.addFielderror (FieldName, ErrorRrormessage); } public void validate () {} public Object Clone () löscht ClonenotsupportedException {return Super.clone (); } .........}Wie bereits erwähnt, ist Struts2 nicht direkt mit der Servlet -API gekoppelt. Wie greift es also auf die Servlet -API zu?
Es stellt sich heraus, dass Struts2 eine ActionContext -Klasse bietet, die die Servlet -API simuliert. Die Hauptmethoden sind wie folgt:
1) Objekt GET (Objektschlüssel): Diese Methode simuliert die Methode httpServletRequest.getAttribute (String -Name).
2) MAP getApplication () gibt ein Kartenobjekt zurück, das eine ServletContext -Instanz simuliert.
3) Static ActionContext getContext (): Erhalten Sie die ActionContext -Instanz des Systems.
4) map getSession (): Gibt ein Kartenobjekt zurück, das eine httpSession -Instanz simuliert.
5) MAP getParameters (): Alle Anforderungsparameter abrufen, simuliert httpServletRequest.getParametermap ()
Sie fragen sich vielleicht, warum diese Methoden immer eine Karte zurückgeben? Dies dient hauptsächlich zur einfachen Prüfung. Wie es Kartenobjekte mit tatsächlichen Servlet-API-Instanzen umwandelt, machen wir uns darüber überhaupt keine Sorgen, da Struts2 integrierte Abfangversorgungsstoffe hat uns dabei, diese Konvertierung abzuschließen.
Um die Servlet -API direkt zu verwenden, bietet Struts2 die folgenden Schnittstellen.
1) ServletContextaware: Die Aktion, die diese Schnittstelle implementiert, kann direkt auf die ServletContext -Instanz zugreifen.
2) ServletRequestaware: Die Aktion, die diese Schnittstelle implementiert, kann direkt auf die httpServletRequest -Instanz zugreifen.
3) ServletResponseaware: Die Aktion, die diese Schnittstelle implementiert, kann direkt auf die httpServletResponse -Instanz zugreifen.
Die oben genannten spricht hauptsächlich über Action -Zugangs -Servlets. Schauen wir uns an, wie die Aktion von Struts2 die Wiederverwendung von Code implementiert. Nehmen Sie zum Beispiel die Benutzeraktion. Wenn ich diese Aktion sowohl die Registrierung als auch die Anmeldung (Longin) der Benutzerregistrierung als auch die Anmeldung), wie soll ich diese Aktion neu schreiben? Die umgeschriebene Benutzeraktion ist wie folgt:
Paketbeispiel; Public Class UserAction erweitert actionupport {private String -Benutzername; privates Zeichenfolgenkennwort; public String Registrierung () löst Ausnahme aus {// ………… .. } public String login () löst Ausnahme aus {// ……… .. Erfolg; } public String getUnername () {return userername; } public void setUnername (String -Benutzername) {this.username = userername; } public String getPassword () {Kennwort zurückgeben; } public void setPassword (String -Passwort) {this.password = password; }} Aktionskonfiguration in Struts.xml
Ist es in Ordnung, so zu schreiben? Natürlich funktioniert es nicht. Wir müssen es auch in der Datei struts.xml konfigurieren. Es gibt zwei Konfigurationsmethoden:
1) Verwenden Sie einen normalen Weg, um das Methodenattribut für das Aktionselement anzugeben.
<action name=”loginAction” class=”example.UserAction” method=”login”> <result name=”success”>/success.jsp</result></action><action name=”registAction” class=”example.UserAction” method=”regist”> <result name=”success”>/success.jsp</result></action>
2) Verwenden Sie Wildcards, um das Methodenattribut für das Aktionselement anzugeben.
<action name = ”*action” class = ”Beispiel.UserAction” methode = ”{1}”> <result name = ”Erfolg”>/Erfolg.jsp </result> </action>Die Möglichkeit, Wildcards zu verwenden, ist zu flexibel, und das Folgende ist eine komplexere Konfigurationssituation.
<action name = ”*_*” class = ”Beispiel. {1} action” method = ”{2}”> ………. </action>Wobei der Platzhalter {1} mit der vorherigen * von _ übereinstimmt, und {2} übereinstimmt mit dem nächsten *.
Aktionskonfiguration basierend auf Annotationsmethode:
Die Aktionskonfiguration, über die ich unten sprechen möchte
Struts.xml benötigt jedoch noch spezifische Beispiele
Login.jsp
<%@ page Language = "java" import = "java.util. content = "keyword1, keyword2, keyword3"> <meta http-äquiv = "Beschreibung" content = "Dies ist meine Seite"> <!-<link rel = "styleSheet" type = "text/css" href = "styles.css">-> </head> <h3> stuts2login </h3> <Hr. action = "$ {pageContext.request.contextPath} /User/login.qqi" methode = "post"> <tabelle> <tr> <Td> Benutzername </td> <td> <Eingabe type = "text" name = "loginname"/> </td> </tr> <tr> <tr> <tr> <tr> <Td> Password </td> Pass. name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <Eingabe typ src/struts.xml
<span style = "font-size: groß;"> <xml Version = "1.0" coding = "utf-8"?> <! docType Struts public "-// Apache-Software-Stiftung // dtd struts configuration 2.1.7 // en" Http://stuts.apache.org/dtds/struts/struts-2.7.7.7.7.7.7.7.7.d. Codierungsmethode der Anforderungsparameter-> <Constant Name = "Struts.i18n.Coding" value = "utf-8"/> <! Mehrfach getrennt von commas-> <Constant name = "struts.action.action.extesion" value = "action, do, go, qqi"/> <! Der Standardwert ist falsch (in der Produktionsumgebung verwendet). Es ist am besten, die Entwicklungsphase zu öffnen-> <Constant Name = "Struts.Configuration.xml.Reload" value = "true"/> <!-Ob Sie den Entwicklungsmodus von Streben verwenden möchten. Es wird mehr Debugging -Informationen im Entwicklungsmodell geben. Der Standardwert ist falsch (in der Produktionsumgebung verwendet), und es ist am besten, die Entwicklungsstufe zu öffnen-> <konstant name = "strut.devMode" value = "false"/> <!-Stellen Sie fest, ob der Browser statische Inhalte zwischengespeichert. Der Standardwert ist wahr (in der Produktionsumgebung verwendet), es ist am besten, die Entwicklungsphase zu schließen-> <konstant name = "stolzs.serve.static.browSercache" value = "False" /> <!-Geben Sie an, dass der Frühling für die Erstellung des Aktionsobjekts <konstantes Name = "Struts.objectFactory" Value = "Spring" />-> <! name = "Strutss.Enable.DynamicMethodinVocation" value = "false"/> </struts> </span>
Loginaction.java
Paket com.javacrazyer.web.Action; import org.apache.struts2.Convention.Annotation.Action; import org.apache.struts2.convention.annotation.ExceptionMapping; import org.apache.struts2.convention.annotation.ExceptionMappings; import org.apache.struts2.convention.annotation.namePace; import org.apache.struts2.convention.annotation.Parentpackage; import org.apache.struts2.Convention.annotation.Result; import org.apache.struts2.Convention.annotation.Results; import com.opensymphony.xwork2.actionsupport; /** * Verwenden Sie Annotationen, um die Aktion zu konfigurieren @ExceptionMapping (exception = "java.lange.runtimeexception", result = "error")}) Die LoginAction für öffentliche Klasse erweitert die AktionSverpackung. private String -LoginName; private String PWD; @Action (value = "login") public String login () löst Ausnahme aus {if ("qq" .equals (LoginName) && "123" .Equals (pwd)) {return Erfolg; } else {Rückgabefehler; }} @Action (value = "add", results = {@result (name = "sc PORUCKE, location =" /Index.jsp ")}) public String add () löst Ausnahme aus {return scipp; } public String getLoginName () {return loginName; } public void setLogInname (String loginName) {this.logInname = loginName; } public String getPwd () {return pwd; } public void setpwd (String pwd) {this.pwd = pwd; }}
Ich werde erfolgreich.jsp und error.jsp nicht veröffentlichen
Erläuterung der Annotationskonfiguration
1) @ParentPackage Geben Sie das übergeordnete Paket an
2) @NameSpace Geben Sie den Namespace an
3) @Results eine Reihe von Ergebnissen
4) @Result (name = "Erfolg", location = "/msg.jsp") Eine Zuordnung von Ergebnissen
5) @Action (value = "login") Gibt die Anforderungs -URL für eine Anforderungsverarbeitungsmethode an. Beachten Sie, dass es der Aktionsklasse nicht zur Methode hinzugefügt werden kann.
6) @ExceptionMappings-Array der Ausnahmeerklärung der ersten Ebene
7) @ExceptionMapping Karte Eine Deklarationsausnahme
Da diese Methode nicht sehr häufig verwendet wird, können Sie sie nur verstehen