1. Introduction interceptor
La fonction de l'intercepteur est similaire au filtre dans le fichier web.xml. Il peut intercepter les demandes des utilisateurs et contrôler la page en interceptant les demandes utilisateur. L'intercepteur est configuré dans Struts-core-2.2.3.jar. L'intercepteur d'origine est configuré dans Struts-default.xml, qui scelle la méthode d'utilisation de base de l'intercepteur.
La fonction interceptrice de Struts2 est similaire à un filtre de servlet. Avant que l'action exécute la méthode EXECUTE, Struts2 exécutera d'abord l'interceptor référencé dans struts.xml. S'il y a plusieurs intercepteurs, il sera exécuté par ordre de haut en bas. Après avoir exécuté la méthode d'interceptor de tous les intercepteurs, la méthode d'action d'exécution sera exécutée.
L'intercepteur Struts2 doit implémenter cette interface à partir de com.opensymphoy.xwork2.Interceptor.Interceptor. Les trois méthodes suivantes doivent être mises en œuvre dans l'intercepteur défini:
void destroy (); void init (); String Intercept (ActionInvocation Invocation) lève une exception;
Les intercepteurs personnalisés doivent remplacer les trois méthodes ci-dessus. En outre, le fichier de configuration intercepteur strut.xml de Struts2 hérite du fichier d'origine Struts-default.xml, de sorte que toutes les informations de configuration dans Struts-default.xml seront automatiquement détenues dans le <package> correspondant. Le code spécifique est le suivant:
<package name = "Demo" étend = "struts-default"> ... </ package>
2. Ajouter un intercepteur
Pour utiliser un intercepteur, vous devez être configuré. Struts2 utilise la méthode de mappage, donc si vous souhaitez utiliser une certaine fonction, vous devez être configuré dans le fichier de configuration et l'intercepteur ne fait pas exception. Par conséquent, l'élément intercepteur correspondant doit être ajouté dans le package et l'intercepteur doit être associé au fichier de classe correspondant, de sorte que l'intercepteur correspondant sera exécuté avant l'exécution de l'action. La méthode d'utilisation spécifique est la suivante.
(1) Ajouter le fichier de configuration struts.xml et ajouter un intercepteur au fichier
<package name = "TestLogin" namespace = "/" extends = "struts-default"> <! - Interceptor -> <interceptor name = "myInterceptor"> </ interceptor> </ interceptor> <action name = "démo"> <result name = "error" type = "redirect"> / error.jsp </ résultat> <résultat name = "Success"> / Success. name = "Checkerror"> / Checkssion.jsp </ résultat> <interceptor-ref name = "MyInterceptor"> </ interceptor-ref> <interceptor-ref name = "DefaultStack"> </ interceptor-ref> </ action> </ package>
Dans le package ci-dessus, un intercepteur nommé MyInterceptor a été ajouté, et une classe Java a été enregistrée pour l'intercepteur, qui a été nommé MyInterceptor et a été bloqué dans le package com.interceptor. De plus, une action correspondante a été ajoutée au package. Avant d'exécuter l'action, l'intercepteur MyInterceptor sera d'abord exécuté.
(2) Écrivez la classe d'intercepteur enregistrée MyInterceptor. Cette classe doit implémenter l'interface com.opensymphoy.xwork2.interceptor.interceptor et remplacer la méthode correspondante
package com.interceptor; importation java.util.map; import com.entity.user; Importer com.opensymphony.xwork2.actionContext; import com.opensymphony.xwork2.actionInvocation; Importer com.opensymphony.xwork2.interceptor.interceptor; classe publique MyInterceptor implémente Interceptor {utilisateur privé utilisateur; utilisateur public getuser () {return utilisateur; } public void SetUser (utilisateur utilisateur) {this.user = utilisateur; } @Override public void destrust () {// TODO Méthode générée automatique Stub System.out.println ("---- destrust () ----"); } @Override public void init () {// TODO Méthode générée automatique Stub System.out.println ("------ init () -------"); } @Override public String Intercept (ActionInvocation Invocation) lève une exception {// TODO Méthode générée automatique Stub System.out.println ("-----------"); Map <string, objet> session = invocation.getInvocationContext (). GetSession (); if (session.get ("nom d'utilisateur")! = null) {System.out.println ("Connexion avec succès!"); //Session.put ("Username", user.getUserName ()); retour invocation.invoke (); } else {System.out.println ("Login a échoué!"); retourner "Checkerror"; }}}(3) Après les deux premières étapes, l'intercepteur a été configuré. La dernière partie consiste à utiliser l'intercepteur. Ajoutez la balise correspondante à la page d'affichage et spécifiez la démo nommée Action créée ci-dessus pour la balise. Exécutez ensuite la page pour imprimer le contenu intercepteur correspondant dans la console.
<% @ Page Language = "Java" ContentType = "Text / Html; charSet = UTF-8" Pageencoding = "UTF-8"%> <! Doctype HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // En" "http://www.w3.org/tr/html4/loose" <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="demo"> Username: <input type="text" name="username"><br> Password: <input type="text" name="password"><br> <input type = "soumi" name = "ok" value = "soumi"> </ form> </ body> </html>
Contenu imprimé:
Analyser les résultats de sortie. Dans l'étape de compilation du programme, le fichier de configuration Struts.xml lira d'abord le fichier de configuration struts.xml, et dans l'action du fichier de configuration, recherchez si l'intercepteur a été ajouté. Si un intercepteur est ajouté, découvrez si l'intercepteur ou la pile d'intercepteur est défini dans <Interceptors> selon le nom d'intercepteur. S'il est constaté que l'intercepteur est défini, trouvez la classe enregistrée correspondante en fonction de l'intercepteur et recherchez enfin la classe enregistrée dans le package et exécutez la méthode init () correspondante. Le processus général de l'étape d'exécution du programme est similaire à l'étape de compilation. Une fois que l'utilisateur a soumis une demande au premier plan, il cherchera l'action correspondante dans struts.xml. S'il est trouvé, l'intercepteur sera trouvé. S'il n'est pas trouvé, l'erreur correspondante sera lancée. Enfin, la méthode d'interception de la classe d'enregistrement intercepteur est exécutée.
3. pile d'interceptor
Les intercepteurs ont également le concept de pile. Ils définissent les intercepteurs utilisés à un état partagé pour atteindre une gestion unifiée, afin que les intercepteurs puissent être partagés dans le package, facilitant considérablement l'utilisation des intercepteurs. Les intercepteurs répétés sont souvent utilisés dans un ensemble. Si vous ajoutez Interceptor-Ref à l'action à chaque fois, ce sera très gênant. Ensuite, la pile d'interceptor est générée pour résoudre ce problème. La configuration spécifique est la suivante:
<package name = "TestLogin" namespace = "/" allsends = "Struts-default"> <! - Interceptor -> <interceptor name = "MyInterceptor"> </ interceptor> <! - Définissez une chaîne d'intercepteur public. Dans la balise d'action, seule la chaîne d'interceptor doit être référencée -> <interceptor-stack name = "defaultTstack1"> <interceptor-ref name = "myInterceptor"> </ interceptor-ref> <interceptor-name = </ interceptor type = "redirect"> / error.jsp </ result> <résultat name = "Success"> / Success.jsp </ résultat> <résultat name = "Checkerror"> / chèques.jsp </sult> <interceptor-ref name = "defaultStack1"> </ interceptor-ref> </ action> </backage>
Dans l'exemple, Interceptor-Stack est utilisé pour définir une pile d'interceptor nommée defaultTstack1. L'intercepteur à exécuter est ajouté à la pile, l'intercepteur est encapsulé et la pile d'intercepteur est appelée directement dans l'action, réalisant le partage de la pile d'intercepteur.
4. pile d'interception par défaut
De plus, la pile d'interceptor par défaut peut être définie, c'est-à-dire si aucun intercepteur n'est défini dans une action, il exécutera l'intercepteur public par défaut. Il appartient au même niveau que la balise des intercepteurs et est défini à l'aide de REF-intercepteur par défaut.
<package name = "TestLogin" namespace = "/" allsends = "Struts-default"> <! - Interceptor -> <interceptor name = "MyInterceptor"> </ interceptor> <! - Définissez une chaîne d'intercepteur public. Dans la balise d'action, seule la chaîne d'interceptor doit être référencée -> <interceptor-stack name = "Defaultinter"> <interceptor-ref name = "myInterceptor"> </ interceptor-ref> <default-interceptor-ref name = "defaultinter"> </ default-interceptor-ref> <action name = "Demo"> <result name = "error" type = "redirect"> / error.jsp </ result> <le résultat name = "Success"> / Success.jsp </ result> <le résultat name = "Checkerror"> / chèques.
La pile d'interceptor par défaut définie exécute uniquement la pile d'intercepteur par défaut personnalisée si l'action ne spécifie pas un intercepteur. Si l'intercepteur est redéfini dans l'action, il remplacera la pile d'intercepteur par défaut personnalisée.
5. Pas d'exécution d'interceptor
Il y a une autre situation où un package définit l'intercepteur par défaut, mais aucun intercepteur ne doit être exécuté dans une certaine action écrite. Ensuite, vous pouvez ajouter un intercepteur nommé DefaultStack à l'action correspondante. Il s'agit de l'intercepteur par défaut du système et il n'y aura pas d'opérations.
<package name = "TestLogin" namespace = "/" allsends = "Struts-default"> <! - Interceptor -> <interceptor name = "MyInterceptor"> </ interceptor> <! - Définissez une chaîne d'intercepteur public. Dans la balise d'action, seule la chaîne d'interceptor doit être référencée -> <interceptor-stack name = "Defaultinter"> <interceptor-ref name = "myInterceptor"> </ interceptor-ref> <default-interceptor-ref name = "defaultinter"> </ default-interceptor-ref> <action name = "Demo"> <result name = "error" type = "redirect"> / error.jsp </ result> <result name = "Success"> / Success.jsp </ result> <result name = "checkerror"> / chèques. <interceptor-ref name = "defaultstack"> </ interceptor-ref> </ action> </ package>
6. Méthode d'interception
6.1 Utilisation
L'intercepteur ci-dessus implémente uniquement l'intercepteur interceptant l'action. En fait, l'intercepteur a une fonction très puissante et peut également intercepter la méthode d'action correspondante. La différence entre l'interception de l'action est que si vous voulez intercepter la méthode, vous devez hériter de la classe MethodFilterInterceptor. Cette classe est enfermée dans xwork-core.jar, ce qui prouve une fois de plus que le travail Web est au cœur de Struts2. De plus, il est également nécessaire d'ajouter des attributs correspondants au fichier de configuration pour déterminer la méthode d'interception et la méthode de non-interception. La méthode de configuration spécifique est la suivante:
<package name = "TestLogin" namespace = "/" allsends = "Struts-default"> <! - Interceptor -> <interceptor name = "MyInterceptor"> </ interceptor> <! - Définissez une chaîne d'intercepteur public. Dans la balise d'action, seule la chaîne d'interceptor doit être référencée -> <interceptor-stack name = "Defaultinter"> <interceptor-ref name = "myInterceptor"> </ interceptor-ref> <interceptor-ref name = "defaultstack"> </ interceptor-ref> </ interceptor-stack> </ interceptors> <action name = "Demo"> <rontr name = "error" type = "redirect"> / error.jsp </ result> <result name = "Success"> / Success.jsp </sult> <result name = "checkerror"> / vérification.jsp </ résultat> <result name = "Checkerror"> / chèques être intercepté dans les excluthodes -> <interceptor-ref name = "defaultstack"> <param name = "includeMethods"> Ajoutez le nom de la méthode à intercepter </param> <! - Intercepting Method -> <param name = "ExcludeMethods"> Ajouter le nom de la méthode qui ne nécessite pas d'interception </ param> <!
Code dans la classe qui hérite de la méthode intercepteur correspondante de la classe MethodFilterInterceptor:
package com.interceptor; importation java.util.map; Importer com.opensymphony.xwork2.actionContext; import com.opensymphony.xwork2.actionInvocation; Importer com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; La classe publique inter interro méthodeFilterInterceptor {@Override public String doIntercept (ActionInvocation Invocation) lève l'exception {System.out.println ("- intercept () -"); // Obtenez la carte de session correspondante <string, objet> session = invocation.getInvocationContext (). GetSession (); Map request = (map) actionContext.getContext (). Get ("request"); String username = (string) request.get ("user.username"); if (session.get ("nom d'utilisateur")! = null) {String result = invocation.invoke (); System.out.println ("- end () -"); Résultat de retour; }}}} 6.2 Demo
Examinons un exemple de méthode d'interception et analysons les résultats. L'exemple suivant démontre les résultats de sortie de la méthode d'interception. Dans le cas, une classe de connexion est créée séparément pour ajouter la méthode à exécuter par action; L'INTER CLASS est remplacé dans la méthode Interceptor et sort d'intercepter une certaine méthode dans la console; Le fichier login.jsp est ajouté pour démontrer respectivement l'exécution des trois méthodes.
(1) La définition de l'intercepteur de la méthode dans strut.xml définit un intercepteur nommé Inter dans le package et spécifie les paramètres dans l'intercepteur. Les méthodes incluses sont utilisées pour intercepter la méthode1. Méthode2 Dans les exclusions de méthodes signifie que la méthode Méthodes2 n'est pas interceptée. La configuration spécifique est la suivante:
<! Doctype Struts public "- // Apache Software Foundation // Dtd Struts Configuration 2.0 // en" "http://struts.apache.org/dtds/struts-2.0.dtd"> <truts> <constante name = "strut.action.extension" valuets = "> </ constante> <package nom =" Loggin "étend =" Struts = Def-Def " <interceptor name = "inter"> <param name = "includeMethods"> Method1 </ param> <! - Intercept Method1 Method -> <param name = "ExcludeMethods"> Method2 </ param> </nt interceptor> <interceptor-stack name = "MyInterceptor"> <interceptor-ref name = "inter"> </ interceptor-ref> <interceptor-réf name = "DefaultStack"> </ interceptor-ref> </ interceptor-stack> </ interceptor-stack> </ interceptors> <action name = "liginaction"> <result name = "success"> <jsp </ result> <résultat name = "error"> error.jsp </ result> <le résultat name = "error"> error.jsp </sult> <result name = "annuler" Type = "Error"> Error.jsp </sult> <résultat <interceptor-ref name = "inter"> </ interceptor-ref> <interceptor-ref name = "defaultstack"> </ interceptor-ref> </ action> </ package> </ struts>
(2) Classe de connexion, configurer l'action dans login.jsp et ajouter trois méthodes méthode1-méthode3 à cette classe, respectivement, la méthode1 est interceptée, la méthode2 et la méthode3 ne sont pas interceptées, et enfin nous vérifions le résultat de sortie.
package com.action; Importer com.opensymphony.xwork2.actionsupport; classe publique LoginAction étend ActionSupport {@Override public String EXECUTE () lève exception {if (this.username.equals ("admin") && this.password.equals ("admin")) {return "Success"; } else if (this.username.equals ("annuler") && this.password.equals ("annuler")) {return "annuler"; } else {return "error"; }} public void méthode1 () {System.out.println ("méthode d'exécution: méthode1"); } public void method2 () {System.out.println ("méthode d'exécution: méthode2"); } public void méthode3 () {System.out.println ("Méthode d'exécution: méthode3"); } Nom d'utilisateur de chaîne privée; mot de passe de chaîne privé; public String getUserName () {return this.UserName; } public void setUsername (String username) {this.userName = username; } public String getPassword () {return this.password; } public void setPassword (String Motword) {this.password = mot de passe; }}(3) inter Class, hériter de la classe MethodFilterInterceptor, et est utilisé pour implémenter des méthodes d'interception. Réécrivez la méthode DoIntercept et ajoutez les informations correspondantes pour intercepter à la méthode.
package com.interceptor; Importer java.util.date; importation java.util.map; import com.action.loginaction; Importer com.opensymphony.xwork2.actionContext; import com.opensymphony.xwork2.actionInvocation; Importer com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; La classe publique Inter étend MethodFilterInterceptor {@Override Protected String DoIntercept (ActionInvocation Invocation) lève Exception {// TODO Généralement Méthode Stub System.out.println ("Interceptor Intercepts avant l'action Exécution" + new Date ()); Résultat de la chaîne = invocation.invoke (); // Exécuter la méthode d'action System.out.println ("Interceptor Interceptions After Action Exécution" + new Date ()); Résultat de retour; }}(4) Login.jsp, ajouter trois boutons sur la page JSP, démontrer trois méthodes respectivement et juger l'interception par l'intercepteur de la méthode. Les actions publiées par les trois boutons après clic sont ajoutées dynamiquement dans JavaScript. Cela réalise la méthode d'exécution de différentes actions sous une forme. Bien sûr, il existe d'autres méthodes, qui seront discutées dans le prochain article.
<% @ Page Language = "Java" ContentType = "Text / Html; charSet = UTF-8" Pageencoding = "UTF-8"%> <! Doctype HTML PUBLIC "- // W3C // DTD HTML 4.01 Transitional // En" "http://www.w3.org/tr/html4/loose" <html> <éadfride> <meta http-equiv = "contenu-type" contenu = "text / html; charset = utf-8"> <ititle> title ici </ title> <script type = "text / javascript"> // méthode 1, définissez une instance de la méthode interceptée méthode méthode1 () {var form = document.forms [0]; form.action = "Loginaction! Method1"; form.submit (); } // Méthode 2, ajoutez une méthode qui n'intercepte pas pour le bouton 2 Fonction méthode2 () {var form = document.forms [0]; form.action = "Loginaction! Method2"; form.submit (); } // Méthode 3, ajoutez une méthode qui n'intercepte pas pour le bouton 3 Fonction méthode3 () {var form = document.forms [0]; form.action = "Loginaction! Method3"; form.submit (); } </ script> </ head> <body> <form> nom d'utilisateur: <input type = "text" name = "username"> <br> mot de passe: <input type = "text" name = "mot de passe"> <br> <entrée type = "soumi" name = "ok" value = "bouton1" onclick = "méthode1 ()"> <entrée type = "name =" ok1 "valeur" type = "soumi" name = "ok2" value = "Button3" onClick = "Method3 ()"> </ form> </body> </html> Affichage de la page Une fois la course terminée:
(5) Analyser les résultats en cours d'exécution, cliquer sur les boutons 1, 2 et 3 respectivement et sortir les résultats de la console. Le bouton 1 est la méthode liée1. Cette méthode intercepte dans strut.xml. Si le résultat est correct, le résultat intercepté sera affiché. Les boutons 2 et 3 correspondants ne sortent que les résultats en cours d'exécution car ils ne sont pas interceptés. Ensuite, regardez le diagramme de résultat ci-dessous:
Le diagramme de résultat est exactement le résultat de notre analyse. Le bouton 1 a été intercepté et la méthode DoIntercept dans la classe inter-classe a été exécutée. Les boutons correspondants 2 et 3 des deux n'ont pas été interceptés. En d'autres termes, la méthode1 est placée dans la liste blanche de l'intercepteur de la méthode, et la méthode doit être interceptée lorsqu'elle est exécutée; La méthode2 est placée dans la liste noire de l'intercepteur, et il n'est pas nécessaire d'intercepter la méthode; Method3 ne fait rien.
7. Conclusion
Le contenu de l'intercepteur est résumé ici. L'intercepteur offre des fonctions très puissantes, permettant aux développeurs de contrôler les résultats de sortie à l'exécution, augmentant la flexibilité de la programmation. De plus, n'essayez pas de ne pas vous souvenir de choses théoriques. Vous devez les analyser rationnellement, pratiquer davantage et faire quelques exemples pour avoir une compréhension plus approfondie des résultats de l'analyse.
PS: Description fonctionnelle de l'intercepteur fourni par Struts2 (Xwork)
Intercepteur | nom | illustrer |
Alias intercepteur | alias | Les paramètres de demande sont convertis en différents fichiers de noms entre différentes demandes, et le contenu de la demande reste inchangé |
Intercepteur de chaînage | chaîne | Laissez les propriétés de l'action précédente étant accessibles par l'action suivante et sont maintenant utilisées conjointement avec le résultat du type de chaîne (<Result Type = "chaîne">). |
Cocher l'intercepteur | cocher | Ajout d'un code de traitement automatique à Checkbox, en définissant le contenu de Uncheckbox sur FALSE, tandis que HTML ne soumet pas UNCHECKBOX par défaut. |
Interceptor cookies | Cookies | Utilisez le nom et la valeur configurés pour se référer aux cookies |
Intercepteur d'erreur de conversion | conversionerror | Ajoute une erreur de l'actionContext au champ de propriété de l'action. |
Créer une session interceptor | Création | Créez automatiquement HTTPSession à utiliser pour les services intercepteurs qui nécessitent HTTPSession. |
Intercepteur de débogage | débogage | Fournissez des pages de débogage différentes pour afficher l'état des données internes. |
Exécuter et attendre l'intercepteur | execandwait | Exécutez des mesures en arrière-plan tout en emmenant l'utilisateur à une page d'attente intermédiaire. |
Intercepteur d'exception | Exception | Positionner l'exception sur un écran |
Interceptor de téléchargement de fichiers | Fileupload | Fournir une fonction de téléchargement de fichiers |
I18N Interceptor | i18n | Enregistrez le lieu sélectionné par l'utilisateur |
Interceptor enregistreur | bûcheron | Nom de l'action de sortie |
Intercepteur de magasin de messages | magasin | Stocker ou accéder aux messages, erreurs, erreurs de champ, etc. qui apparaissent dans les classes d'action qui implémentent l'interface ValidationAware. |
Intercepteur conduit au modèle | à l'origine du modèle | Si une classe implémente ModelDriven, placez le résultat obtenu par GetModel dans la pile de valeur. |
Modèle de portée | orienté dans un modèle de portée | Si une action met en œuvre ScopedModelriven, l'intercepteur supprimera le modèle à partir de la portée correspondante et appellera la méthode SetModel de l'action et la mettra à l'intérieur de l'action. |
Paramètres Interceptor | paramètres | Définissez les paramètres de la demande à l'action. |
Préparer l'intercepteur | Préparer | Si Acton s'implémente préparable, l'intercepteur appelle la méthode de préparation de la classe d'action. |
Intercepteur de portée | portée | Moyen facile d'enregistrer l'état d'action en session et en application. |
Intercepteur de configuration du servlet | servletconfig | Fournit des méthodes pour accéder à HttpServletRequest et HttpServletResponse, accédant sous la forme d'une carte. |
Paramètres statiques Interceptor | statique | Définissez le contenu dans <Aram> dans <action> dans l'action correspondante du fichier strut.xml. |
Rôles Interceptor | rôles | Détermine si l'utilisateur a un rôle spécifié JAAS, sinon il ne sera pas exécuté. |
Intercepteur de minuterie | minuteur | Temps d'exécution de l'action de sortie |
Intercepteur de jetons | jeton | Évitez le double-clics à travers le jetons |
Intercepteur de session de jetons | tokencession | Comme l'intercepteur à jetons, cependant, lors du double-clicage, les données demandées sont stockées dans la session |
Intercepteur de validation | Validation | Vérifiez les données soumises à l'aide du contenu défini dans le fichier Action-validation.xml. |
Intercepteur de workflow | flux de travail | L'appel de la méthode Valider Action, et une fois qu'il y a une erreur, il sera déplacé sur l'écran d'entrée. |
Intercepteur de filtre de paramètre | N / A | Supprimer les paramètres inutiles de la liste des paramètres |
Intercepteur de profilage | Profilage | Activer le profil via les paramètres |