1. Interceptor dans Struts2 (Core Fonction Core)
1. Filtre vs intercepteur
La fonction Filtre VS Interceptor est une chose. Les filtres sont une technologie dans la spécification du servlet qui peut filtrer les demandes et les réponses.
Les intercepteurs sont une technologie dans le cadre Struts2, mettant en œuvre l'idée de programmation AOP (orientée section), qui est enfichable et peut être interceptée avant ou après avoir accédé à une certaine méthode d'action.
Stack d'interceptor: rejoignez les intercepteurs dans une chaîne dans un certain ordre. Lors de l'accès à la méthode d'interceptor, les intercepteurs de la chaîne interceptor Struts2 seront appelés en séquence dans l'ordre qu'ils ont précédemment défini.
Struts2 Principe d'exécution - Analyse sous-jacente
2. Intercepteur personnalisé
Struts2 définit une interface intercepteur d'interface intercepteur.
Il existe trois méthodes abstraites dans l'interface intercepteur
• Init: cette méthode sera appelée immédiatement après la création de l'intercepteur, et elle ne sera appelée qu'une seule fois pendant la durée de vie de l'intercepteur. Les ressources pertinentes peuvent être initialisées dans cette méthode.
• Interecept: cette méthode sera appelée une fois à chaque fois qu'une demande d'action est interceptée.
• Détruiser: cette méthode sera appelée avant que l'intercepteur ne soit détruit, et il ne sera appelé qu'une seule fois pendant le cycle de vie de l'intercepteur.
Struts appellera à son tour la méthode d'interception de chaque intercepteur enregistré par le programmeur pour une action. Chaque fois que la méthode d'interception est appelée, Struts passera une instance de l'interface ActionInvocation.
ActionInvocation: représente l'état d'exécution d'une action donnée. L'intercepteur peut obtenir l'objet d'action et l'objet de résultat associé à l'action de l'objet de cette classe. Après avoir terminé la propre tâche de l'intercepteur, l'intercepteur appellera la méthode invoquée de l'objet ActionInvocation à l'étape suivante du processus de traitement de l'action.
Vous pouvez également appeler la méthode addPreresultListener de l'objet ActionInvocation pour "accrocher" un ou plusieurs écouteurs préresultListener. Cet objet d'écouteur peut faire quelque chose avant de commencer à exécuter le résultat de l'action après l'exécution de l'action.
Étapes d'intercepteur personnalisées:
un. Écrivez une classe pour implémenter l'interface com.opensemphony.xwork2.Interceptor.Interceptor, ou hériter
com.opensymphony.xwork2.interceptor.abstractinterceptor classe. (Mode adaptateur), choisissez généralement d'hériter de l'abstractinterceptor (Interceptor résidera en mémoire). Parce que la classe AbstractInterceptor implémente l'interface intercepteur. Il fournit une implémentation vierge pour init et détruire
Écrivez deux intercepteurs interceptordemo1 et interceptordemo2
package com.itheima.interceptor; import com.openymphony.xwork2.actionInvocation; import com.opensymphony.xwork2.Interceptor.abstractinterceptor; classe publique interceptordemo1 étend une interception abstractInterceptor {// cette méthode est appelée chaque fois String rtValue = invocation.invoke (); // Libération, pourquoi la chaîne revient-elle ici? Parce que le résultat final renvoie le résultat de l'action, et le résultat de l'action est System System.out.out.println ("Intercept Demo1"); retour rtValue; }} package com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; import com.opensymphony.xwork2.interceptor.abstractinterceptor; Importer com.opensymphony.xwork2.Interceptor.preresultRistener; Public Class interceptordemo2 étend la rubrique Abstractorceptor {// Intercept (ActionInvocation Invocation) lève une exception {// invocation.addPreresultListener (new PreresultListener () {// // public void beforeReReReLt (ActionInvocation Invocation, String ResultCode) {// System.out.println ("avant le résultat affiché"); //} //}); System.out.println ("avant l'interception Demo2"); String rtValue = invocation.invoke (); // release System.out.println ("Demo2 intercepté"); retour rtValue; }}né Il doit être défini dans Strut.xml, définir l'intercepteur et le définir avant d'utiliser.
<package name = "p1" étend = "struts-default"> <! - Définition interceptor: uniquement valide pour le package actuel -> <interceptor name = "interceprotdemo1"> </ interceptor> <interceptor name = "interceptor>
c. Il peut être utilisé dans la configuration d'action
<action name = "Action1" method = "exécuter"> <! - Utilisez l'intercepteur défini. Si aucun intercepteur n'est spécifié, tous les intercepteurs de la pile par défaut sont utilisés par défaut; Une fois qu'un intercepteur est spécifié, la valeur par défaut est invalide -> <interceptor-ref name = "interceprotdemo1"> </ interceptor-ref> <interceptor-ref name = "interceprotdemo2"> </ interceptor-ref> <sult> /sucCess.jsp </sult> </ action>
Implémentez la classe d'action Demo1action
package com.itheima.action; import com.opensymphony.xwork2.actionSupport; public class Demo1action étend ActionSupport {@Override public String execute () lève exception {System.out.println ("Execute exécutée"); retourner le succès; }}Résultats en cours d'exécution
Étant donné que les fonctions telles que le téléchargement de fichiers, la vérification des données, les paramètres de la demande d'encapsulation à l'action dans Struts2 sont implémentés par l'intercepteur dans le stack par défaut par défaut du système, l'intercepteur que nous définissons doit se référer à la mise par défaut par défaut du système, afin que l'application puisse utiliser les nombreuses fonctions fournies par le cadre Struts2.
Si aucun intercepteur n'est spécifié, tous les intercepteurs de la pile par défaut sont utilisés par défaut; Une fois qu'un intercepteur est spécifié, la valeur par défaut n'est pas valide. En plus d'utiliser un intercepteur personnalisé, vous devez également utiliser DefaultStack. Tu peux faire ça
Méthode 1: (Utilisé par vous-même), configurez simplement Custom et DefaultStack en action.
Méthode 2: (Lorsque tout le monde l'utilise), si vous souhaitez que toutes les actions sous le package utilisent un intercepteur personnalisé, vous devez utiliser l'intercepteur de pile Interceptor-Stack, définir un intercepteur par défaut, puis dans l'action, vous pouvez définir l'intercepteur comme l'intercepteur par défaut via <default-interceptor-ref name = "MydefaultStack" />, et vous pouvez obtenir le nom de MyDefaultStack par vous-même.
<Interceptors> <interceptor name = "interceprotdemo1"> </ interceptor> <interceptor name = "interceprotdemo2"> </ interceptor> <interceptor-stack name = "mydefaultstack"> <interceptor-ref name = "defaultStack"> </ interceptor-ref> <interceptor-ref name = " name = "interceprotdemo1"> </ interceptor-ref> <interceptor-ref name = "interceprotdemo2"> </ interceptor-ref> </ interceptor-stack> </ interceptor> <action name = "action3" method = "ligin"> <interceptor-ref name = "mydefaultstack"> </ interceptor-ref> <Sult> /success.jsp </ result> </ action>
3. Struts2 de l'intercepteur de Struts2
Cas 1: Vérifiez si l'utilisateur est connecté
1. Écrivez la page Login.jsp
<body> <form action = "$ {pagecontext.request.contextPath} /login.action" Method = "Post"> <input type = "text" name = "username" /> <br/> <input type = "text" name = "mot de passe" /> <br/> <entrée type = "soumis" value = "Logging" /> </ form> </ body>2. Écrivez la classe LoginCheckInterceptor pour la vérification de la connexion
Package com.itheima.interceptor; import javax.servlet.http.httpcession; import org.apache.struts2.servletActionContex invocation) lève l'exception {httpSession session = servletActionContext.getRequest (). Getession (); // Obtenez l'objet Session via l'objet ServLetActionContex User = Session.getAttribute ("User"); if (user == null) {// pas de connexion return "connexion"; // retour à une vue logique} return invocation.invoke (); // release}}3. Écrivez le fichier de configuration struts.xml
<package name = "p2" étend = "struts-default"> <interceptors> <interceptor name = "LoginCheckInterceptor"> </ interceptor> <interceptor-stack name = "MyDefaultStack"> <interceptor-ref name = "defaultstack"> </ interceptor-ref> <interceptor-ref name = "LoginCheckkkkkcker </ interceptor-ref> </ interceptor-stack> </ interceptor-stack> </ interceptors> <action name = "login" metheth = "ligin"> <sult> /login.jsp </ result> </ action> </ package>
4. Écrivez une classe d'action CustomerAction
package com.itheima.action; import org.apache.struts2.servletActionContext; import com.opensymphony.xwork2.actsupport; public class CustoSitAction étend ActionSupport {public String Login () {System.out.println ("login"); ServletActionContext.getRequest (). Getession (). SetAttribute ("utilisateur", "PPP"); retourner le succès; }}Cas 2: Surveillance de l'efficacité d'exécution des méthodes d'action
Écrire TimerInterceptor
package com.itheima.interceptor; import com.opensymphony.xwork2.actionInvocation; import com.opensymphony.xwork2.Interceptor.abstractInterceptor; public class timerinterceptor étend AbstractInterceptor {public String Intercept (ActionInvocation Invocation) lève une exception {long temps = System.NanoTime (); String rtValue = invocation.invoke (); System.out.println (RTValue + "Temps d'exécution:" + (System.NanoTime () - Time) + "Nanoseconde"); retour rtValue; }}Écrire des fichiers de configuration
<package name = "p2" étend = "struts-default"> <interceptors> <interceptor name = "LoginCheckInterceptor"> </ interceptor> <interceptor name = "TimerInterceptor"> </ interceptor> <interceptor-stack name = "MyDefaultStack"> <interceptor-ref name = "DefaultStack"> </ interceptor-ref> name = "LoginCheckInterceptor"> </ interceptor-ref> <interceptor-ref name = "LoginCheckInterceptor"> </ interceptor-ref> <interceptor-ref name = "TimerInterceptor"> </ interceptor-ref> </ interceptor-stack> </ Interceptors> <le résultat = "Login"> / login.jsp </ </ Action> <Result name = "Login"> / Login.jsp </ Résultat> </ Action> Name = "Login"> / Login.jsp </ Result> </ Action> <Result Name = "Login"> / Login.jsp </ Result> </ Action>
Comme on peut le voir à partir de ce qui précède, plusieurs filtres peuvent être configurés dans une seule action.
4. Intercepteur personnalisé: peut spécifier la méthode d'interception ou la méthode de ne pas intercepter
Il peut spécifier la méthode d'interception ou une méthode sans intercepter. Lors de l'écriture d'un filtre, vous pouvez implémenter la classe MethodFilterInterceptor, qui a deux champs. En injectant les paramètres, vous pouvez spécifier ceux sans interception. Un seul des deux paramètres peut être utilisé. Lorsqu'il y a moins d'interceptions, vous pouvez utiliser des méthodes incluses. Lorsqu'il y a plus d'interceptions, vous pouvez utiliser des exclusions.
excluthods = collections.emptyset (); // exclure ceux
includeMethods = Collection.EmptySet (); // incluent ceux
Cas: Continuez l'exemple de vérification de connexion.
1. Écrivez un filtre LoginCheckInterceptor
package com.itheima.interceptor; import javax.servlet.http.httpcession; import org.apache.strutts2.servletActionContext; import com.opencemphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.Interceptor.abstractinterceptor; importer com.opensymphony.xwork2.Interceptor. com.opensymphony.xwork2.Interceptor.MethodFilterInterceptor; la classe publique LoginCheckInterceptor étend MethodFilterInterceptor {String protégé doIntercept (ActionInvocation Invocation) lève une exception {httpSession session = servletActionContext.getRequest (). GetSession (); Objet user = session.getAttribute ("utilisateur"); if (user == null) {// pas de connexion return "connexion"; // retour à une vue logique} return invocation.invoke (); // release}}2. Écrivez des fichiers de configuration
3. Écrivez une classe d'action CustomerAction
package com.itheima.action; import org.apache.struts2.servletActionContext; import com.openymphony.xwork2.actsupport; public class CustoSitAction étend des actions Actionupport {public string add () {System.out.println ("Call add ()" Call add () "); reverse succed;} public edit () {{System.out.Printl (" Service Edit. Méthode "); return Success;} public String Login () {System.out.println (" Login "); servletActionContext.getRequest (). GetSession (). SetAttribute (" User "," PPP "); return Success;}} 4. Écrivez une page
addcustomer.jsp
<body> Ajouter un client </body>
editCustomer.jsp
<body> Modifiez le client </body>
login.jsp
<body> <form action = "$ {pagecontext.request.contextPath} /login.action" Method = "Post"> <input type = "text" name = "username" /> <br/> <input type = "text" name = "mot de passe" /> <br/> <entrée type = "soumis" value = "Logging" /> </ form> </ body>succès.jsp
<body> oyeah </body>
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.