Obtenir de l'Intercepteur Paramètres dans Struts 2
J'ai de suite à l'action de la cartographie
<action name="theAction" ...>
...
<param name="param1">one</param>
<param name="param2">two</param>
...
<param name="paramN">nth-number</param>
...
</action>
Je peux obtenir le paramètre de la carte en utilisant la ligne suivante dans Intercepteur
Map<String, Object> params = ActionContext.getContext().getParameters();
Comme ci-dessus, est-il possible de l'intercepteur paramètres tels que définis dans la suite de la cartographie.
<action name="theAction" ...>
...
<interceptor-ref name="theInterceptor">
<param name="param1">one</param>
<param name="param2">two</param>
...
<param name="paramN">nth-number</param>
</interceptor-ref>
...
</action>
Et les paramètres de l'action sont définis de la manière suivante, les paramètres de l'action et de l'intercepteur paramètres doivent être accessibles séparément.
<action name="theAction" ...>
...
<param name="param1">one</param>
<param name="param2">two</param>
...
<param name="paramN">nth-number</param>
....
<interceptor-ref name="theInterceptor">
<param name="param1">one</param>
<param name="param2">two</param>
...
<param name="paramN">nth-number</param>
</interceptor-ref>
...
</action>
Veuillez noter que je ne veux pas déclarer les champs de paramètre dans mon intercepteur
//all fields with their getters and setters
private String param1;
private String param2;
...
private String paramN;
Après Dev Effacé de répondre, j'ai mis en place sa technique. Il n'a pas de travail donc je suis le partage de mon code ici. Je suis en utilisant Struts 2.3.1.2.
Bibliothèques
- asm-3.3.jar
- asm-commons-3.3.jar
- asm-tree-3.3.jar
- commons-fileupload-1.2.2.jar
- commons-io-2.0.1.jar
- commons-lang-2.5.jar
- freemarker-2.3.18.jar
- javassist-3.11.0.GA.jar
- ognl-3.0.4.jar
- struts2-core-2.3.1.2.jar
- xwork-core-2.3.1.2.jar
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="the-base" namespace="/" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="header" class="demo.interceptors.HttpHeaderInterceptor"></interceptor>
<interceptor-stack name="theStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="header"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="theStack"></default-interceptor-ref>
</package>
<package name="the-module" extends="the-base">
<action name="theAction">
<result>/the-action.jsp</result>
<interceptor-ref name="theStack">
<param name="header.Cache-control">no-store,no-cache</param>
<param name="header.Pragma">no-cache</param>
<param name="header.Expires">-1</param>
<param name="header.arbitrary">true</param>
</interceptor-ref>
</action>
</package>
</struts>
Intercepteur
package demo.interceptors;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class HttpHeaderInterceptor extends AbstractInterceptor {
private final Map<String, String> interceptorConfigs = new HashMap<String, String>();
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Calling 'intercept' method.");
HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
for(Entry<String, String> entry: interceptorConfigs.entrySet()) {
String header = entry.getKey();
String value = entry.getValue();
System.out.printf("Adding header: %s=%s\n",header,value);
response.setHeader(header, value);
}
return invocation.invoke();
}
public Map<String, String> getInterceptorConfigs() {
System.out.println("calling method 'getInterceptorConfigs'");
return interceptorConfigs;
}
public void addInterceptorConfig(final String configName, final String configValue) {
System.out.printf("Calling method 'addInterceptorConfig' with params configName = %s, configValue=%.\n",configName, configValue);
interceptorConfigs.put(configName, configValue);
}
}
Sortie de la Console quand theAction
est frappé.
Calling 'intercept' method.
Il n'est pas clair ce que vous essayez d'atteindre 😐
Ligios, j'ai édité ma question. Cependant, mon objectif est d'obtenir les paramètres de la carte définie à l'intérieur d'
<interceptor-ref>
de la balise body.M, Merci pour le lien. Mais dans ce cas, n'importe quel nom de paramètre peut être défini dans la configuration.
OriginalL'auteur Bilal Mirza | 2013-05-08
Vous devez vous connecter pour publier un commentaire.
Dans votre personnalisé intercepteur vous pouvez définir une carte ci-dessous
Puis dans votre action mappages vous pouvez passer des paramètres comme ci-dessous .. qui seront stockées dans la carte de l'intercepteur
"yourInterceptor" fait référence au nom de l'intercepteur vous avez donné lors de l'ajout de votre intercepteur à l'struts.xml. Lorsqu'il est configuré comme ci-dessus 'interceptorConfigs' carte à l'intérieur de l'intercepteur aura , des paires clé/valeur.
Si vous souhaitez rendre disponibles pour votre action, vous pouvez simplement mettre la carte en tant que variable de contexte dans le
ActionContext
. Cela peut ensuite être récupérée à l'intérieur de l'action.addInterceptorConfig
et/ougetInterceptorConfigs
ne sont pas appelé lorsque la demande en est faite. Ai-je besoin pour mettre en œuvre une interface?ces méthodes pourraient être appelée lorsque l'application démarre et quand struts.xml est en cours de lecture. Ils ne sont pas être appelée pour chaque demande. Les paramètres que vous spécifiez dans l'action mappages va rester le même pour chaque demande pour cette action spécifique. Struts fera intercepteur instances pour chaque action de la cartographie
name="en-tête.Pragma">no-cache</param> est le mal. Il convient de <param name="en-tête.interceptorConfigs.Pragma">no-cache</param>
Cache-control comme une clé peut ne pas fonctionner avec OGNL en raison de la '-' mais d'autres devraient fonctionner sans problème
addInterceptorConfig
méthode n'est pas nécessaire. Il n'est pas appelée à tous.OriginalL'auteur Dev Blanked
Pour être bref, je dirai pas, vous ne pouvez pas obtenir de l'intercepteur paramètres si vous les avez définies dans la
interceptor-ref
élément. Les paramètres sont définis et appliqués à l'intercepteur pendant la construction. Cependant, si vous mettez les paramètres de lainterceptor
élément commevous pouvez les récupérer à la volée
Si vous ne voulez pas de définir des propriétés sur l'intercepteur pour contenir les valeurs puis OGNL n'aura pas les valeurs, mais elle va essayer, donc je ne vois pas de raisons de ne pas définir ces propriétés, la configuration xml marqué invalide si votre intercepteur bean ne contient pas ces propriétés et le constructeur peut-être jeter une exception dans ce cas. Donc, ne pas définir les propriétés pour params je ne recommande pas.
interceprotConfigs
vide. Comme un résultatinteptorConfig
est déclarée nulle et NullPointerException est levée lors de l'obtention deparams
. J'ai place mon intercepteur à la dernière position dans la pile par défaut. J'ai appariés intercepteur nom de l'intercepteur de code et de configuration (struts.xml). Qu'ai-je manqué?Vous avez à vide parce que vous n'avez pas indiquer le nom du module utilisé pour mapper votre intercepteur. Donc, j'ai besoin de remplacer un nom fictif, de la même manière avec les autres intercepteur nom parce que vous n'avez pas affiché le code pour configurer l'intercepteur je devais le faire. Le nom du package est
"default"
vous avez besoin de le mettre dans lestruts.xml
.J'ai changé le nom de package et intercepteur de nom en fonction de mon code. Je suis
packageConfig
avec la bonne configuration que j'ai défini dansstruts.xml
. Cela signifie fourni nom du package est correct. Je me demande pourquoi je ne reçois pasinterceptorConfigs
.Comme vous l'avez dit, la chose que j'ai essayé n'est pas possible donc je suis de l'accepter comme réponse correcte. Mais j'ai besoin de savoir autre chose que vous avez dit dans votre réponse.
Probablement, vous ne sont pas configurés avec le
interceptors
tag, et le code doit s'exécuter dans leintercept
méthode.OriginalL'auteur Roman C