我在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的值?
谢谢。
答案 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" />