ActionContext
ActionContext est le contexte de l'action, où Struts2 enregistre automatiquement certains objets requis lors de l'exécution de l'action, tels que la session, les paramètres, les paramètres régionaux, etc. Struts2 créera l'actionContext correspondant basé sur chaque thread qui exécute la demande HTTP, c'est-à-dire qu'un thread a un ActionContext unique. Par conséquent, les utilisateurs peuvent utiliser la méthode statique ActionContext.getContext () pour obtenir l'actionContext du thread actuel. C'est précisément pour cette raison que les utilisateurs n'ont pas à s'inquiéter de fabriquer une action de l'action.
Dans tous les cas, ActionContext est utilisé pour stocker des données. Struts2 lui-même mettra beaucoup de données, et les utilisateurs peuvent également mettre les données qu'ils souhaitent. La structure de données de ActionContext elle-même est une structure de mappage, c'est-à-dire une carte, qui utilise une clé pour la valeur de la carte. Ainsi, les utilisateurs peuvent l'utiliser comme l'utilisation de la carte ou utiliser directement la méthode Action.getContextMap () pour fonctionner sur la carte.
Les données placées dans Struts2 lui-même incluent ActionInvocation, l'application (c'est-à-dire ServletContext), ConversionErrors, les paramètres locaux, le nom d'action, les paramètres de demande, la session HTTP et la pile de valeur, etc.
En raison des caractéristiques qui peuvent être obtenues par des méthodes de filetage uniquement et statiques d'actionContext, il peut être obtenu directement dans des classes de non-action sans attendre que l'action soit transmise ou injectée. Il convient de noter qu'il n'est valide que dans les threads créés en raison de la demande (car le Consext Action correspondant est créé lors de la demande), mais n'est pas valide dans les threads démarrés par le serveur (tels que la méthode INIT de Fliter). En raison de la commodité d'y accéder dans des classes de non-action, ActionContext peut également être utilisée pour transmettre des données à JSP dans des classes non-action (car JSP peut également y accéder facilement).
La connexion et la différence entre ValuEstack et ActionContext:
Similitudes: ils sont tous utilisés dans le cadre d'une demande HTTP, c'est-à-dire que leur durée de vie est une demande.
Différences: la pile de valeur est la structure de la pile, et ActionContext est la structure de la carte (carte).
Contact: La carte obtenue par la méthode ValuEstack.getContext () est en fait la carte de ActionContext. En regardant le code source de Struts2, nous pouvons voir (ligne 79 de org.apache.struts2.dispatcher.ng.prepareopérations dans Struts2.3.1.2, méthode de CreateActionContext). Lors de la création d'actionContext, ValuEstack.getContext () est utilisé comme paramètre du constructeur d'actionContext. Ainsi, ValuEstack et ActionContext peuvent essentiellement être obtenus les uns des autres.
Remarque: Dans certains documents, le mot "contexte de la pile" apparaîtra, qui est en fait la valeur enregistrée dans ActionContext. Ainsi, lors de la lecture de ces documents, vous devez voir clairement si la structure de la pile (c'est-à-dire la pile de valeur) est placée ou la structure de mappage (le contexte de la pile de valeur, c'est-à-dire ActionContext).
Comment obtenir ActionContext:
Dans un intercepteur personnalisé: utilisez ActionInvocation.getInvocationContext () ou utilisez ActionContext.getContext ().
Dans la classe d'action: laissez l'intercepteur injecter ou utiliser actionContext.getContext ().
Dans les classes de non-action: Laissez la classe d'action passer les paramètres, injectez en utilisant le mécanisme d'injection ou utilisez ActionContext.getContext (). Remarque: ActionContext.getContext () ne peut être appelé que par le code exécutant dans le thread de demande, sinon NULL est renvoyé.
Dans JSP: Généralement, il n'est pas nécessaire d'obtenir l'actionContext lui-même.
Comment enregistrer une valeur dans un ActionContext:
Dans les classes Java telles que l'interceptor, la classe d'action, la classe de non-action, etc.: Utilisez ActionContext.put (clé d'objet, valeur de l'objet).
Dans jsp: le balise <s: set value = "..." /> stockera la valeur dans ActionContext par défaut (bien sûr, la balise <s: set> peut également stocker la valeur à d'autres endroits). De plus, de nombreuses balises ont des attributs VAR (l'attribut ID a été utilisé avant, mais maintenant l'attribut ID a été obsolète). Cet attribut peut stocker une valeur dans l'actionContext, la clé est la valeur de l'attribut var, et la valeur est la valeur de l'attribut de valeur de la balise. (Certains documents écrivent sur le stockage des valeurs dans le contexte de ValueStack, qui est en fait le même)
Comment lire une valeur à partir d'un ActionContext:
Dans les classes Java telles que l'interceptor, la classe d'action, la classe de non-action, etc .: Utilisez la méthode ActionContext.get (clé d'objet).
Dans JSP: Utilisez une expression OGNL à partir de #, par exemple, la méthode ActionContext.get ("Name") sera appelée. Remarque: Si les attributs d'une certaine balise ne sont pas analysés sous forme d'expressions OGNL par défaut, vous devez utiliser% {} pour enfermer l'expression, et une expression similaire à "% {# name}" apparaîtra. (Voir plus pour "#" ici)
En bref, l'utilisation d'actionContext dans JSP est parce qu'il s'agit d'une structure de mappage, et d'autre part, il peut lire certaines configurations d'action. Lorsque vous devez fournir des valeurs communes pour de nombreuses actions, vous pouvez demander à chaque action de fournir la méthode getXxx (), mais une meilleure façon est de stocker ces valeurs communes dans le modèle d'actionContext dans le modèle intercepteur ou jsp (car l'intercepteur ou le modèle JSP est souvent utilisé pour plusieurs actions).
Quelques exemples:
Code java
// Cette classe démontrera l'opération sur ActionContext dans l'interceptor publicClass MyInterceptor étend AbstractInterceptor {public String Intercept (ActionInvocation invocation) lève Exception {// Get ActionContext ActionContext ActionContext = invocation.getInvocationContext (); // Enregistrer la valeur Person Person = new Person (); actionContext.put ("personne", personne); // Obtenez la valeur de l'objet Value = ActionContext.get ("Person"); Cette // obtient la carte de la demande, c'est-à-dire la valeur exploitée par httpservletRequest.getAttribute (...) et httpservletRequest.setAttribute (...) map requestmap = (map) actionContext.get ("request"); // autres codes // ...... return invocation.invoke (); }} Code java
// Cette classe démontrera l'opération d'actionContext dans l'action publique MyAction étend ActionSUpport {@Override public String EXECUTE () lève exception {// Obtenir la valeur ActionContext ActionContext = ActionContext.getContext (); // Enregistrer la valeur Person Person = new Person (); // Ceci est la classe définie dans l'exemple précédent ActionContext.put ("Person", personne); // Obtenez la valeur objet objet = actionContext.get ("personne"); // Autres codes // ...... Retour succès; }} Code html
<! Doctype html> <html> <éadf> <métahttp-equiv = "contenu-type" contenu = "text / html; charset = utf-8"> <ititle> jsp page </ title> </ head> <1 body> <! - Ce jsp démontrera la correspondance de l'actionConcont -> <! ActionContext a été stocké dans l'actionContext, vous pouvez utiliser "#Person" pour l'obtenir, comme suit -> <s: propriétéValue = "# personne" /> <! - Obtenez l'attribut de nom de la personne, comme suit -> <s: propriétéValue = "# Person.name" /> <! - Obtenez la valeur storée par Struts2 dans ActionContex <s: propriétéValue = "# request" /> <! - Obtenez la valeur stockée par Struts2 dans ActionContext, comme la carte de la session, comme suit -> <s: propriétéValue = "# session" /> <! - Obtenez la valeur stockée par Struts2 dans ActionContext, demandez le Map du paramètre adopté ou paramètre " Enregistrant la valeur dans ActionContext dans jsp -> <! - Enregistrez une chaîne "MyName", la clé est "MyKey", comme suit -> <S: setValue = "% {'myname'}" var = "myKey" /> <! - Utilisez la balise S: Bean pour créer un objet et l'enregistrer dans ActionContex <s: beanname = "com.example.person" var = "myObject" /> <! - Après cela, vous pouvez utiliser "#" pour les lire, comme suit -> <S: PropertyValue = "# myKey" /> <S: PropertyValue = "# myObject" /> </ body> </html> 3. Classe HttpServletRequest ou carte de demande
Struts2 fournit deux opérations sur demande: l'une est la classe HTTPServleRequest fournie par le serveur Web, qui est la même que le fonctionnement des demandes dans les projets Web Java traditionnels; L'autre est une «carte de demande», qui est une classe de mappage qui résume les attributs de HttpServleRequest. Le fonctionnement de la carte est équivalent à l'exploitation des attributs de HttpServLetRequest. La raison pour laquelle la carte est fournie est qu'il est pratique de fonctionner, et l'autre est qu'il peut utiliser OGNL pour lire les demandes dans les balises JSP. Dans tous les cas, ces deux demandes sont interopérables. Quant aux concepts tels que le cycle de vie de la demande, il n'est pas différent des autres projets Web Java, et cet article ne sera pas décrit en détail.
Utilisez la classe HttpServleRequest ou la carte de demande
Bien que les deux soient interopérables, en termes d'attributs de demande de lecture, l'utilisation de cartes de demande est beaucoup plus pratique et n'expose pas d'interfaces inutiles. Bien sûr, HttpServLetRequest a certaines méthodes que la carte de demande n'a pas. Bien sûr, le premier doit être utilisé lors de l'utilisation de ces méthodes.
En utilisant la carte de la demande ou ActionContext:
Les deux sont MAP, et les deux cycles de vie sont une demande.
Dans les projets Web Java traditionnels, la valeur est souvent transmise à JSP via les attributs de la demande: d'abord setAttribute () dans le servlet, puis getAttribute () dans le jsp. Bien sûr, dans le projet Struts2, vous pouvez toujours utiliser cette méthode, mais l'abandon de la fonction de livraison fournie par Struts2 ne vaut pas l'effort. Bien que l'auteur n'ait pas trouvé le document officiel disant que vous devez remplacer la carte de la demande par ActionContext, et n'a pas constaté qu'il y avait une carte dans le programme qui peut obtenir ActionContext mais ne peut pas obtenir la demande, dans le cadre du cadre Struts2, le fonctionnement de l'actionContex est plus pratique que d'exploiter la carte de la demande. Par conséquent, l'auteur recommande: Essayez d'utiliser ActionContext au lieu de la carte de la demande pour passer la valeur.
La carte de la demande contient parfois des valeurs définies par d'autres frameworks, tels que les frameworks Spring. Lorsque vous obtenez ces valeurs, vous devez utiliser la carte de la demande car il n'y a pas dans l'actionContext.
Grâce à ActionContext, vous pouvez obtenir la classe HTTPServletRequest: "HttpServleRequest request = (httpServLequest) actionContext.get (strutsstatics.http_request);".
Vous pouvez également obtenir la carte de la demande via ActionContext: "Map requestmap = (map) actionContext.get (" request ");". Par conséquent, dans la balise JSP, vous pouvez obtenir les données de la carte de la demande en utilisant l'expression "#Request".
Comment obtenir httpservletRequest:
S'il y a déjà un ActionContext, utilisez "ActionContext.get (StrUtsstatics.http_Request)" pour obtenir le httpservletRequest.
Dans un intercepteur personnalisé, obtenez d'abord l'actionContext, puis obtenez-le via l'actionContext.
En action, obtenez d'abord l'actionContext, puis obtenez-le via l'actionContext. Ou laissez l'action implémenter l'interface ServletRequestaware et utiliser l'intercepteur ServletConfigInterceptor, afin que l'intercepteur injecte httpservletRequest.
Dans JSP, vous n'avez généralement pas besoin d'obtenir HttpServLetRequest.
Comment obtenir la carte de la demande:
S'il y a déjà un ActionContext, utilisez "ActionContext.get (" Demande ")" pour obtenir.
Dans un intercepteur personnalisé, obtenez d'abord l'actionContext, puis obtenez-le via l'actionContext.
En action, obtenez d'abord l'actionContext, puis obtenez-le via l'actionContext. Ou laissez Action Implémentez l'interface de demandeware et utilisez l'intercepteur ServletConfigInterceptor, afin que l'intercepteur injecte la demande MAP.
Dans JSP, utilisez "#Request" pour obtenir la carte de la demande et utilisez "# request.key" ou "#request ['key"] "pour lire la valeur dans la carte.
En bref, la demande est toujours conforme aux règles générales des sites Web Java. Cependant, l'auteur recommande aux utilisateurs d'essayer d'éviter d'utiliser des valeurs de demande pour passer.
Quelques exemples:
// Cette classe démontrera le fonctionnement de la carte de httpservletRequest et de la demande dans l'interceptor publicClass MyInterceptor étend AbstractInterceptor {public String Intercept (ActionInvocation Invocation) lève exception {// get actionConTextContext ActionContext = invocation.getInvocationContext (); // Obtenez httpServletRequest httpServletRequest httpServletRequest = (httpServletRequest) actionContext.get (strutsstatics.http_request); // obtient la carte MAP requestmap = (map) actionContext.get ("request"); // créer une classe en tant qu'instance personne personne = new personne (); // Les deux lignes suivantes ont la même fonction httpservletRequest.setAttribute ("personne", personne); requestmap.put ("personne", personne); // autres codes // ...... return invocation.invoke (); }} // Cette classe démontrera le fonctionnement de la carte de HttpServLetRequest et Demande en action (la méthode statique obtient ActionContext) publicClass MyAction étend ActionSupport {@Override public String EXECUTE () lève exception {// obtenir ActionContext ActionContext ActionContext = ActionContext.getContext (); // obtient httpServletRequest httpServletRequest httpServletRequest = (httpservletRequest) actionContext.get (strutsstatics.http_request); // obtient la carte MAP requestmap = (map) actionContext.get ("request"); // créer une classe en tant qu'instance personne personne = new personne (); // Les deux lignes suivantes ont la même fonction httpservletRequest.setAttribute ("personne", personne); requestmap.put ("personne", personne); // Autres codes // ...... Retour succès; }} // Cette classe démontrera l'utilisation de ServLetRequestAware en action pour obtenir httpservletRequest (Remarque: vous devez utiliser ServletConfigInterceptor Interceptor) publicClass MyAction étend ActionSupport implémente ServLetRequestAware {Private HttpservletRequest demande; // Cette méthode est une méthode de l'interface ServLetRequestAware publicVoid setServletRequest (requette httpServletRequest) {this.request = request; } @Override public String execute () lève une exception {// httpServleRequest est prête dans le domaine de cette classe et peut être utilisée directement // ...... RETOUR SUCCÈS; }} // Cette classe démontrera l'utilisation de ServLetRequestAware en action pour obtenir la carte de la demande (Remarque: vous souhaitez utiliser ServletConfigInterceptor Interceptor) publicClass MyAction étend ActionSupport implémente requestAware {map <string, objet> request; // Cette méthode est une méthode de l'interface requestAware publicVoid setRequest (map <string, objet> request) {this.request = request; } @Override public String execute () lève une exception {// La carte de la demande est prête dans le champ de la classe et peut être utilisée directement // ...... return Success; }}<! Doctype html> <html> <éadf> <meta http-equiv = "contenu-type" contenu = "text / html; charset = utf-8"> <ititle> jsp page </ title> </-then> <ebody> <! - Ce jsp démontrera la question de demande de requête dans le msp -> <! La valeur est-elle automatiquement stockée dans l'actionContext par Struts2 (la clé est la demande), alors utilisez "#" pour accéder à l'actionContext et lire la demande de celui-ci -> <s: propriété Value = "# request" /> <! - Les deux lignes suivantes sont la valeur de la clé "Nom" dans la MAP </html>
3. Paramètres, c'est-à-dire les paramètres de la demande de GET ou de la demande de poste
Les paramètres sont des paramètres passés par le navigateur au serveur lors de la demande de get ou de publier. Dans les projets Web Java traditionnels, utilisez des méthodes telles que httpservletRequest.getParamètre () pour obtenir des paramètres, et vous pouvez utiliser directement httpservletRequest.getParameTermap () pour obtenir une carte avec des paramètres encapsulés. Dans Struts2, Struts2 stocke directement la carte ci-dessus dans ActionContext, avec les «paramètres» clés. De plus, ActionContext fournit également directement la méthode ActionContext.getParameters () pour obtenir cette carte. Par conséquent, la méthode de paramètres de fonctionnement dans chaque composant de Struts2 est très similaire à la méthode de fonctionnement de la carte de la demande, et ce paragraphe ne sera pas décrit en détail.
4. Carte de la classe et de la session HttpservletSession
La session dans les projets Web Java traditionnels est entièrement familière et nous l'utilisons pour enregistrer l'état de la session d'un utilisateur. Struts2 résume la HTTPServletSession dans une carte, c'est-à-dire la "carte de session", qui est similaire au traitement de la demande. Cependant, afin d'économiser des ressources système, nous ne créerons pas de sessions lorsque nous n'avons pas besoin de sessions. C'est peut-être à cause de cela que la HttpServletSession n'est pas placée dans l'actionContext dans Struts2. Si votre programme doit utiliser HTTPServletSession, vous devez d'abord obtenir le httpservletRequest, puis utiliser getSession () ou getSession (booléen b) pour l'obtenir et décider si vous devez créer une session. Pour la carte de session, Struts2 le met toujours dans l'actionContext (la clé est "Session"), mais ne vous inquiétez pas, le mécanisme de cette carte ne fait des sessions que lorsque de nouvelles valeurs sont créées. En bref, le fonctionnement de HTTPServletSession dans Struts2 doit d'abord l'obtenir via HttpServletRequest, et le fonctionnement de la carte de session est exactement le même que le fonctionnement de la carte de demande, qui ne sera pas décrit en détail dans ce paragraphe.
5. Carte de ServletContext et application
Dans les projets Web Java traditionnels, ServletContext est utilisé pour stocker des variables globales, et chaque machine virtuelle Java n'a qu'un seul ServletContext par projet Web. Ce ServletContext est créé par un serveur Web pour assurer son caractère unique. ServletContext a certaines méthodes qui peuvent faire fonctionner ses attributs, et ces opérations sont similaires à l'exploitation d'une carte. Ainsi, Struts2 résume à nouveau: il résume les attributs de ServletContext dans une carte, c'est-à-dire la "carte d'application", et la met également dans l'actionContext (la clé est l'application). Par conséquent, si le fonctionnement de la carte d'application se situe à la carte de la demande, ce paragraphe ne sera pas décrit en détail.
Quant à l'opération sur ServletContext, il est similaire à l'opération sur httpservletRequest: Struts2 place le servletContext dans l'actionContext, et ServletConfigInterceptor fournit l'interface d'injection ServletContextAware pour ServletContext. Par conséquent, ce paragraphe ne sera pas décrit en détail.
Remarque: L'utilisation de "#Application" dans les expressions OGNL peut obtenir la carte de l'application, pas le servletContext. Cependant, dans le code Java intégré à JSP (tel que "<% application.getAttribute (" ");%>"), l'application est un servletContext, pas une carte.