2009-07-10 14 views
0

Ich habe folgendes Problem in Struts 2.Zugriff auf verschachtelte Elemente in Struts2 mit Foreach-Tag?

Nehmen wir an, ich habe eine Klasse wie dieses

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

und eine Liste der Benutzer auf ValueStack genannt: Benutzer und eine Liste von Benutzer propertiesavailable auch auf ValueStack als: userProps. In diesem Fall wäre userProps {Name, Adresse}.

Jetzt möchte ich über die Benutzer Liste iterieren und dinamycally Zugriff auf ein Benutzereigenschaften über userProps.

Hier ist, wie:

<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> 

Ich weiß nicht, wie # Benutzer # Daten auszuwerten den Wert für # user.name oder # user.address zu erhalten ??.

Vielen Dank.

Antwort

0

Es scheint, dass Struts2 nicht Doppel Auswertung unterstützt ... genau das, was ich versucht habe zu tun.

Aber hier ist meine Problemumgehung!

<% 
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 .. und es funktioniert!

0

Erstens, ist die Zeile in Ihrem Beispiel korrekt? Sollten Sie nicht versuchen:

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

Zweitens, haben Sie versucht mit Parens? Etwas wie:

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

Nach dem OGNL docs könnte es tun, was Sie wollen (ich habe es selbst nicht ausprobiert).

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

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

Wenn das nicht, vielleicht Unterstützung OGNL die indizierte Eigenschaft hilft helfen würde. Siehe den Abschnitt OGNL-Objekt indizierte Eigenschaften am Ende.

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

+0

Dankten für den Vorschlag, aber es funktioniert nicht. –

0

Große, doppelte Bewertung sollte zur Verfügung gestellt worden sein. Wie auch immer, was ich getan habe ist:

Erstellt Methode, die Parameter in Aktion Klasse, Bec Aktion ist in Valustack, können Sie Methoden direkt übergeben Werte, für die Sie doppelte Validierung benötigen.

Und Sie können von überall anrufen ..

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

Die einfachste Lösung ist dies:

Sie müssen ActionSupport wickeln und ein Verfahren, das heißt eval

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

Dann zu implementieren, können Sie tun, was Sie in Ihren jsp fragte

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

Eine andere Möglichkeit ist die Implementierung einer eigenen Tag-Erweiterung ComponentTagSupport, ihm einen Namen in einem tld geben so können Sie es von Ihrem jsp nennen

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

Kommentar des Benutzers ohne Kommentarrechte ([Richard Golebiowski] (http://stackoverflow.com/users/1074426/user1074426)): Ich musste 'eval (#user + '.' + # Prop)' in 'eval ('#user.' + # prop) 'damit diese Antwort funktioniert. – Anne

+0

perfekt, ich ändere es! –