Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用foreach标记访问struts2中的嵌套元素?_Struts2_Nested_Loops - Fatal编程技术网

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

如何使用foreach标记访问struts2中的嵌套元素?,struts2,nested,loops,Struts2,Nested,Loops,Struts 2中有以下问题 让我们假设我有一个这样的类 class User { private String name; private String address; public String getName() { return name;} public String getAddress() { return address;} } 以及ValueStack上可用的用户列表,名为:users 以及ValueStac

Struts 2中有以下问题

让我们假设我有一个这样的类

 class User {
       private String name;
       private String address;
       public String getName() { return name;}
       public String getAddress() { return address;}
    }
以及ValueStack上可用的用户列表,名为:users 以及ValueStack上可用的用户属性列表,如:userProps。 在本例中,userProps将是{name,address}

现在,我想遍历用户列表,并通过userProps日常访问一个用户属性

以下是如何:

 <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.#数据以获得#user.name或#user.address的值


谢谢。

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

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

第二,你试过使用帕伦斯吗?比如:

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

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

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


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>


塔达拉。。而且它有效

太好了,应该提供双重评估。总之,我所做的是:

创建的方法在Action类中接受参数,Bec Action在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..

}

最简单的解决方案是:

您需要包装
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>

没有评论权限的用户评论():我必须将
eval(#user++.++#prop)
更改为
eval(#user.++#prop)
,才能让这个答案起作用。
<myPrefix:eval value="'#user.'+#prop" />