Dans Struts2, la partie d'action, c'est-à-dire la couche de contrôleur, adopte une méthode d'intrusion faible. Pourquoi le dites-vous? En effet, dans Struts2, la classe d'action n'a pas besoin de hériter de classe de base ou d'implémenter une interface, et elle n'est pas directement associée à l'API Servlet. Il ressemble généralement plus à un POJO normal (doit généralement contenir une méthode d'exécution sans paramètres) et peut définir une série de méthodes (pas de méthodes de paramètre) dans le contenu, et peut être utilisée comme une action indépendante par la configuration, réalisant ainsi la réutilisation du code.
Par exemple:
Exemple de package; Public Class UserAction {Private String Username; mot de passe de chaîne privé; public String execute () lève l'exception {// ……… .. return "Success"; } public String getUserName () {return username; } public void setUsername (String username) {this.userName = username; } public String getPassword () {return mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; }}Servlet d'accès à l'action
Les propriétés de cette classe d'action peuvent encapsuler les paramètres et les résultats de processus. Le système ne les distingue pas strictement.
Cependant, afin de rendre la classe d'action développée par l'utilisateur plus standardisé, Struts2 nous fournit une action d'interface, qui est définie comme suit:
publicInterface Action {publicStaticFinal String error = "error"; PublicStaticFinal String Input = "Input"; PublicStaticFinal String Aucun = "Aucun"; publicStaticFinal String Login = "Login"; publicStaticFinal String Success = "Success"; public String Execute () lève une exception;}Cependant, lorsque nous écrivons de l'action, nous n'implémenons généralement pas l'interface, mais héritons de la classe d'implémentation actions actions de l'interface.
Le code de cette classe est le suivant:
Classe publique ActionSupport implémente l'action, validateable, validationAware, textProvider, localeprovider, sérialisable {............. public void setActionErrors (collection errorMessages) {validationAware.SetActionErrors (errorMessages); } Collection publique getActionError () {return validationAware.getActionErrors (); } public void setActionMessages (messages de collecte) {validationAware.SetActionMessages (messages); } Collection publique getActionMessages () {return validationAware.getActionMessages (); } Collection publique getErrorMessages () {return getActionError (); } Public Map getErrors () {return getFielDerrors (); } // Définir l'erreur de vérification du champ de formulaire public void setFielDerrors (map errormap) {validationware.setFielDerrors (errormap); } public map getFielDerrors () {return validationAware.getFielDerrors (); } public public getlocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("Contexte d'action non initialisé"); retourner null; }} // Méthode pour obtenir des informations internationales publiques String GetText (String AtextName) {return textProvider.getText (AtextName); } public String getText (String AtextName, String defaultValue) {return textProvider.getText (AtextName, defaultValue); } public String getText (String AtextName, String defaultValue, String obj) {return textProvider.getText (AtextName, defaultValue, obj); } ......... // Méthodes utilisées pour accéder aux packages de ressources internationaux publics ResourceBundle getTexts () {return textProvider.getTexts (); } public ResourceBundle GetTexts (String abundLename) {return textProvider.getTexts (abundLename); } // Ajouter un message d'erreur d'action public void addactionError (String anerrorMessage) {validationAware.addactionError (anerrorMessage); } // Ajouter des informations ordinaires de l'action publique void addActionMessage (String AMESSAGE) {ValidationAware.AddactionMessage (AMESSAGE); } public void addFielDerror (String fieldname, string errorMessage) {validationAware.addFielDerror (fieldName, errorMessage); } public void validate () {} public objet clone () lève clonenotsupportedException {return super.clone (); } .........}Comme mentionné précédemment, Struts2 n'est pas directement couplé à l'API Servlet, alors comment accéder à l'API servlet?
Il s'avère que Struts2 fournit une classe ActionContext, qui simule l'API Servlet. Les principales méthodes sont les suivantes:
1.
2) Map GetApplication () Renvoie un objet MAP qui simule une instance ServletContext.
3) Static ActionContext getContext (): Obtenez l'instance ActionContext du système.
4) Map getSession (): Renvoie un objet MAP qui simule une instance httpSession.
5) Map getParameters (): Obtenez tous les paramètres de demande, simulé httpservletRequest.getParameTermap ()
Vous vous demandez peut-être pourquoi ces méthodes renvoient toujours une carte? Il s'agit principalement de faciliter les tests. Quant à la façon dont il convertit les objets MAP avec des instances de l'API de servlet réelles, nous ne nous en préoccupons pas du tout, car Struts2 a des intercepteurs intégrés pour nous aider à terminer cette conversion.
Afin d'utiliser directement l'API Servlet, Struts2 nous fournit les interfaces suivantes.
1) ServletContextAware: L'action qui implémente cette interface peut accéder directement à l'instance ServletContext.
2) ServletRequestAware: l'action qui implémente cette interface peut accéder directement à l'instance httpservletRequest.
3) ServletResponSeaWare: L'action qui implémente cette interface peut accéder directement à l'instance httpservletResponse.
Ce qui précède parle principalement des servlets d'accès à l'action. Jetons un coup d'œil à la façon dont l'action de Struts2 implémente la réutilisation du code. Prenez UserAction par exemple. Si je laisse cette action gérer à la fois l'enregistrement et la connexion des utilisateurs (Longin), comment dois-je réécrire cette action? L'utilisateur réécrit est le suivant:
Exemple de package; public class userAction étend ActionSUpport {Private String Username; mot de passe de chaîne privé; Enregistrement de chaîne publique () lève une exception {// ………… .. Retour succès; } public String Login () lève une exception {// ……… .. Retour succès; } public String getUserName () {return username; } public void setUsername (String username) {this.userName = username; } public String getPassword () {return mot de passe; } public void setPassword (String Motword) {this.password = mot de passe; }} Configuration d'action dans strut.xml
Est-il acceptable d'écrire de cette façon? Bien sûr, cela ne fonctionne pas. Nous devons également le configurer dans le fichier strut.xml. Il existe deux méthodes de configuration:
1) Utilisez un moyen normal de spécifier l'attribut de méthode pour l'élément d'action.
<action name = ”Loginaction” class = ”example.UserAction” Method = ”Login”> <Result name = "Success"> / Success.jsp </ result> </ Action> <Action Name = "RegistAction" class = "Exemple.UserAction" Method = "Regist"> <résultat Name = "Success"> / Success> </sult> </ Action>
2) Utilisez les caractères génériques pour spécifier l'attribut de méthode pour l'élément d'action.
<action name = ”* action” class = ”example.Useraction” méthode = ”{1}”> <result name = ”Success”> / Success.jsp </ result> </ action>La façon d'utiliser les caractères génériques est trop flexible, et ce qui suit est une situation de configuration plus complexe.
<action name = ”* _ *” class = ”Exemple. {1} action” Method = ”{2}”> ………. </ Action>Où l'espace réservé {1} correspond au précédent * de _, et {2} correspond au suivant *.
Configuration d'action basée sur la méthode d'annotation:
La configuration de l'action dont je veux parler ci-dessous n'est pas dans src / struts.xml, mais la condition préalable pour la configurer en utilisant l'annotation est qu'en plus des packages de base de six jar, vous avez également besoin d'une struts-2.1.8.1 / lib / struts2-convention-plagin-2.1.1.1.jar
Cependant, strut.xml a encore besoin d'exemples spécifiques
Login.jsp
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <! Doctype Html public "- // w3c // dtd html 4.01 transitional // en"> <html> Content = "Keyword1, Keyword2, Keyword3"> <meta http-equiv = "Description" content = "Ceci est ma page"> <! - <link rel = "Stylesheet" type = "text / css" href = "styles.css"> -> </ head> <body> <h3> strut2login </h3> <hr />> <hory Action = "$ {pagecontext.request.contextpath} /user/login.qqi" méthode = "post"> <s table name = "pwd" /> </ td> </ tr> <tr> <td Colspan = "2"> <input type = "soumi" value = "login" /> </td> </tr> </ table> </ form> </ body> </html> src / strut.xml
<span style = "font-size: grand;"> <? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Struts public "- // APCACH SOFFALK Foundation // Dtd Struts Configuration 2.1.7 // en" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <! - Méthode d'encodage des paramètres de demande -> <constante name = "strut.i18n.encoding" value = "utf-8" /> <! - Spécifiez le type de suffixe de demande traité par Struts2. Multiples séparés par des virgules -> <constante name = "strut.action.extension" value = "action, do, go, qqi" /> <! - Quand struts.xml est modifié, que ce soit pour recharger. La valeur par défaut est fausse (utilisée dans l'environnement de production), il est préférable d'ouvrir l'étape de développement -> <constante name = "struts.configuration.xml.reload" value = "true" /> <! - If pour utiliser le mode de développement des nettes. Il y aura plus d'informations de débogage dans le modèle de développement. La valeur par défaut est fausse (utilisée dans l'environnement de production), et il est préférable d'ouvrir l'étape de développement -> <constante name = "strut.devmode" value = "false" /> <! - Définissez si le navigateur cache un contenu statique. La valeur par défaut est vraie (utilisée dans l'environnement de production), il est préférable de fermer l'étape de développement -> <constante name = "strut.serve.static.browsercache" value = "false" /> <! - Spécifiez que le printemps est responsable de la création de l'objet d'action <constante name = "struts.objectfactory" value = "printemp name = "struts.enable.damicMethodInvocation" value = "false" /> </ struts> </span>
Loginaction.java
Package 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.namespace; import org.apache.struts2.convention.annotation.parentPackage; import org.apache.struts2.convention.annotation.result; import org.apache.struts2.convention.annotation.results; Importer com.opensymphony.xwork2.actionsupport; / ** * Utilisez des annotations pour configurer l'action * * / @parentpackage ("Struts-default") // package parent @Namespace ("/ user") @Results ({@Result (name = "Success", location = "/msg.jsp"), @Result (name = "error", location = "/rror.jsp")}) @ExceptionAppingsApping "Java.Lange.RuntimeException", result = "Error")}) La classe publique de la classe publique étend ActionSUpport {private static final long SerialVersionUID = -2554018432709689579l; LoginName de chaîne privée; PWD de chaîne privée; @Action (value = "login") public String Login () lève une exception {if ("qq" .equals (loginname) && "123" .equals (pwd)) {return Success; } else {return error; }} @Action (value = "add", résultats = {@Result (name = "Success", Location = "/Index.jsp")}) String public Add () lève une exception {return Success; } 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; }}
Je ne publierai pas Success.jsp et error.jsp
Explication de la configuration d'annotation
1) @parentpackage Spécifiez le package parent
2) @Namespace Spécifiez l'espace de noms
3) @Results un tableau de résultats
4) @Result (name = "Success", location = "/ msg.jsp") Une mappage des résultats
5) @Action (Value = "Login") Spécifie l'URL de demande pour une méthode de traitement de demande. Notez qu'il ne peut pas être ajouté à la classe d'action, à la méthode.
6) @ExceptionMappings Array de la déclaration d'exceptions de premier niveau
7) @ExceptionMapping Map une exception de déclaration
Étant donné que cette méthode n'est pas très courante, vous ne pouvez le comprendre que