Question

J'ai une question concernant la pile de valeurs struts2. Disons que j'ai une classe Action appelée RegisterAction qui a une méthode d'exécution comme suit:

public String execute() {
    ValueStack stack = ActionContext.getContext().getValueStack();
    stack.push(new String("test string"));
    return SUCCESS;
}

Mon struts.xml ressemble à ceci:

<struts>
    <package name="default" extends="struts-default">
        <action name="*Register" method="{1}" class="vaannila.RegisterAction">
            <result name="populate">/register.jsp</result>
            <result name="input">/register.jsp</result>
            <result name="success">/success.jsp</result>
        </action>        
        <action name="*Test" method="{1}" class="vaannila.TestAction">
            <result name="test">/test.jsp</result>
            <result name="success">/success2.jsp</result>
        </action>        
    </package>
</struts>

Ainsi, le contrôle ira à success.jsp après l'exécution de la méthode execute dans cette classe.

Mes questions sont les suivantes:

1) Comment puis-je obtenir cette valeur que j'ai poussée sur la pile dans le success.jsp?

2) Disons que dans <s:submit method="testMethod" /> j'ai un TestAction qui redirige vers une classe d'action appelée TestAction#testMethod. En d’autres termes, à partir de la page d’enregistrement, l’utilisateur clique sur Soumettre et, dans la méthode d’exécution de la RegisterAction#execute, nous poussons la & "Chaîne de test &"; sur la pile. Ensuite, nous allons à <=>. Le <=> possède un bouton d'envoi qui nous dirige vers <=>. Dans <=>, la valeur que j'ai appliquée dans la pile dans <=> est-elle toujours là? Comment puis-je l'avoir? J'ai parcouru le débogueur Eclipse mais je ne vois pas la valeur.

Merci.

Était-ce utile?

La solution

Ok, je l'ai compris.

1) Voici comment j'ai trouvé pour obtenir des objets sur la pile de valeurs afin de pouvoir y accéder depuis un jsp:

Map<String, Object> context = new HashMap<String, Object>();
context.put("key", "some object");
context.put("key2", "another object");
ActionContext.getContext().getValueStack().push(context);

En d’autres termes, nous pouvons placer un HashMap sur la pile de valeurs contenant les objets dont nous avons besoin. Ensuite, dans le fichier JSP, nous pouvons accéder aux valeurs réelles comme ceci:

<s:property value="key" />
<s:property value="key2" />

Il examinera la pile de valeurs et trouvera ces valeurs dans la carte de hachage que nous avons poussée.

2) Une instance de la classe d'action est associée à une seule demande. Ainsi, lorsque nous passons à une autre action et que nous aboutissons ensuite à une autre jsp, les éléments que nous avons insérés dans la pile de valeurs de la première action ne seront pas présents car l'autre action possède sa propre pile de valeurs. référence: http://www.manning-sandbox.com/thread.jspa?messageID = 93045

Vous pouvez vous sentir libre de me corriger si quelque chose ne va pas ou s'il existe des moyens plus intelligents de faire ces choses:).

Merci.

Autres conseils

Struts 2 ajoute votre action au sommet de la pile de valeurs lorsqu’elle est exécutée. Ainsi, la manière habituelle de placer des éléments sur la pile de valeurs consiste à ajouter des accesseurs / ajusteurs pour les valeurs de votre classe Action. Vous utilisez toujours la balise s: property pour accéder aux valeurs.

Un didacticiel CRUD: http: //struts.apache .org / 2.1.6 / docs / crud-demo-i.html

définissez simplement une propriété comme

String string1 = "test string";

dans votre action.

dans jsp vous pouvez accéder directement.

exemple

 <s:property value="string1"/>

imprimera

  

" chaîne de test "

Normalement, comme le dit Nate, vous utiliserez un champ dans votre action, car l’action est toujours sur le ValueStack. Toutefois, cela ne fonctionne pas si vous écrivez du code d'intercepteur, car l'intercepteur disparaîtra au moment où le modèle (JSP / freemarker, etc.) est appelé. Là, vous devez placer une sorte d’objet ressemblant à un haricot Java sur le ValueStack, comme vous le feriez plus haut.

Bonjour, juste pour information

C’est un inconvénient de l’utilisation de getValueStack().getContext() parfois les données n’étaient pas disponibles dans .ftl (les données ne s’affichaient pas dans line2, mais elles arrivaient dans line1). Je ne sais vraiment pas pourquoi. Mais en utilisant .getValueStack().set("resDTO",resDTO);, le problème était résolu (les données étaient remplies pour les deux fonctions).

 ${resDTO.data} //line 1
var selonload='<@s.property value="resDTO.data" escape="false" />'; //line 2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top