我们正在使用struts 2.0.14并面临问题设置从JSP到动作类的索引属性。
代码看起来与此类似。
public class MyExample extends ActionSupport
{
private List<Person> persons;
private List<String> names;
public String execute()
{
//persons = myDAO.readPersons(names);
return SUCCESS;
}
public String update()
{
for (Person p : persons)
{
System.out.println(p.getName() + "---" + p.getAddress().getStreet());
}
return SUCCESS;
}
// Getters and setters
}
class Person
{
private Address address;
private String name;
// Getters and setters
}
class Address
{
private String street;
private String number;
// Getters and setters
}
And JSP:
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page language="java" pageEncoding="ISO-8859-1"%>
<!---- Other code ---->
<s:ieterate value="persons" status="status">
<tr>
<s:textfield name="person['%{#status.index}'].name"/>
<s:textfield name="person['%{#status.index}'].address.number"/>
<s:textfield name="person['%{#status.index}'].street"/>
</tr>
我可以在页面上成功显示值,但是当我提交表单时,值不会被填充。 我检查了萤火虫,看看参数是如何发布的,它们就像人['0']。姓名,人物['0']。地址。数字等。请告诉我错误所在。
答案 0 :(得分:2)
你是否试过没有'围绕%{#status.index}?
像这样:
<s:textfield name="person[%{#status.index}].name"/>
答案 1 :(得分:2)
除了删除索引周围的引号 Nate 建议外,我注意到您的字段名为persons
,但您的参数使用的是person
。假设这是一个拼写错误,例如persons[%{#status.index}].name
,请确保:
setPersons(List<Person> person)
,因此可以创建新列表并进行设置。Person
和Address
具有无参数构造函数,因此可以动态自动创建它们。如果它仍无法正常工作,请尝试将@Element
(com.opensymphony.xwork2.util.Element)添加到persons
,以便明确说明要填充的对象类型:
@Element(value=Person)
List<Person> persons;
可能发生的另一件事是你的行动的一个超类可以实现ParameterNameAware,它按名称过滤掉参数。一种快速检查方法是覆盖您的操作中的acceptableParameterName
,看看它是否有效:
@Override
public boolean acceptableParameterName(String name) {
return true;
}
有关详细信息,请参阅ParametersInterceptor的API文档:http://struts.apache.org/2.0.14/struts2-core/apidocs/com/opensymphony/xwork2/interceptor/ParametersInterceptor.html