如何使用foreach标记访问struts2中的嵌套元素?

时间:2009-07-10 14:34:50

标签: struts2 nested loops

我在Struts 2中遇到以下问题。

我们假设我有一个这样的课程

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

以及ValueStack上可用的用户列表:用户 以及ValueStack上可用的用户属性列表: userProps 。 在这种情况下, userProps 将是{name,address}。

现在,我想迭代用户列表,并通过 userProps 以dinamycally方式访问一个用户属性。

以下是:

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

我不知道如何评估#user。#data以获取#user.name或#user.address的值?

谢谢。

4 个答案:

答案 0 :(得分:0)

首先,您的示例中的行是否正确?你不应该尝试:

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

第二,你试过使用parens吗?类似的东西:

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

根据OGNL文档,它可能会做你想要的(我自己没有尝试过)。

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

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

如果这没有帮助,也许OGNL的索引属性支持会有所帮助。请参阅最后的OGNL对象索引属性部分。

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

答案 1 :(得分:0)

似乎Struts2 不支持双重评估...正是我试图做的。

但这是我的解决方法!

<% 
 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 ..它的确有效!

答案 2 :(得分:0)

应该提供很好的双重评估。无论如何,我做的是:

在Action类中使用params的创建方法,Bec动作在Valustack中,您可以调用直接传递需要双重验证的值的方法。

你可以随时随地打电话..

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

}

答案 3 :(得分:0)

最简单的解决方案是:

您需要打包ActionSupport并实施一种方法,即eval

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

然后,你可以在你的jsp

中做你要求的
<s:iterator value="#users" var="user">
    <s:iterator value="#userProps" var="prop">
       <s:property value="eval('#user.'+#prop)"/>
    </s:iterator>
 </s:iterator>

另一种方法是实现扩展ComponentTagSupport的自己的标记,在 tld 中为其命名,以便您可以从 jsp

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