2009-07-10 8 views
0

J'ai le problème suivant dans Struts 2.Comment accéder aux éléments imbriqués dans struts2 avec une balise foreach?

Supposons que j'ai une classe comme ce

class User { 
     private String name; 
     private String address; 
     public String getName() { return name;} 
     public String getAddress() { return address;} 
    } 

et une liste d'utilisateurs disponibles sur ValueStack nommé: utilisateurs et une liste des utilisateurs propertiesavailable également sur ValueStack sous: userProps. Dans ce cas userProps serait {nom, adresse}.

Maintenant, je veux itérer sur les utilisateurs liste et accéder à un dinamycally propriétés de l'utilisateur via userProps.

Voici comment:

<s:iterator value="#users" var="user"> 
    <s:iterator value="#userProps" var="prop">  
     **<%--- HOW to get user.name, user.address ???%>** 
     <s:property value="#user.%{#prop}"/> 
    </s:iterator> 
</s:iterator> 

Je ne sais pas comment évaluer les données # utilisateur # pour obtenir la valeur pour # ou # user.name user.address ??.

Merci.

Répondre

0

Il semble que Struts2 ne supporte pas à double évaluation ... juste ce que j'ai essayé de le faire.

Mais voici ma solution de contournement!

<% 
ValueStack vs = ActionContext.getContext.getValueStack(); 
%> 
<s:iterator value="#users" var="user"> 
    <s:iterator value="#userProps" var="prop">  

     <% 
     String userProp =(String) vs.findValue("#prop"); 
     Object userPropVal = vs.findValue("#users."+userProp); 
     vs.getContext().put("userPropValKey", userPropVal); 
     %> 
     <s:property value="#userPropValKey"/> 
    </s:iterator> 
</s:iterator> 

Tadaaa .. et ça marche!

0

Tout d'abord, la ligne de votre exemple est-elle correcte? Ne devriez-vous pas essayer:

<s:property value="#user.%{#prop}"/> 

Deuxièmement, avez-vous essayé d'utiliser parens? Quelque chose comme:

<s:property value="#user.(#prop)"/> 

Selon les docs OGNL il pourrait faire ce que vous voulez (je n'ai pas essayé moi-même).

http://www.opensymphony.com/ognl/html/LanguageGuide/paren.html

http://www.opensymphony.com/ognl/html/LanguageGuide/chainedSubexpressions.html

Si cela ne fonctionne pas, peut-être un soutien de propriété indexée de OGNL aiderait. Voir la section OGNL Object Indexed Properties à la fin.

http://www.opensymphony.com/ognl/html/LanguageGuide/indexing.html

+0

Merci de la suggestion, mais cela ne fonctionne pas. –

0

Très bien, une double évaluation aurait dû être fournie. Quoi qu'il en soit, ce que j'ai fait est:

Méthode créée qui prend des paramètres dans la classe Action, l'action Bec est dans Valustack, vous pouvez appeler des méthodes en passant directement des valeurs pour lesquelles vous avez besoin d'une double validation.

Et vous pouvez appeler de n'importe où ..

public Object findValueFromValueStack(String objectRef,String expression){ 

//get valuStack 
//Get value for expression 
//Then pass the value and scoped object reference to get the final value.. 

} 
0

La solution c'est simple:

Vous devez envelopper ActionSupport et mettre en œuvre une méthode, à savoir eval

public class ActionSupportWrapper extends ActionSupport { 
    ... 
    public Object eval(String name) { 
    return ActionContext.getContext().getValueStack().findValue(name); 
    } 
} 

Ensuite, vous pouvez faire ce que vous avez demandé dans votre jsp

<s:iterator value="#users" var="user"> 
    <s:iterator value="#userProps" var="prop"> 
     <s:property value="eval('#user.'+#prop)"/> 
    </s:iterator> 
</s:iterator> 

Une autre façon est de mettre en œuvre votre propre tag en étendant ComponentTagSupport, lui donnant un nom dans un tld de sorte que vous pouvez appeler à partir de votre jsp

<myPrefix:eval value="'#user.'+#prop" /> 
+1

Commentaire par l'utilisateur sans privilèges de commentaire ([Richard Golebiowski] (http://stackoverflow.com/users/1074426/user1074426)): J'ai dû changer 'eval (#user + '.' + # Prop)' à eval ('#user.' + # prop) 'pour que cette réponse fonctionne. – Anne

+0

parfait, je le change! –

Questions connexes